2017-04-02 15 views
0

のWindows 10上で、私は次のリンクでプログラム、ネットワークドライブをマップするためにapproacheを追っ:私はC#の内のディレクトリとファイルを照会することができるので、 enter link description hereネットワークドライブの割り当てをプログラムC#で

ドライブが正しく接続されているようです。しかし、私のコンピュータにはドライブが表示されません。 私の目標は、特定のドライブをユーザーのためにプログラムでマップすることです。 バッチ/ cmdを使用したくありません。 Windows 10に問題があるのでしょうか、このコードはプログラミングのアプローチに適していますか?コードの

種類よろしく

用途:

Utility.NetworkDrive.MapNetworkDrive("R", @"\\unc\path"); 
var dirs = Directory.GetDirectories("R:"); // got many nice directories... 
Utility.NetworkDrive.DisconnectNetworkDrive("R", true); 

全コード:

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 < DriveList.Length; i++) 
      { 
       if (sDriveLetter + ":\\" == DriveList[i].ToString()) 
       { 
        return true; 
       } 
      } 
      return false; 
     } 

    } 

} 
+0

これはどのようなプロセスから実行していますか? – Quietust

+0

VSデバッグモードで試して、コンパイルされたexeも起動しました。すべてログインしたユーザーアカウントの下にあります。 – Mario

+1

これらの行に沿って何か試しましたか? https://channel9.msdn.com/Forums/TechOff/242590-The-best-way-to-effect-quotnet-usequot-from-C – Forty3

答えて

1

私のラップトップを休止はすべての問題のウィンドウが持っていたものを修正するように見えました。 以下の3つのアプローチはいずれも魅力的です。私の好きなものは、もちろんC#の「唯一の」アプローチです。

 // Approach 1 
     Utility.NetworkDrive.MapNetworkDrive("R", @"\\unc\path"); 
     var dirs1 = Directory.GetDirectories("R:"); 
     Utility.NetworkDrive.DisconnectNetworkDrive("R", true); 

     // Approach 2 
     DoProcess("net", @"use R: \\unc\path"); 
     var dirs2 = Directory.GetDirectories("R:"); 
     DoProcess("net", "use /D R:"); 

     // Approach 3 
     DoProcess("cmd", @"/c C:\local\path\to\batch\connect.cmd"); 
     var dirs3 = Directory.GetDirectories("R:"); 
     DoProcess("cmd", @"/c C:\local\path\to\batch\diconnect.cmd"); 

    public static string DoProcess(string cmd, string argv) 
    { 

     Process p = new Process(); 
     p.StartInfo.UseShellExecute = false; 
     p.StartInfo.RedirectStandardOutput = true; 
     p.StartInfo.FileName = cmd; 
     p.StartInfo.Arguments = $" {argv}"; 
     p.StartInfo.CreateNoWindow = true; 
     p.Start(); 
     p.WaitForExit(); 
     string output = p.StandardOutput.ReadToEnd(); 
     p.Dispose(); 

     return output; 

    } 
関連する問題