避免UAC但使用Windows服务启动提升的进程

7

我在Windows机器上以特权SYSTEM用户身份运行一个非交互式服务,我需要它以提升的权限启动指定的可执行文件。

我已使用WTSGetActiveConsoleSessionId()启动了一个子进程作为SYSTEM,找到了一个系统进程并复制了它的令牌。同样地,我可以启动一个非提升的进程作为普通用户。但是,我需要以普通用户身份启动进程,但具有提升的权限-这样我就不必显示UAC,但进程正在以适当的用户身份运行。

我并不试图绕过UAC-因为用户已经同意安装该服务。我正在尝试减轻不便。我已经找到了一个类似的未回答问题,但再次提问,希望能得到答案。


假设您正在使用WTSQueryUserToken为交互用户获取令牌,并且交互用户是管理员,则应该能够使用TokenLinkedToken选项使用GetTokenInformation获取提升的令牌。 - Harry Johnston
顺便提一下,通过复制自己的SYSTEM令牌并使用SetTokenInformation和TokenSessionId选项更改会话ID,应该可以(而且更有效地)启动一个子进程作为SYSTEM。 - Harry Johnston
@HarryJohnston 谢谢你的想法!链接令牌的想法还不错。如果你把它转换成答案,我可以标记为已接受。 - Liosan
@Liosan: 我有类似的问题。我必须在所有活动会话中启动进程。为此,我使用WTSEnumerateSessions()获取所有活动会话并启动进程。但是我想以管理员模式(以管理员身份运行)在该会话中运行该进程。你能告诉我如何做吗?我使用WTSQueryUserToken() API来获取会话令牌,并使用CreateProcessAsUser() API来启动进程。此外,我的服务是本地服务。 - Umesha MS
1个回答

5
如果您拥有一个交互式用户的过滤令牌 - 例如,通过WTSQueryUserToken()检索到的令牌 - 您可以使用GetTokenInformation函数并选择TokenLinkedToken选项来检索未过滤(“提升”)的令牌。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接