当 SYSTEM 帐户下的 window 为 运行 时,ShowWindow 不起作用

ShowWindow doesn't work when a window is running under SYSTEM account

我目前正在使用此代码来恢复最小化的 window,当我尝试恢复在我自己的用户帐户下运行的 window 时,它工作得很好。

ShowWindow(wHandle, SW_RESTORE);

当我尝试恢复在 SYSTEM 帐户下运行的 window 时出现问题。我发现 ShowWindow() 对我来说总是 returns 一个错误的值。此外,在我的清单中,我尝试将其设置为“需要管理员”和“作为调用者”,但它仍然产生相同的结果。

有没有和ShowWindow()类似的功能,可以恢复SYSTEM账号下运行的window?

您可以在用户应用程序中创建具有“本地系统”权限的线程。然后在线程中执行你的ShowWindow

一些步骤:

  1. 程序向服务发送会话 ID
  2. 服务调用 OpenProcessTokenDuplicateTokenEx 创建一个 本地系统令牌
  3. 服务调用 SetTokenInformation 将令牌会话 ID 更改为 匹配程序的
  4. 服务调用 DuplicateHandle 来创建令牌句柄
  5. 服务向程序发送句柄
  6. 程序使用收到的句柄调用 SetThreadToken

参考:

对于@fpiette 的评论,Interacting with a User from a Service Indirectly 显示了更多详细信息。