Java 如果ShellExecuteEx的调用方死亡,则停止JVM windows进程

Java 如果ShellExecuteEx的调用方死亡,则停止JVM windows进程,java,windows,jna,elevated-privileges,Java,Windows,Jna,Elevated Privileges,我创建了一个java库,它以管理员权限提升从JAR运行的java应用程序。在linux上,这可以正常工作,如果我在linux中按CTRL-C退出应用程序,则以sudo启动的提升应用程序将按预期停止。在windows上,这不是行为。当我使用CTRL-C退出时,管理员进程将继续运行,我需要从任务管理器手动停止它 请参阅代码@ 如何使使用JPA/ShellExecuteEx创建的进程在调用进程死亡时自动终止,例如当用户通过键入CTRL-C退出时?作为此问题的临时解决方案,我添加了一个关闭钩子来结束子进

我创建了一个java库,它以管理员权限提升从JAR运行的java应用程序。在linux上,这可以正常工作,如果我在linux中按CTRL-C退出应用程序,则以sudo启动的提升应用程序将按预期停止。在windows上,这不是行为。当我使用CTRL-C退出时,管理员进程将继续运行,我需要从任务管理器手动停止它

请参阅代码@


如何使使用JPA/ShellExecuteEx创建的进程在调用进程死亡时自动终止,例如当用户通过键入CTRL-C退出时?

作为此问题的临时解决方案,我添加了一个关闭钩子来结束子进程。这不是一个理想的解决方案,因为如果强制退出父进程,则不会运行shutdownHook,并且子进程会继续运行,但这会处理CTRL-C启动的退出

    final HANDLE childProcess = execInfo.hProcess;

    Thread shutdownHook = new Thread() {
        @Override
        public void run() {
            System.out.println("Terminating child process");
            Kernel32.INSTANCE.TerminateProcess(childProcess, 0);
            Kernel32X.INSTANCE.CloseHandle(childProcess);
            Kernel32X.INSTANCE.CloseHandle(hJob);
        }
    };

    Runtime.getRuntime().addShutdownHook(shutdownHook);

将进程句柄添加到配置了JOB\u OBJECT\u LIMIT\u KILL\u ON\u JOB\u CLOSE.eryksun的。我按照您的建议添加了一个JOB对象,但它仍然不起作用。从我的研究中可以看出,ShellExecuteEx可能没有设置CREATE\u breakout\u From\u JOB,我看不到任何选项可以这样做。我已经按照您的建议提交了代码,但它仍然不起作用。您没有检查错误,因此如何知道它是否已成功添加和配置?您应该首先调用QueryInformationJobObject来获取并修改当前JobObjectExtendedLimitInformation 9。确保它是扩展信息;您当前正在设置JobObjectBasicLimitInformation 2.eryksun,我添加了全面的错误检查,添加了QueryInformation JobObject调用,并按照您的建议更改为JobObjectExtendedLimitInformation 9,即使每个函数调用都成功,但当父用户进程终止时,子管理进程仍不会终止。eryksun,我认为应该可以序列化当前进程句柄,并将其作为命令行参数传递给子进程,然后让父进程对其进行反序列化,并在父进程关闭时运行间隔以退出,但是我也找不到一种方法来序列化/反序列化GetCurrentProcess返回的进程句柄。您解决了这个问题吗?我有一个类似的问题,看不,这是我能想到的最好的我解决了我的问题,看这里