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

Dev*_*v28 2 windows security impersonation winapi uac

我在Windows Server 2012上运行WindowsService,它需要模拟域管理员用户(也将其添加到计算机上的本地管理员组).

系统上启用了UAC,并使用LogonType为LOGON32_LOGON_INTERACTIVE的凭据调用LogonUser,似乎返回受限令牌而不是完整令牌.

这导致我试图做的管理任务失败.

在这种情况下调用LogonUser的正确方法是什么,以便返回完整的令牌而不是受限制的令牌?

PS:我在这里遇到了一个相关的问题如何在非交互式登录下通过模拟获得提升权限(UAC)? 但它没有显示为获取完整令牌而需要进行的确切调用.

Har*_*ton 6

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

此答案中有一些示例代码,显示了使用LOGON32_LOGON_BATCH和LogonUser()函数获取管理令牌.


附录:

如果你有SeTcbPrivilege,你有另一个选择:你可以LOGON32_LOGON_INTERACTIVE在调用LogonUser()时使用,然后使用TokenLinkedTokenGetTokenInformation()中的选项来获取链接到过滤后的令牌的提升标记的句柄.

SeTcbPrivilege也称为"作为操作系统的一部分",通常仅在本地系统上下文中运行时才可用.

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

  • @RbMm,具体来说,您需要在调用 GetTokenInformation 时启用 SeTcbPrivilege(“作为操作系统的一部分”)。 (2认同)