【发布时间】:2015-05-04 12:44:10
【问题描述】:
我创建了一个 java 库,它提升了从具有管理员权限的 JAR 运行的 java 应用程序。在 linux 上这工作正常,如果我通过在 linux 中按 CTRL-C 退出应用程序,提升的应用程序以 sudo 开始按预期停止。在 Windows 上,这不是行为。当我使用 CTRL-C 退出时,管理员进程继续运行,我需要从任务管理器手动停止它。
如何让使用 JPA/ShellExecuteEx 创建的进程在调用进程终止时自动终止,例如当用户通过键入 CTRL-C 退出时?
【问题讨论】:
-
将进程句柄添加到使用
JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE配置的job object。 -
eryksun,我按照您的建议添加了一个作业对象,但它仍然不起作用。从我的研究中可以看出,ShellExecuteEx 可能没有设置 CREATE_BREAKAWAY_FROM_JOB 并且我看不到任何选项可以这样做。我已根据您的建议提交了代码,但它仍然无法正常工作。
-
你不是在检查错误,那么你怎么知道它是否被成功添加和配置?您应该首先调用
QueryInformationJobObject来获取并修改当前的JobObjectExtendedLimitInformation(9)。确保它是扩展信息;您当前正在设置JobObjectBasicLimitInformation(2)。 -
eryksun,我添加了全面的错误检查,添加了 QueryInformationJobObject 调用,并按照您的建议更改为 JobObjectExtendedLimitInformation (9),即使每个函数调用成功,子(管理员)进程仍然没有终止父(用户)进程终止。
-
eryksun,我认为应该可以序列化当前进程句柄并将其作为命令行参数传递给子进程并让父进程反序列化它并运行间隔以退出父进程进程关闭,但我也找不到序列化/反序列化 GetCurrentProcess() 返回的进程句柄的方法
标签: java windows jna elevated-privileges