使用UNC和模拟复制文件

时间:2010-10-26 14:41:17

标签: c# .net file-copying

我想使用FileInfo和CopyTo在网络中移动一些文件。我必须将文件移动到必须使用特定用户帐户访问的服务器上的共享。我该怎么做 - 我是否必须冒充该用户然后复制?

我正在使用.net 4,并且想知道实现模仿的最佳方式是什么。我读过有关使用pInvoke和使用advapi32.dll的内容,但我希望有人可以推荐一种更好的方法来实现这一点。

感谢您的任何想法。

修改 的 谢谢你的回复。这不是服务,它是一个控制台应用程序,但它将从多台计算机上运行。使用模拟使用模拟是否有任何优势,反之亦然?建议的方法是什么?
我还考虑使用批处理文件来创建映射并进行复制,但我不确定要完成的容易程度,因为要复制的文件夹并不总是相同 - 它总是在一个目录中,但子目录名称会更改。

2 个答案:

答案 0 :(得分:0)

您不需要模拟,您只需要使用要使用的凭据建立文件映射。您可以使用net use作为shell out命令或WNetAddConnection2

来完成此操作

答案 1 :(得分: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);