NetUseEnum (netapi32)
Last changed: -212.4.138.50

.
Summary
NetUseEnum - The NetUseEnum function lists all current connections between the local computer and resources on remote servers.

C# Signature:

[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);

VB Signature:

<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

User-Defined Types:

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

Alternative Managed API:

Do you know one? Please contribute it!

Notes:

use NetApiBufferFree to release the buffer even if NetUseEnum returned an error!

Tips & Tricks:

Please add some!

Sample Code:

// 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);

Documentation
NetUseEnum on MSDN