我在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? 但它没有显示为获取完整令牌而需要进行的确切调用。
答案 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指出这一点。)