我在Windows Server 2012上运行WindowsService,它需要模拟一个域pipe理员用户(他也被添加到机器上的本地pipe理员组中)。
在系统上启用UAC,并使用LogonType为LOGON32_LOGON_INTERACTIVE的凭据调用LogonUser,似乎会返回受限令牌而不是完整令牌。
这导致我正在尝试做的pipe理任务失败。
在这种情况下调用LogonUser的正确方法是什么,以便返回完整的令牌而不是受限制的令牌?
PS:我在这里遇到一个相关的问题如何通过非交互式login模拟获得提升权限(UAC)? 但它并不显示需要获取完整令牌的确切调用。
您可以使用LOGON32_LOGON_BATCH
选项(而不是LOGON32_LOGON_BATCH
选项)从LogonUser()获取未过滤的标记。
这个答案中有一些示例代码,它显示了使用LOGON32_LOGON_BATCH
和LogonUser()函数来获取管理令牌。
附录:
如果您有SeTcbPrivilege,则可以使用另一个选项:调用LogonUser()时可以使用LOGON32_LOGON_INTERACTIVE
,然后使用GetTokenInformation()中的TokenLinkedToken
选项获取链接到已过滤令牌的提升标记的句柄。
SeTcbPrivilege也被称为“作为操作系统的一部分”,通常只有在本地系统环境中运行时才可用。
如果您没有SeTcbPrivilege,您仍然可以调用GetTokenInformation()来获取链接标记的副本,但是在这种情况下,您会在SecurityIdentification
级别获得一个模拟标记,所以如果您要创建一个新的流程。 (信贷RbMm指出这一点。)