如何调用 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 指出了这一点。)
我是 运行 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 指出了这一点。)