【问题标题】:How to I copy a file from a computer that requires authentication to my local machine?如何将需要身份验证的计算机中的文件复制到本地计算机?
【发布时间】:2010-07-07 21:16:32
【问题描述】:

当我使用时:

File.Copy(strRemoteFolder, strLocalFolder)

我收到带有以下消息的UnauthorizedAccessException:“访问路径...被拒绝。”

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

【问题讨论】:

  • 请注意,您拥有不同的域,无法提供跨域凭据。您可以控制远程 PC 吗?
  • @Tim 我们可以控制远程 PC,但我相信出于安全原因,我们将无法创建允许跨域访问的策略。

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


【解决方案1】:

使用LogonUser 登录远程计算机的建议绝对是错误的。您应该使用带有参数级别 2 (USE_INFO_2) 的原生 API 的 WNetAddConnection2NetUseAdd 进行远程登录。

【讨论】:

    【解决方案2】:

    您可以使用非托管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);
        }
    }
    

    【讨论】:

    • 也许您的方法调用的参数顺序错误? ->(用户名、域、密码 ....)如声明中所述
    • 订单错在哪里?我找不到这个。帮我。调用 LogUser 方法时出错。
    【解决方案3】:

    调整目标系统上的共享权限以允许访问。

    【讨论】:

    • 我特别需要 .NET 中的解决方案。目标计算机位于不同的域中,我们无法提供跨不同域的凭据。
    • 这不会使答案无效。否则,您可以编写一个程序并从任何其他机器获取任何受保护的数据。不太可能发生。
    【解决方案4】:

    如果不进行身份验证,您将无法从受保护的服务器复制文件。

    【讨论】:

      【解决方案5】:

      您可以使用 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

      【讨论】:

        【解决方案6】:

        由于您可以控制两台机器,因此您可以在两台机器上创建一个具有匹配密码的本地用户,然后以该用户身份运行程序。

        或者您可以在远程计算机上创建用户并使用该用户的用户名/密码将驱动器映射到该计算机。您可以将用户指定为RemoteServer\NewUser。所以你引用here的参数是use s: \\remoteserver\share /USER:RemoteServer\NewUser password。然后再次调用 net 但通过use s: /delete 进行清理...

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-19
          相关资源
          最近更新 更多