我想使用FileInfo和CopyTo在网络中移动一些文件。我必须将文件移动到必须使用特定用户帐户访问的服务器上的共享。我该怎么做 - 我是否必须冒充该用户然后复制?
我正在使用.net 4,并且想知道实现模仿的最佳方式是什么。我读过有关使用pInvoke和使用advapi32.dll的内容,但我希望有人可以推荐一种更好的方法来实现这一点。
感谢您的任何想法。
修改 的
谢谢你的回复。这不是服务,它是一个控制台应用程序,但它将从多台计算机上运行。使用模拟使用模拟是否有任何优势,反之亦然?建议的方法是什么?
我还考虑使用批处理文件来创建映射并进行复制,但我不确定要完成的容易程度,因为要复制的文件夹并不总是相同 - 它总是在一个目录中,但子目录名称会更改。
答案 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);