Winapi LogonUser使用LOGON32\u LOGON\u NEW\u凭据可对远程不受信任的域计算机工作

Winapi LogonUser使用LOGON32\u LOGON\u NEW\u凭据可对远程不受信任的域计算机工作,winapi,impersonation,Winapi,Impersonation,因此,在这两台机器之间,没有信任——它们位于不同的域中 我已使用LogonUser API和LOGON32\u logon\u NEW\u凭据成功连接到远程计算机。我能够使用UNC共享检索目录的内容,并创建一个文件流来“下载”该文件。到目前为止还不错 唯一的问题是,LogonUser似乎会失败,除非有一个已经打开的会话。让我澄清一下 我今天早上发现ASP.NET MVC页面不工作,特别是使用LogonUser从远程计算机检索文件列表的页面。我查看日志,在stacktrace中看到,System.

因此,在这两台机器之间,没有信任——它们位于不同的域中

我已使用LogonUser API和LOGON32\u logon\u NEW\u凭据成功连接到远程计算机。我能够使用UNC共享检索目录的内容,并创建一个文件流来“下载”该文件。到目前为止还不错

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

我今天早上发现ASP.NET MVC页面不工作,特别是使用LogonUser从远程计算机检索文件列表的页面。我查看日志,在stacktrace中看到,System.IO.\uu Error.WinIOError位于Directory.GetFiles调用上方。然后,我远程访问web服务器,并尝试使用与web站点相同的登录名/密码在资源管理器中打开远程文件夹。它通过了,我可以看到文件。我打开命令提示符,输入netuse,我看到远程机器有一个打开的连接。然后我回到页面,突然页面又开始工作了

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


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

我不确定是否理解您为什么使用
LogonUser
。如果要使用另一个用户凭据在本地计算机上执行某些操作,此功能将帮助您,但它有助于不建立到另一台计算机的远程连接


如果要独立于远程计算机与计算机之间的现有信任从远程计算机获取某些信息,则应使用WNet或Net(网络管理)功能建立与远程计算机的新连接。因此,您应该使用
wnetadconnection2
(请参阅)或
NetUseAdd
()函数。此功能将在目标计算机上进行远程登录,并建立一个新会话(确切地说是
net use\\computer\share/u:domain\user password
do)。您不能将新连接映射到本地驱动器。为此,应在结构
NETRESOURCE
中用
NULL
填充
lpLocalName
。作为
lpUsername
lpPassword
的用户,您应该给出理解目标计算机的任何值。您还可以使用
ipc$
作为目标共享名,然后您只需建立与计算机的会话即可。之后,您可以使用任何其他功能访问远程共享、目录或文件。要关闭会话,您应该使用
WNetCancelConnection2
NetUseDel

这是您将用户登录到远程计算机的方式。确保您使用的是LOGON32\u登录\u新凭据、LOGON32\u提供程序\u 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;
}

谢谢实际上,我一直在研究WNetAddConnection2,并且有一个有效的实现。唯一值得关注的是,由于这是一个ASP.NET应用程序(阅读:long-running),创建此网络连接(又名NET-use)是否会产生任何不利影响?你能想出一个吗?哦,还有,你知道为什么LogonUser在我最初的问题中提到的某些条件下工作吗?我想你的ASP.NET MVC应用程序使用了一个建立了其他人的会话。我看不出你的应用程序在长时间运行。您可以在每次需要时打开到服务器(第二台计算机)的新会话,并在所有工作完成后关闭。如果来自同一用户帐户(ASP.NET应用程序池帐户)的另一个会话已存在,则将共享该会话。如果长时间不关闭连接,则必须自动重新建立连接,这样您就不必执行任何操作。如果您连接到服务器并且长时间不传输任何数据,则会产生相同的效果。所以我在等待,没问题。非常感谢-这很有意义。在LogonUser呼叫后,您是否也在使用ImpersonateLoggedOnUser?请参阅[此处][1]以获取可能的解释。。。[1]: