如何将文件从需要身份验证的计算机复制到本地计算机?

时间:2010-07-07 21:16:32

标签: c# .net windows vb.net authentication

当我使用时:

File.Copy(strRemoteFolder, strLocalFolder)

我收到UnauthorizedAccessException,其中包含以下消息:“访问路径...被拒绝。”

在.NET中,如何将文件从需要身份验证的远程计算机复制到本地计算机?我知道我需要以某种方式提供用户名和密码,但我不知道如何通过.NET中的API提供这些信息。

6 个答案:

答案 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登录远程计算机的建议肯定是错误的。您应该使用WNetAddConnection2NetUseAdd与参数级别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清理......

(这里的假设是您已正确配置用户以访问相关的特定共享/文件夹。)