当 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
。
一些步骤:
- 程序向服务发送会话 ID
- 服务调用
OpenProcessToken
和 DuplicateTokenEx
创建一个
本地系统令牌
- 服务调用
SetTokenInformation
将令牌会话 ID 更改为
匹配程序的
- 服务调用
DuplicateHandle
来创建令牌句柄
- 服务向程序发送句柄
- 程序使用收到的句柄调用
SetThreadToken
参考:
对于@fpiette 的评论,Interacting with a User from a Service Indirectly 显示了更多详细信息。
我目前正在使用此代码来恢复最小化的 window,当我尝试恢复在我自己的用户帐户下运行的 window 时,它工作得很好。
ShowWindow(wHandle, SW_RESTORE);
当我尝试恢复在 SYSTEM 帐户下运行的 window 时出现问题。我发现 ShowWindow()
对我来说总是 returns 一个错误的值。此外,在我的清单中,我尝试将其设置为“需要管理员”和“作为调用者”,但它仍然产生相同的结果。
有没有和ShowWindow()
类似的功能,可以恢复SYSTEM账号下运行的window?
您可以在用户应用程序中创建具有“本地系统”权限的线程。然后在线程中执行你的ShowWindow
。
一些步骤:
- 程序向服务发送会话 ID
- 服务调用
OpenProcessToken
和DuplicateTokenEx
创建一个 本地系统令牌 - 服务调用
SetTokenInformation
将令牌会话 ID 更改为 匹配程序的 - 服务调用
DuplicateHandle
来创建令牌句柄 - 服务向程序发送句柄
- 程序使用收到的句柄调用
SetThreadToken
参考:
对于@fpiette 的评论,Interacting with a User from a Service Indirectly 显示了更多详细信息。