【问题标题】:ShowWindow doesn't work when a window is running under SYSTEM account当窗口在 SYSTEM 帐户下运行时,ShowWindow 不起作用
【发布时间】:2020-12-04 08:56:50
【问题描述】:

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

ShowWindow(wHandle, SW_RESTORE);

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

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

【问题讨论】:

  • 您可能需要ChangeWindowMessageFilterEx,尽管在随机用户的桌面上以本地 SYSTEM 帐户运行 GUI 应用程序可能是您需要解决的真正问题。似乎没有令人信服的理由这样做。这是为了解决什么问题?
  • 我实际上正在编写一个程序来帮助我调用外部应用程序,如果该应用程序已经在运行,我想恢复窗口并将其向前推进。但我面临的问题是外部应用程序倾向于在 SYSTEM 而不是我自己的用户名上运行。
  • 在系统帐户下运行您的应用程序,它会工作。大概设计这样一个解决方案的方法是编写一个在系统帐户下运行的Windows服务,并编写一个前端GUI应用程序向该服务发送命令。
  • @IInspectable 只有创建目标窗口的进程才能为自己调用ChangeWindowMessageFilter/Ex()。您不能将其称为其他人的窗口。 “在随机用户的桌面上以本地 SYSTEM 帐户运行 GUI 应用程序可能是您需要解决的真正问题” - 同意。
  • 出于安全原因,低权限进程被阻止与高权限进程进行各种交互。

标签: delphi winapi showwindow


【解决方案1】:

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

一些步骤:

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

参考:Run process as Local System

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2014-01-21
    相关资源
    最近更新 更多