2010-10-26 85 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