【发布时间】:2017-01-26 15:48:54
【问题描述】:
我有一个非交互式服务作为特权 SYSTEM 用户在 Windows 机器上运行,我需要它来将给定的可执行文件作为提升的进程启动。
我已经设法以 SYSTEM 身份启动了一个子进程,使用 WTSGetActiveConsoleSessionId(),找到了一个系统进程并复制了它的令牌。同样,我可以作为普通用户启动非提升进程。但我需要以普通用户身份启动该进程,但需要提升权限 - 这样我就不必显示 UAC,但该进程正在以适当用户身份运行。
我不想绕过 UAC - 因为用户已经同意安装该服务。我正在努力减轻不便。我找到了similar, unanswered question - 但又问了一遍,希望能得到答案。
【问题讨论】:
-
假设您使用 WTSQueryUserToken 为交互式用户获取令牌,并且交互式用户是管理员,您应该能够使用 GetTokenInformation 和 TokenLinkedToken 选项获取提升的令牌。
-
附带说明,通过复制您自己的 SYSTEM 令牌,然后使用 SetTokenInformation 和 TokenSessionId 选项更改会话 ID,应该可以(并且更有效)将子进程作为 SYSTEM 启动。跨度>
-
@HarryJohnston 感谢您的想法!链接令牌的想法工作正常。如果您将其转换为答案,我可以将其标记为已接受。
-
@Liosan:我也有类似的问题。我必须在所有活动会话中启动该过程。为此,我使用 WTSEnumerateSessions() 来获取所有活动会话并启动进程。但我想在该会话中以管理员模式运行该进程(以管理员身份运行)。你能告诉我怎么做吗?为了获取会话令牌,我使用了 WTSQueryUserToken() API 并启动了我使用 CreateProcessAsUser() API 的进程。我的服务也是本地服务。
标签: winapi uac elevated-privileges