2010-10-26 86 views
0

我想使用FileInfo和CopyTo在網絡中移動一些文件。我必須將文件移動到必須使用特定用戶帳戶訪問的服務器上的共享。我該如何做到這一點 - 我必須模仿該用戶,然後做這個副本嗎?使用UNC和模擬複製文件

我正在使用.net 4,並想知道最好的方法來完成模擬是什麼。我已閱讀關於使用pInvoke和使用advapi32.dll,但我希望有人可以推薦一個更好的方式來做到這一點。

感謝您的任何想法。

編輯 感謝您的答覆。這不是一項服務,它是一個控制檯應用程序,但它將從多臺機器運行。使用映射而非使用模擬有什麼好處,反之亦然?推薦的方法是什麼?
我也考慮過使用批處理文件來創建映射並進行復制,但我不確定要完成複製是多麼容易,因爲要從中複製的文件夾不會總是相同的 - 它始終處於內部一個目錄,但子目錄名稱更改。

回答

0

您不需要模擬所有您需要做的就是使用您要使用的憑據建立文件映射。您可以使用net use作爲shell命令或WNetAddConnection2

0

完成此操作如果您作爲服務運行,則可能需要模擬。這是不完整的代碼,但它的要點:

 [DllImport("advapi32.dll", SetLastError = true)] 
    private static extern bool LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken); 

    [DllImport("kernel32.dll", CharSet = CharSet.Auto)] 
    private static extern unsafe int FormatMessage(int dwFlags, ref IntPtr lpSource, int dwMessageId, int dwLanguageId, ref string lpBuffer, int nSize, IntPtr* arguments); 

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern bool CloseHandle(IntPtr handle); 


IntPtr token = IntPtr.Zero; 

      bool isSuccess = LogonUser(username, domain, password, impersonationType, Logon32ProviderDefault, ref token); 
      if (!isSuccess) 
      { 
       RaiseLastError(); 
      } 

      WindowsIdentity newIdentity = new WindowsIdentity(token); 
      WindowsImpersonationContext impersonatedUser = newIdentity.Impersonate(); 

保存令牌再後來

CloseHandle(token); 
+0

如果它是你可以在需要的用戶帳戶運行Windows服務。或者爲此服務創建一個特殊帳戶。 – Den 2010-10-26 14:50:01

+0

@Den是的,你可以。這並不妨礙我提供替代方案。 – 2010-10-26 14:52:47