0

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

我正在使用 .net 4 并且想知道完成模拟的最佳方法是什么。我已经阅读了有关使用 pInvoke 和使用 advapi32.dll 的信息,但我希望有人可以推荐一种更好的方法来做到这一点。

感谢您的任何想法。

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

4

2 回答 2

0

您不需要模拟,您所要做的就是使用您要使用的凭据建立文件映射。您可以使用net use作为 shell out 命令或WNetAddConnection2来完成此操作

于 2010-10-26T14:46:45.587 回答
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);
于 2010-10-26T14:47:55.657 回答