delphi - 当窗口在 SYSTEM 帐户下运行时,ShowWindow 不起作用
问题描述
我目前正在使用此代码来恢复最小化的窗口,当我尝试恢复在我自己的用户帐户下运行的窗口时,它可以完美运行。
ShowWindow(wHandle, SW_RESTORE);
当我尝试恢复在 SYSTEM 帐户下运行的窗口时出现问题。我发现它ShowWindow()
总是给我返回一个错误的值。此外,在我的清单中,我尝试将其设置为“需要管理员”和“作为调用者”,但它仍然产生相同的结果。
是否有另一个功能类似于ShowWindow()
并且能够恢复在 SYSTEM 帐户下运行的窗口?
解决方案
您可以在用户应用程序中创建具有“本地系统”权限的线程。然后ShowWindow
在线程中执行你的。
一些步骤:
- 程序将会话 ID 发送到服务
- 服务调用
OpenProcessToken
并DuplicateTokenEx
创建本地系统令牌 SetTokenInformation
更改令牌会话 ID 以匹配程序的服务调用DuplicateHandle
用于创建令牌句柄的服务调用- 服务向程序发送句柄
SetThreadToken
使用接收到的句柄进行程序调用
参考:以本地系统运行进程
对于@fpiette 的评论,Interacting with a User from a Service Indirectly显示了更多详细信息。
推荐阅读
- c# - 具有外键关系的 C# Linq 查询
- asp.net-mvc - Xamarin 表单 - Android - 仅在 HTTPS 中握手失败
- sql - MVC 实体框架,查询返回 null
- c# - 如何使用 Selenium C# 在警报弹出窗口中单击复选框。该复选框没有任何 xpath。无法检查,因为右键单击已禁用
- npm - npm ERR!:代码 127。gyp ERR!堆栈错误:命令失败
- reactjs - React Table 7 在子组件中嵌套子组件
- python - 熊猫相对于其他一些列将列堆叠到行
- java - 杰克逊序列化和删除空白空间
- angular - 在 Angular 中创建组件之间动态关系的最佳方法
- python-tesseract - Pytesseract 输出到列表中然后拆分并出现错误