2015-09-09 67 views
1

我試圖用C#打開Windows資源管理器到\\aserver\d$。 AServer機器需要另一個用戶,一個用戶不一定擁有運行代碼的計算機的權限。打開Windows資源管理器到dotnet客戶端的網絡文件夾

我希望Windows資源管理器窗口顯示爲而不要求用戶輸入憑據,因爲我通過代碼提供了usr/pwd。


如果我這樣做Process.Start(@"\\aserver\d$") Windows要我憑證。我試過Process.Start(@"\\aserver\d$", username, password, domain)但它返回Access is denied異常。更改usr/pwd給我一個The user name or password is incorrect,所以我知道我有正確的usr/pwd/domain組合。我猜dotnet是試圖啓動一個進程「explorer.exe」與其他用戶沒有在我的機器上的權利。我試過玩Process.Start(new ProcessStartInfo{...}),但還沒有找到合適的組合。

+0

幾件事情:是的,當您啓動一個進程是本地計算機,而不是遠程一個(提供憑據你不能改變這一點)。但是,您可以先將遠程路徑映射到本地驅動器(以編程方式)。第二件重要的事情:「\\ aserver」是「\ aserver」,如果您在打開資源管理器之前執行「net use \\ server \\ ipc $」並提供憑據,請使用vebatim @「\\ aserver」而不是 –

+1

可能會工作 – Marged

+1

您可以導入dll「Mpr.Dll」並調用extern方法WNetUseConnection來首先映射驅動器,如Adriano所述。方法簽名包括用戶名和密碼。 –

回答

0

下面是我用的,你可以使用映射網絡驅動器編程代碼:

public class NetworkSharedDrive 
    { 
     #region Consts 
     const int RESOURCE_CONNECTED = 0x00000001; 
     const int RESOURCE_GLOBALNET = 0x00000002; 
     const int RESOURCE_REMEMBERED = 0x00000003; 

     const int RESOURCETYPE_ANY = 0x00000000; 
     const int RESOURCETYPE_DISK = 0x00000001; 
     const int RESOURCETYPE_PRINT = 0x00000002; 

     const int RESOURCEDISPLAYTYPE_GENERIC = 0x00000000; 
     const int RESOURCEDISPLAYTYPE_DOMAIN = 0x00000001; 
     const int RESOURCEDISPLAYTYPE_SERVER = 0x00000002; 
     const int RESOURCEDISPLAYTYPE_SHARE = 0x00000003; 
     const int RESOURCEDISPLAYTYPE_FILE = 0x00000004; 
     const int RESOURCEDISPLAYTYPE_GROUP = 0x00000005; 

     const int RESOURCEUSAGE_CONNECTABLE = 0x00000001; 
     const int RESOURCEUSAGE_CONTAINER = 0x00000002; 


     const int CONNECT_INTERACTIVE = 0x00000008; 
     const int CONNECT_PROMPT = 0x00000010; 
     const int CONNECT_REDIRECT = 0x00000080; 
     const int CONNECT_UPDATE_PROFILE = 0x00000001; 
     const int CONNECT_COMMANDLINE = 0x00000800; 
     const int CONNECT_CMD_SAVECRED = 0x00001000; 

     const int CONNECT_LOCALDRIVE = 0x00000100; 
     #endregion 

     #region Errors 
     const int NO_ERROR = 0; 

     const int ERROR_ACCESS_DENIED = 5; 
     const int ERROR_ALREADY_ASSIGNED = 85; 
     const int ERROR_BAD_DEVICE = 1200; 
     const int ERROR_BAD_NET_NAME = 67; 
     const int ERROR_BAD_PROVIDER = 1204; 
     const int ERROR_CANCELLED = 1223; 
     const int ERROR_EXTENDED_ERROR = 1208; 
     const int ERROR_INVALID_ADDRESS = 487; 
     const int ERROR_INVALID_PARAMETER = 87; 
     const int ERROR_INVALID_PASSWORD = 1216; 
     const int ERROR_MORE_DATA = 234; 
     const int ERROR_NO_MORE_ITEMS = 259; 
     const int ERROR_NO_NET_OR_BAD_PATH = 1203; 
     const int ERROR_NO_NETWORK = 1222; 

     const int ERROR_BAD_PROFILE = 1206; 
     const int ERROR_CANNOT_OPEN_PROFILE = 1205; 
     const int ERROR_DEVICE_IN_USE = 2404; 
     const int ERROR_NOT_CONNECTED = 2250; 
     const int ERROR_OPEN_FILES = 2401; 

     private struct ErrorClass 
     { 
      public int num; 
      public string message; 
      public ErrorClass(int num, string message) 
      { 
       this.num = num; 
       this.message = message; 
      } 
     } 

     private static ErrorClass[] ERROR_LIST = new ErrorClass[] { 
     new ErrorClass(ERROR_ACCESS_DENIED, "Error: Access Denied"), 
     new ErrorClass(ERROR_ALREADY_ASSIGNED, "Error: Already Assigned"), 
     new ErrorClass(ERROR_BAD_DEVICE, "Error: Bad Device"), 
     new ErrorClass(ERROR_BAD_NET_NAME, "Error: Bad Net Name"), 
     new ErrorClass(ERROR_BAD_PROVIDER, "Error: Bad Provider"), 
     new ErrorClass(ERROR_CANCELLED, "Error: Cancelled"), 
     new ErrorClass(ERROR_EXTENDED_ERROR, "Error: Extended Error"), 
     new ErrorClass(ERROR_INVALID_ADDRESS, "Error: Invalid Address"), 
     new ErrorClass(ERROR_INVALID_PARAMETER, "Error: Invalid Parameter"), 
     new ErrorClass(ERROR_INVALID_PASSWORD, "Error: Invalid Password"), 
     new ErrorClass(ERROR_MORE_DATA, "Error: More Data"), 
     new ErrorClass(ERROR_NO_MORE_ITEMS, "Error: No More Items"), 
     new ErrorClass(ERROR_NO_NET_OR_BAD_PATH, "Error: No Net Or Bad Path"), 
     new ErrorClass(ERROR_NO_NETWORK, "Error: No Network"), 
     new ErrorClass(ERROR_BAD_PROFILE, "Error: Bad Profile"), 
     new ErrorClass(ERROR_CANNOT_OPEN_PROFILE, "Error: Cannot Open Profile"), 
     new ErrorClass(ERROR_DEVICE_IN_USE, "Error: Device In Use"), 
     new ErrorClass(ERROR_EXTENDED_ERROR, "Error: Extended Error"), 
     new ErrorClass(ERROR_NOT_CONNECTED, "Error: Not Connected"), 
     new ErrorClass(ERROR_OPEN_FILES, "Error: Open Files"), 
    }; 

     private static string getErrorForNumber(int errNum) 
     { 
      foreach (ErrorClass er in ERROR_LIST) 
      { 
       if (er.num == errNum) return er.message; 
      } 
      return "Error: Unknown, " + errNum; 
     } 
     #endregion 

     [DllImport("Mpr.dll")] 
     private static extern int WNetUseConnection(
      IntPtr hwndOwner, 
      NETRESOURCE lpNetResource, 
      string lpPassword, 
      string lpUserID, 
      int dwFlags, 
      string lpAccessName, 
      string lpBufferSize, 
      string lpResult 
      ); 

     [DllImport("Mpr.dll")] 
     private static extern int WNetCancelConnection2(
      string lpName, 
      int dwFlags, 
      bool fForce 
      ); 

     [StructLayout(LayoutKind.Sequential)] 
     private class NETRESOURCE 
     { 
      public int dwScope = 0; 
      public int dwType = 0; 
      public int dwDisplayType = 0; 
      public int dwUsage = 0; 
      public string lpLocalName = ""; 
      public string lpRemoteName = ""; 
      public string lpComment = ""; 
      public string lpProvider = ""; 
     } 


     public static string connectToRemote(string remoteUNC, string username, string password) 
     { 
      return connectToRemote(remoteUNC, username, password, false); 
     } 

     public static string connectToRemote(string remoteUNC, string username, string password, bool promptUser) 
     { 
      NETRESOURCE nr = new NETRESOURCE(); 
      nr.dwType = RESOURCETYPE_DISK; 
      nr.lpRemoteName = remoteUNC; 

      int ret; 
      if (promptUser) 
       ret = WNetUseConnection(IntPtr.Zero, nr, "", "", CONNECT_INTERACTIVE | CONNECT_PROMPT, null, null, null); 
      else 
       ret = WNetUseConnection(IntPtr.Zero, nr, password, username, 0, null, null, null); 

      if (ret == NO_ERROR) return null; 
      return getErrorForNumber(ret); 
     } 

     public static string disconnectRemote(string remoteUNC) 
     { 
      int ret = WNetCancelConnection2(remoteUNC, CONNECT_UPDATE_PROFILE, false); 
      if (ret == NO_ERROR) return null; 
      return getErrorForNumber(ret); 
     } 
    } 
} 
相關問題