【问题标题】:LogonUser using LOGON32_LOGON_NEW_CREDENTIALS works against remote untrusted domain machine使用 LOGON32_LOGON_NEW_CREDENTIALS 的 LogonUser 适用于远程不受信任的域机器
【发布时间】:2011-02-24 08:57:19
【问题描述】:

所以在两台机器之间,没有信任——它们在不同的域中。

我已使用登录类型 LOGON32_LOGON_NEW_CREDENTIALS 使用 LogonUser API 成功连接到远程计算机。我能够使用 UNC 共享检索目录的内容,并创建一个文件流来“下载”该文件。到目前为止一切顺利。

唯一的问题是,除非有一个已经打开的会话,否则 LogonUser 似乎会失败。让我澄清一下。

今天早上我发现 ASP.NET MVC 页面无法正常工作,特别是使用 LogonUser 从该远程计算机检索文件列表的页面。我查看日志并在堆栈跟踪中看到 System.IO.__Error.WinIOError 上面的 Directory.GetFiles 调用。然后,我远程访问 Web 服务器,并尝试使用与网站相同的登录名/密码在资源管理器中打开远程文件夹。它通过了,我可以看到文件。我打开命令提示符,输入net use,我看到远程机器的连接打开了。然后我回到页面,突然页面又开始工作了。

因此,在这一点上,我不确定 LogonUser 是否按预期工作。如果调用需要先通过其他方式打开网络连接,那么这肯定不能令人满意。

有谁知道可能发生的情况或建议解决方法?

【问题讨论】:

标签: winapi impersonation


【解决方案1】:

我不确定我是否理解您为什么使用LogonUser。如果您想使用其他用户凭据在 本地 计算机上执行某些工作,此功能可为您提供帮助,但它有助于不与另一台计算机建立远程连接。

如果您想从远程计算机获取一些独立于计算机之间现有信任的信息,您应该使用 WNet 或 Net(网络管理)功能来建立与远程计算机的新连接。所以你应该使用WNetAddConnection2(见http://msdn.microsoft.com/en-us/library/aa385413%28VS.85%29.aspx)或NetUseAddhttp://msdn.microsoft.com/en-us/library/aa370645%28VS.85%29.aspx)函数。此功能将在目标计算机上进行远程登录并建立一个新会话(确切地说是net use \\computer\share /u:domain\user password 所做的)。您不能将新连接映射到本地驱动器。为此,您应该在结构NETRESOURCE 中用NULL 填充lpLocalName。作为lpUsernamelpPassword,您应该给出任何可以理解目标计算机的值。您也可以使用ipc$ 作为目标共享名称,然后您只需建立与计算机的会话即可。之后,您可以使用任何其他功能访问远程共享、目录或文件。要关闭会话,您应该使用 WNetCancelConnection2NetUseDel

【讨论】:

  • 谢谢。实际上,我一直在研究 WNetAddConnection2 并有一个可行的实现。唯一需要担心的是,由于这是一个 ASP.NET 应用程序(阅读:长期运行),创建此网络连接(也称为网络使用)会产生任何不利影响吗?你能想到一个吗?
  • 哦,还有,为什么 LogonUser 在我最初的问题中所说的某些条件下工作?
  • 我想你的 ASP.NET MVC 应用程序使用了一个已经建立了其他人的会话。
  • 我没有看到您的应用程序运行时间很长。您可以在每次需要时打开与服务器(第二台计算机)的新会话,并在所有工作完成后关闭。如果已存在来自同一用户帐户(ASP.NET 应用程序池帐户)的另一个会话,则将共享该会话。如果您长时间不关闭连接,则必须自动重新建立连接,因此您无需执行任何操作。如果您连接到服务器并且长时间不传输任何数据,您将获得相同的效果。所以我等着没问题。
  • 非常感谢 - 这很有道理。
【解决方案2】:

这就是您登录用户到远程计算机的方式。确保您使用的是 LOGON32_LOGON_NEW_CREDENTIALS、LOGON32_PROVIDER_WINNT50。然后模拟令牌。在没有 WNetAddConnection2 的情况下,您应该能够以这种方式执行很多远程操作。 WNetAddConnection2 不是很好,因为连接会被很多东西破坏。 LogonUser 也会在多个 api 调用需要时进行适当的连接。

PXERR impersonate_user(LPCWSTR lpszUserName, LPCWSTR lpszDomain, LPCWSTR lpszPassword)
{
    HANDLE token;

    if(!LogonUserW(lpszUserName, lpszDomain, lpszPassword, LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_WINNT50, &token))
    {
        return PXERR_IMPERSONATION_FAILURE;
    }

    if(!ImpersonateLoggedOnUser(token))
    {
        CloseHandle(token);
        RevertToSelf();
        return PXERR_IMPERSONATION_FAILURE;
    }

    CloseHandle(token);

    return PXERR_SUCCESS;
}

【讨论】:

    猜你喜欢
    • 2010-11-02
    • 2011-11-21
    • 2012-02-24
    • 2010-10-14
    • 2017-04-18
    • 2020-07-11
    • 2021-12-08
    • 1970-01-01
    相关资源
    最近更新 更多