title: Map network drive programmatically in C# on Windows 10
body: <p>I followed the approache to map a network drive programmatically in the following link:
  <a href="https://www.codeproject.com/Articles/90143/Mapping-Network-Drive-using-C" rel="noreferrer">Mapping Network Drive using C#</a></p>
  
  <p>The drive seems to be connected correctly because I can query directories and files within C#. BUT I do not see the drive on my computer.
  My target is to map certain drives programmatically for my users.
  I don'T want to use batch/cmd...
  Is there maybe a problem with windows 10 or is this code just good for programming approaches.</p>
  
  <p>Kind Regards</p>
  
  <p>Use of code:</p>
  
  <pre><code>Utility.NetworkDrive.MapNetworkDrive("R", @"\\unc\path");
  var dirs = Directory.GetDirectories("R:"); // got many nice directories...
  Utility.NetworkDrive.DisconnectNetworkDrive("R", true);
  </code></pre>
  
  <p>Full Code:</p>
  
  <pre><code>namespace Utility
  {
      public class NetworkDrive
      {
          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()
              {
                  oResourceType = ResourceType.RESOURCETYPE_DISK,
                  sLocalName = sDriveLetter + ":",
                  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 &lt; DriveList.Length; i++)
              {
                  if (sDriveLetter + ":\\" == DriveList[i].ToString())
                  {
                      return true;
                  }
              }
              return false;
          }
  
      }
  
  }
  </code></pre>