我运行Windows Server 2012上WindowsService,它需要模拟一个域管理员用户(谁也被添加到本地管理员组上机)。
UAC是在系统上启用并使用与LOGON32_LOGON_INTERACTIVE的登录类型的凭据调用LogonUser的,似乎回到完全令牌的限制,而不是象征。
这导致了管理任务我试图做失败。
什么是调用LogonUser在这种情况下,使返回而不是受限令牌的完全令牌的正确方法?
PS:我碰到一个相关的问题在这里我怎样才能得到一个非交互式登录下通过模拟提升权限(UAC)? 但它并不表明需要进行以获得完全令牌确切的电话。
您可以通过使用得到的LogonUser()一个未经过滤的令牌LOGON32_LOGON_BATCH
选项,而不是LOGON32_LOGON_INTERACTIVE
选项。
有在一些示例代码此答案其示出了使用的LOGON32_LOGON_BATCH
和LogonUser的()函数来获取的管理令牌。
附录:
如果你有SeTcbPrivilege,你还有另外一个选择:你可以使用LOGON32_LOGON_INTERACTIVE
调用LogonUser的()的时候,然后使用TokenLinkedToken
在GetTokenInformation()选项获取的句柄提升令牌链接到过滤的令牌。
SeTcbPrivilege也被称为“作为操作系统的一部分”,并且是当你在本地系统上下文中运行通常只。
如果你没有SeTcbPrivilege,你仍然可以调用GetTokenInformation()获取链接令牌的副本,但在这种情况下,你在一个模拟令牌SecurityIdentification
水平所以它是没有用的,如果你想创建一个新的进程。 (感谢RbMm指出这一点。)
文章来源: How to call LogonUser() to get a non-restricted full token inside a Windows Service with UAC enabled?