[DllImport("NetApi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
internal static extern NET_API_STATUS NetUseEnum(
LPWSTR UncServerName,
DWORD Level,
ref IntPtr Buf,
DWORD PreferedMaximumSize,
out int EntriesRead,
out int TotalEntries,
IntPtr resumeHandle);
<DllImport("netapi32.dll", SetLastError:=True)> _
Private Shared Function NetUseEnum( _
<MarshalAs(UnmanagedType.LPWStr)> ByVal UncServerName As String, _
ByVal Level As UInt32, _
ByRef Buf As IntPtr, _
ByVal PreferedMaximumSize As UInt32, _
ByRef EntriesRead As Integer, _
ByRef TotalEntries As Integer, _
ByRef resumeHandle As IntPtr) As NET_API_STATUS
End Function
C#:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
internal struct USE_INFO_2
{
internal LPWSTR ui2_local;
internal LPWSTR ui2_remote;
internal LPWSTR ui2_password;
internal DWORD ui2_status;
internal DWORD ui2_asg_type;
internal DWORD ui2_refcount;
internal DWORD ui2_usecount;
internal LPWSTR ui2_username;
internal LPWSTR ui2_domainname;
}
VB:
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)> Public Structure USE_INFO_2
<MarshalAs(UnmanagedType.LPTStr)> Public ui2_local As String
<MarshalAs(UnmanagedType.LPTStr)> Public ui2_remote As String
<MarshalAs(UnmanagedType.LPTStr)> Public ui2_password As String
Public ui2_status As UInt32
Public ui2_asg_type As UInt32
Public ui2_refcount As UInt32
Public ui2_usecount As UInt32
<MarshalAs(UnmanagedType.LPTStr)> Public ui2_username As String
<MarshalAs(UnmanagedType.LPTStr)> Public ui2_domainname As String
End Structure
see NetUseAdd
Do you know one? Please contribute it!
use NetApiBufferFree to release the buffer even if NetUseEnum returned an error!
Please add some!
C#:
// This code steps through the returned buffer of NetUseEnum and Marshals the buffer member to the structure
IntPtr lBuffer=IntPtr.Zero;
int lRead;
int lTotal;
IntPtr lHandle=IntPtr.Zero;
NetUseEnum(null,2,ref lBuffer,0xffffffff,out lRead,out lTotal,lHandle);
// now step through all network shares and check if we have already a connection to the server
int li=0;
USE_INFO_2 lInfo;
while(li<lRead)
{
lInfo=(USE_INFO_2)Marshal.PtrToStructure(new IntPtr(lBuffer.ToInt32()+(Marshal.SizeOf(typeof(USE_INFO_2))*li)),typeof(USE_INFO_2));
if (lInfo.ui2_remote.StartsWith(lUNCPath))
{
lBack=true;
break;
}
++li;
}
NetApiBufferFree(lBuffer);
VB:
Public Shared Function ReadNetworkConns() As USE_INFO_2()
Dim lBuffer As IntPtr = IntPtr.Zero
Dim lRead As Integer
Dim lTotal As Integer
Dim lHandle As IntPtr = IntPtr.Zero
NetUseEnum(Nothing, 2, lBuffer, UInt32.MaxValue, lRead, lTotal, lHandle)
Dim Conns(lRead - 1) As USE_INFO_2
For i As Integer = 0 To lRead - 1
Dim RawPos As IntPtr = lBuffer.ToInt32() + (Marshal.SizeOf(GetType(USE_INFO_2)) * i)
Conns(i) = Marshal.PtrToStructure(lBuffer, GetType(USE_INFO_2))
Next
Return Conns
End Function