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

我在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指出这一点。)