首页 > 解决方案 > 当窗口在 SYSTEM 帐户下运行时,ShowWindow 不起作用

问题描述

我目前正在使用此代码来恢复最小化的窗口,当我尝试恢复在我自己的用户帐户下运行的窗口时,它可以完美运行。

ShowWindow(wHandle, SW_RESTORE);

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

是否有另一个功能类似于ShowWindow()并且能够恢复在 SYSTEM 帐户下运行的窗口?

标签: delphiwinapishowwindow

解决方案


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

一些步骤:

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

参考:以本地系统运行进程

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


推荐阅读