Mapping Network Drive using C#

By | June 28, 2010

Lately I was tasked to do a lot of Environment Management on user login which is in Systems or Network Admin terms are called login scripts, but I am not a Systems nor a Network Admin but a developer by heart so I like things a bit more organized when I do my coding.  I am not saying that there is something wrong with Powershell, VB Scripts, Batch Files or Command Files I just like my stuff organized so I prefer to do it under a .Net Environment simply because:

  1. I can have versioning control. (You can do this as well with txt but with Visual Studio it is integrated)
  2. It can be developed in a team environment.
  3. Codes are compiled so no Admins can just fiddle around with it.
  4. Intellisense!!!
  5. And its easier for me.
  6. Debugging is easier, I dont have to MsgBox everytime 🙂

It may not be as fast as developing a normal script but way much organized, just imagine you have 30+ batch files that have dependencies with each ottherwith at least 1000 lines of codes, imagine managing it.


Now one of those task that I am talking about is mapping of network drives that depends on which AD Groups you are joined in.  So I saved my variables in SQL and extract those on runtime, managing the varaibales is also easy if its in SQL (you can just create an interface to do this).  To map the drives I had used the Windows Networking Functions of which in this post I had used 2 functions which are WNetAddConnection2 and WNetCancelConnection2.

The WNetAddConnection2 function makes a connection to a network resource and the WNetCancelConnection2 function cancels an existing network connection.  Its really simple to do this and here are the codes.

public class DriveSettings
{
private enum ResourceScope
{
 RESOURCE_CONNECTED = 1,
 RESOURCE_GLOBALNET,
 RESOURCE_REMEMBERED,
 RESOURCE_RECENT,
 RESOURCE_CONTEXT
}
private enum ResourceType
{
 RESOURCETYPE_ANY,
 RESOURCETYPE_DISK,
 RESOURCETYPE_PRINT,
 RESOURCETYPE_RESERVED
}
private enum ResourceUsage
{
 RESOURCEUSAGE_CONNECTABLE = 0x00000001,
 RESOURCEUSAGE_CONTAINER = 0x00000002,
 RESOURCEUSAGE_NOLOCALDEVICE = 0x00000004,
 RESOURCEUSAGE_SIBLING = 0x00000008,
 RESOURCEUSAGE_ATTACHED = 0x00000010
}
private 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 struct NETRESOURCE
{
 public ResourceScope oResourceScope;
 public ResourceType oResourceType;
 public ResourceDisplayType oDisplayType;
 public ResourceUsage oResourceUsage;
 public string sLocalName;
 public string sRemoteName;
 public string sComments;
 public string sProvider;
}
[DllImport("mpr.dll")]
private static extern int WNetAddConnection2(ref NETRESOURCE oNetworkResource, string sPassword, string sUserName, int iFlags);

[DllImport("mpr.dll")]
private static extern int WNetCancelConnection2(string sLocalName, uint iFlags, int iForce);

public static void MapNetworkDrive(string sDriveLetter, string sNetworkPath)
{
 //Checks if the last character is  as this causes error on mapping a drive.
 if (sNetworkPath.Substring(sNetworkPath.Length - 1, 1) == @"")
 {
 sNetworkPath = sNetworkPath.Substring(0, sNetworkPath.Length - 1);
 }

 NETRESOURCE oNetworkResource = new NETRESOURCE();
 oNetworkResource.oResourceType = ResourceType.RESOURCETYPE_DISK;
 oNetworkResource.sLocalName = sDriveLetter + ":";
 oNetworkResource.sRemoteName = sNetworkPath;

 //If Drive is already mapped disconnect the current mapping before adding the new mapping
 if (IsDriveMapped(sDriveLetter))
 {
 DisconnectNetworkDrive(sDriveLetter, true);
 }

 WNetAddConnection2(ref oNetworkResource, null, null, 0);

}

public static int DisconnectNetworkDrive(string sDriveLetter, bool bForceDisconnect)
{
 if (bForceDisconnect)
 {
 return WNetCancelConnection2(sDriveLetter + ":", 0, 1);
 }
 else
 {
 return WNetCancelConnection2(sDriveLetter + ":", 0, 0);
 }
}

public static bool IsDriveMapped(string sDriveLetter)
{
 string[] DriveList = Environment.GetLogicalDrives();
 for (int i = 0; i < DriveList.Length; i++)
 {
 if (sDriveLetter + ":\" == DriveList[i].ToString())
 {
 return true;
 }
 }
 return false;
}

}


3 thoughts on “Mapping Network Drive using C#

  1. Harry Vince

    You have shared very useful information on Network Mapping. I got to learn a lot about it. Thanks for sharing this..

    Reply
  2. John Dinnen

    Is it possible to declare if the drive you are mapping is persistent?

    Reply

Leave a Reply