当我使用时:
File.Copy(strRemoteFolder, strLocalFolder)
我收到UnauthorizedAccessException
,其中包含以下消息:“访问路径...被拒绝。”
在.NET中,如何将文件从需要身份验证的远程计算机复制到本地计算机?我知道我需要以某种方式提供用户名和密码,但我不知道如何通过.NET中的API提供这些信息。
答案 0 :(得分:1)
您可以使用非托管LogonUser函数为远程计算机上的会话获取帐户令牌,然后调用WindowsIdentity.Impersonate以使用该会话。 WindowsIdentity.Impersonate上的MSDN页面描述了如何对LogonUser进行p / invoke调用。
您可能无法使用File.Copy,因为您无权访问本地计算机,但您可以调用File.OpenRead打开远程文件,然后还原您的令牌。像这样:
[DllImport("advapi32.dll")]
public static extern bool LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, out IntPtr phToken);
[DllImport("kernel32.dll")]
public static extern bool CloseHandle(IntPtr hObject);
public static Stream OpenFileWithAccount(string filename, string username, string domain, string password)
{
IntPtr token;
if (!LogonUser(username, domain, password, 2, 0, out token))
{
throw new Win32Exception();
}
try
{
using (WindowsIdentity.Impersonate(token))
{
return File.OpenRead(filename);
}
}
finally
{
CloseHandle(token);
}
}
答案 1 :(得分:1)
使用LogonUser
登录远程计算机的建议肯定是错误的。您应该使用WNetAddConnection2
或NetUseAdd
与参数级别2(USE_INFO_2
)本机API进行远程登录。
答案 2 :(得分:0)
调整目标系统上的共享权限以允许访问。
答案 3 :(得分:0)
如果没有自己进行身份验证,您将无法从受保护的服务器复制文件。
答案 4 :(得分:0)
您可以使用advapi32.dll中包含的LogonUser()
。我没有亲自使用它,但它似乎很直接。
[DllImport("ADVAPI32.DLL")]
public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword,
int dwLogonType, int dwLogonProvider, out int phToken);
http://www.codeproject.com/KB/cs/cpimpersonation1.aspx
http://www.pinvoke.net/default.aspx/advapi32.logonuser
答案 5 :(得分:0)
由于您可以控制两台计算机,因此可以在两台具有匹配密码的计算机上创建本地用户,然后以该用户身份运行该程序。
或者您可以在远程计算机上创建用户,并使用该用户的用户名/密码将驱动器映射到该计算机。您可以将用户指定为RemoteServer\NewUser
。因此,引用here的净使用参数为use s: \\remoteserver\share /USER:RemoteServer\NewUser password
。然后再次呼叫网络,但通过use s: /delete
清理......
(这里的假设是您已正确配置用户以访问相关的特定共享/文件夹。)