WNetAddConnection2 (mpr)
Last changed: -78.237.25.102

.
Summary
The WNetAddConnection2 function makes a connection to a network resource. The function can redirect a local device to the network resource.

The WNetAddConnection2 function supersedes the WNetAddConnection function. If you can pass a handle to a window that the provider of network resources can use as an owner window for dialog boxes, call the WNetAddConnection3 function instead.

C# Signatures:

// This must be used if NETRESOURCE is defined as a struct
[DllImport("mpr.dll")]    
public static extern int WNetAddConnection2(ref NETRESOURCE netResource,
   string password, string username, uint flags);

// This must be used if NETRESOURCE is defined as a class
[DllImport("mpr.dll")]    
public static extern int WNetAddConnection2(NETRESOURCE netResource,
   string password, string username, uint flags);

// by cozmo, it only worked for me this way; .NET 1.1, 11.01.2006
// dont know, what [In] means (some CAST ?), found it in microsoft.public.de.german.entwickler.dotnet.csharp
// my NETRESOURCE is defined as:
// [StructLayout(LayoutKind.Sequential)]
//    class NETRESOURCE
//    {    
//        public int dwScope;
//        etc...
//    }

  //by DaManu

  //
  //      public enum ResourceScope
  //      {
  //      RESOURCE_CONNECTED = 1,
  //      RESOURCE_GLOBALNET,
  //      RESOURCE_REMEMBERED,
  //      RESOURCE_RECENT,
  //      RESOURCE_CONTEXT
  //      };

  //      public enum ResourceType
  //      {
  //      RESOURCETYPE_ANY    = 0,
  //      RESOURCETYPE_DISK       = 1,
  //      RESOURCETYPE_PRINT      = 2,
  //      RESOURCETYPE_RESERVED   = 8,
  //      RESOURCETYPE_UNKNOWN    = -1,
  //      };

  //      public enum ResourceUsage
  //      {
  //      RESOURCEUSAGE_CONNECTABLE = 0x00000001,
  //      RESOURCEUSAGE_CONTAINER = 0x00000002,
  //      RESOURCEUSAGE_NOLOCALDEVICE = 0x00000004,
  //      RESOURCEUSAGE_SIBLING = 0x00000008,
  //      RESOURCEUSAGE_ATTACHED = 0x00000010,
  //      RESOURCEUSAGE_ALL = (RESOURCEUSAGE_CONNECTABLE | RESOURCEUSAGE_CONTAINER | RESOURCEUSAGE_ATTACHED),
  //      };

  //      public enum ResourceDisplayType
  //      {
  //      RESOURCEDISPLAYTYPE_GENERIC,
  //      RESOURCEDISPLAYTYPE_DOMAIN,
  //      RESOURCEDISPLAYTYPE_SERVER,
  //      RESOURCEDISPLAYTYPE_SHARE,
  //      RESOURCEDISPLAYTYPE_FILE,
  //      RESOURCEDISPLAYTYPE_GROUP,
  //      RESOURCEDISPLAYTYPE_NETWORK,
  //      RESOURCEDISPLAYTYPE_ROOT,
  //      RESOURCEDISPLAYTYPE_SHAREADMIN,
  //      RESOURCEDISPLAYTYPE_DIRECTORY,
  //      RESOURCEDISPLAYTYPE_TREE,
  //      RESOURCEDISPLAYTYPE_NDSCONTAINER
  //      };

  //      [StructLayout(LayoutKind.Sequential)]
  //      private class NETRESOURCE
  //      {
  //      public ResourceScope dwScope = 0;
  //      public ResourceType dwType = 0;
  //      public ResourceDisplayType dwDisplayType = 0;
  //      public ResourceUsage dwUsage = 0;
  //      public string lpLocalName = null;
  //      public string lpRemoteName = null;
  //      public string lpComment = null;
  //      public string lpProvider = null;
  //      };

  //
  //    [DllImport("Mpr.dll", EntryPoint="WNetAddConnection2", CallingConvention=CallingConvention.Winapi)]
  //      private static extern ErrorCodes WNetAddConnection2(NETRESOURCE lpNetResource,ref string lpPassword,ref
  //                              string lpUsername, System.UInt32 dwFlags );

[DllImport("mpr.dll")]    
public static extern int WNetAddConnection2( [In] NETRESOURCE netResource,
   string password, string username, int flags);

VB Signatures:

' This must be used if NETRESOURCE is defined as a struct
Declare Function WNetAddConnection2 Lib "mpr.dll" (ByRef netResource As _
   NETRESOURCE, password As String, Username As String, Flag As Integer) As Integer

' This must be used if NETRESOURCE is defined as a class
Declare Function WNetAddConnection2 Lib "mpr.dll" (netResource As _
   NETRESOURCE, password As String, Username As String, Flag As Integer) As Integer

User-Defined Types:

NETRESOURCE

Notes:

C# Import by Ducky.

C# Sample by Ducky

C# Sample Modified by honglinlee

Tips & Tricks:

Don't forget to add a using for the namespace before referencing the DllImport attribute:

  using System.Runtime.InteropServices;

Sample Code:

C# Sample

NETRESOURCE myNetResource = new NETRESOURCE();        
myNetResource.dwScope = 2;                    
myNetResource.dwType = 1 ;                    
myNetResource.dwDisplayType = 3;            
myNetResource.dwUsage = 1;            
myNetResource.LocalName = "z:";        
myNetResource.RemoteName = @"\servername\sharename";        
myNetResource.Provider = null;        

// int ret = WNetAddConnection2( myNetResource, "username", "password", 0);

int ret = WNetAddConnection2( myNetResource, "password", "username", 0); //by honglinlee

/*
  * if username = null the function uses the default user name
  *    (The user context for the process provides the default user name)
  * if password = null the function uses the current default password
  *    associated with the user specified by the username parameter
  * if password = "" the function does not use a password
  */

C# Sample 2

  public class NetworkConnection : IDisposable
  {
    string _networkName;

    public NetworkConnection(string networkName,
    NetworkCredential credentials)
    {
    _networkName = networkName;

    var netResource = new NetResource()
    {
        Scope = ResourceScope.GlobalNetwork,
        ResourceType = ResourceType.Disk,
        DisplayType = ResourceDisplaytype.Share,
        RemoteName = networkName
    };

    var result = WNetAddConnection2(
        netResource,
        credentials.Password,
        credentials.UserName,
        0);

    if (result != 0)
    {
        throw new IOException("Error connecting to remote share",
        result);
    }  
    }

    ~NetworkConnection()
    {
    Dispose(false);
    }

    public void Dispose()
    {
    Dispose(true);
    GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
    WNetCancelConnection2(_networkName, 0, true);
    }

    [DllImport("mpr.dll")]
    private static extern int WNetAddConnection2(NetResource netResource,
    string password, string username, int flags);

    [DllImport("mpr.dll")]
    private static extern int WNetCancelConnection2(string name, int flags,
    bool force);
  }

[StructLayout(LayoutKind.Sequential)]

public class NetResource

{

    public ResourceScope Scope;
    public ResourceType ResourceType;
    public ResourceDisplaytype DisplayType;
    public int Usage;
    public string LocalName;
    public string RemoteName;
    public string Comment;
    public string Provider;

}

public enum ResourceScope : int

{

    Connected = 1,
    GlobalNetwork,
    Remembered,
    Recent,
    Context

};

public enum ResourceType : int

{

    Any = 0,
    Disk = 1,
    Print = 2,
    Reserved = 8,

}

public enum ResourceDisplaytype : int

{

    Generic = 0x0,
    Domain = 0x01,
    Server = 0x02,
    Share = 0x03,
    File = 0x04,
    Group = 0x05,
    Network = 0x06,
    Root = 0x07,
    Shareadmin = 0x08,
    Directory = 0x09,
    Tree = 0x0a,
    Ndscontainer = 0x0b

}

C# Sample 3. Complete Sample, Copy/Paste into code type of sample.

//start copy/paste
using System.Runtime.InteropServices;

namespace Utilities.Network
{  
    public class NetworkDrive
    {
    public enum ResourceScope
    {
        RESOURCE_CONNECTED = 1,
        RESOURCE_GLOBALNET,
        RESOURCE_REMEMBERED,
        RESOURCE_RECENT,
        RESOURCE_CONTEXT
    }

    public enum ResourceType
    {
        RESOURCETYPE_ANY,
        RESOURCETYPE_DISK,
        RESOURCETYPE_PRINT,
        RESOURCETYPE_RESERVED
    }

    public enum ResourceUsage
    {
        RESOURCEUSAGE_CONNECTABLE = 0x00000001,
        RESOURCEUSAGE_CONTAINER = 0x00000002,
        RESOURCEUSAGE_NOLOCALDEVICE = 0x00000004,
        RESOURCEUSAGE_SIBLING = 0x00000008,
        RESOURCEUSAGE_ATTACHED = 0x00000010,
        RESOURCEUSAGE_ALL = (RESOURCEUSAGE_CONNECTABLE | RESOURCEUSAGE_CONTAINER | RESOURCEUSAGE_ATTACHED),
    }

    public enum ResourceDisplayType
    {
        RESOURCEDISPLAYTYPE_GENERIC,
        RESOURCEDISPLAYTYPE_DOMAIN,
        RESOURCEDISPLAYTYPE_SERVER,
        RESOURCEDISPLAYTYPE_SHARE,
        RESOURCEDISPLAYTYPE_FILE,
        RESOURCEDISPLAYTYPE_GROUP,
        RESOURCEDISPLAYTYPE_NETWORK,
        RESOURCEDISPLAYTYPE_ROOT,
        RESOURCEDISPLAYTYPE_SHAREADMIN,
        RESOURCEDISPLAYTYPE_DIRECTORY,
        RESOURCEDISPLAYTYPE_TREE,
        RESOURCEDISPLAYTYPE_NDSCONTAINER
    }

    [StructLayout(LayoutKind.Sequential)]
    private class NETRESOURCE
    {
        public ResourceScope dwScope = 0;
        public ResourceType dwType = 0;
        public ResourceDisplayType dwDisplayType = 0;
        public ResourceUsage dwUsage = 0;
        public string lpLocalName = null;
        public string lpRemoteName = null;
        public string lpComment = null;
        public string lpProvider = null;
    }

    [DllImport("mpr.dll")]
    private static extern int WNetAddConnection2(NETRESOURCE lpNetResource, string lpPassword, string lpUsername, int dwFlags);

    public int MapNetworkDrive(string unc, string drive, string user, string password)
    {
        NETRESOURCE myNetResource = new NETRESOURCE();
        myNetResource.lpLocalName = drive;
        myNetResource.lpRemoteName = unc;
        myNetResource.lpProvider = null;
        int result = WNetAddConnection2(myNetResource, password, user, 0);
        return result;
    }
    }
}
//end copy/paste

Implimentation of C# Sample 3

Utilities.Network.NetworkDrive nd = new Utilities.Network.NetworkDrive();
if( nd.MapNetworkDrive(@"\\servername\shardrive","Z:",null,null) == 0 )
{
      Console.WriteLine("Mapped!");
}
else
{
    Console.WriteLine("Failed!");
}

end of C# sample 3

vb.net Sample

This is a function which connects to a share. Will throw a message box with any errors.

Example connect code:

ConnectDrive("\\server\share", "s:", "username", "password")

Public Function ConnectDrive(ByVal RemoteName As String, ByVal LocalName As String, Optional ByVal username As String = Nothing, Optional ByVal password As String = Nothing)
    Dim myResource As NETRESOURCE
    myResource.dwScope = 2
    myResource.dwType = 1
    myResource.dwDisplayType = 3
    myResource.LocalName = LocalName
    myResource.RemoteName = RemoteName
    myResource.dwUsage = Nothing
    myResource.Comment = Nothing
    myResource.Provider = Nothing
    Dim returnValue As Integer
    returnValue = WNetAddConnection2(myResource, password, username, 0)
    If returnValue <> 0 Then
        Dim errorM = New System.ComponentModel.Win32Exception(returnValue).Message
        MsgBox("Could not connect to " & myResource.RemoteName & ". The server said this: " & vbNewLine & vbNewLine & "(Error " & returnValue & ") " & errorM)
    End If

    Return returnValue
End Function

Alternative Managed API:

TODO

Documentation