如何调用 LogonUser() 以在启用 UAC 的 Windows 服务中获取不受限制的完整令牌?

How to call LogonUser() to get a non-restricted full token inside a Windows Service with UAC enabled?

我是 运行 Windows Windows Server 2012 上的一个服务,它需要模拟一个域管理员用户(他也被添加到机器上的本地管理员组) .

UAC 已在系统上启用,并且使用登录类型为 LOGON32_LOGON_INTERACTIVE 的凭据调用 LogonUser,似乎 return 是受限令牌而不是完整令牌。

这导致我尝试执行的管理任务失败。

在这种情况下调用 LogonUser 的正确方法是 returned 而不是受限令牌?

PS:我在这里遇到了一个相关问题 How can I get elevated permissions (UAC) via impersonation under a non-interactive login? 但它没有显示获得完整令牌所需的确切调用。

您可以使用 LOGON32_LOGON_BATCH 选项而不是 LOGON32_LOGON_INTERACTIVE 选项从 LogonUser() 获取未过滤的令牌。

this answer 中有一些示例代码显示了如何使用 LOGON32_LOGON_BATCH 和 LogonUser() 函数来获取管理令牌。


附录:

如果您有 SeTcbPrivilege,您还有另一种选择:您可以在调用 LogonUser() 时使用 LOGON32_LOGON_INTERACTIVE,然后在 GetTokenInformation() 中使用 TokenLinkedToken 选项来获取提升令牌的句柄链接到过滤的令牌。

SeTcbPrivilege 也称为 "Act as part of the operating system",通常仅当您在本地系统上下文中处于 运行 时才可用。

如果您没有 SeTcbPrivilege,您仍然可以调用 GetTokenInformation() 来获取链接令牌的副本,但在这种情况下,您会获得 SecurityIdentification 级别的模拟令牌,因此它没有用如果您想创建一个新流程。 (感谢 RbMm 指出了这一点。)