winapi - LogonUser 使用 LOGON32_LOGON_NEW_CREDENTIALS 对远程不受信任的域机器起作用

标签 winapi impersonation

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

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

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

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

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

有谁知道可能会发生什么或建议解决方法?

最佳答案

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

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

关于winapi - LogonUser 使用 LOGON32_LOGON_NEW_CREDENTIALS 对远程不受信任的域机器起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2916359/

相关文章:

包含所有文件信息的 C++ 文件列表

c++ - SetPixelFormat() 中的第三个参数对于 OpenGL 上下文创建有什么意义?

c# - 如何以编程方式最小化打开的窗口文件夹

vba - 以不同用户身份写入文件

c++ - 获取 CLSID key 问题

c++ - 按 F10 导致 WM_SETCURSOR 消息

c# - 使用 Windows 模拟连接到 SQL Server

如果 token 中没有角色信息,则通过 token 交换进行的 keycloak 模拟将无法工作

c# - 动态模拟远程用户 - c# 和 asp.net

c# - 使用模拟在 C# 中(间接)启动进程