当我使用:如何从要求身份验证的计算机上将文件复制到本地计算机?
File.Copy(strRemoteFolder, strLocalFolder)
我得到以下消息的UnauthorizedAccessException
:“访问路径...被拒绝。”
在.NET中,如何从要求身份验证的远程计算机将文件复制到本地计算机?我知道我需要以某种方式提供用户名和密码,但我不知道如何通过.NET中的API提供该信息。
当我使用:如何从要求身份验证的计算机上将文件复制到本地计算机?
File.Copy(strRemoteFolder, strLocalFolder)
我得到以下消息的UnauthorizedAccessException
:“访问路径...被拒绝。”
在.NET中,如何从要求身份验证的远程计算机将文件复制到本地计算机?我知道我需要以某种方式提供用户名和密码,但我不知道如何通过.NET中的API提供该信息。
调整目标系统上的共享权限以允许访问。
我特别需要.NET中的解决方案。目标机器位于不同的域上,我们无法在不同域之间提供凭据。 – 2010-07-07 21:23:16
这不会使答案无效。否则你可以写一个程序并从任何其他机器获取任何受保护的数据。不太可能发生。 – Randy 2010-07-07 21:24:19
如果不进行身份验证,您将无法复制受保护服务器中的文件。
您可以使用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
可以使用非托管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);
}
}
也许你以错误的顺序得到了方法调用的参数? - >(用户名,域名,密码....)在宣言 – MaLio 2010-07-08 00:51:27
@MaLio:你说得对,我做到了。谢谢你的收获! – Quartermeister 2010-07-08 03:32:33
订单错在哪里?我找不到这个。帮我。调用LogUser方法时出错。 – AT07 2012-09-04 07:18:37
的建议使用LogonUser
登录远程计算机上是明确错误。您应使用WNetAddConnection2
或NetUseAdd
参数级别2(USE_INFO_2
)本机API进行远程登录。
由于您可以控制两台机器,因此可以在两台机器上创建具有匹配密码的本地用户,然后以该用户身份运行程序。
或者您可以在远程计算机上创建用户,并使用该用户的用户名/密码将驱动器映射到该计算机。您将指定用户为RemoteServer\NewUser
。所以你参考here的净使用将是use s: \\remoteserver\share /USER:RemoteServer\NewUser password
。然后再打电话网,但通过use s: /delete
清理...
(这里假设你已经正确配置,用户能够访问有关具体份额/文件夹。)
下面你注意,你有不同的域,不能提供跨域的凭证。你有远程PC的控制权吗? – 2010-07-07 21:28:39
@Tim我们可以控制远程PC,但我认为出于安全考虑,我们无法创建允许跨域访问的策略。 – 2010-07-08 12:36:58