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

时间:2016-09-09 02:44:49

标签: windows security winapi uac impersonation

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

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

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

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

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

1 个答案:

答案 0 :(得分:5)

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

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

附录:

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

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

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