代码之家  ›  专栏  ›  技术社区  ›  Markus Lausberg

在Vista上启动具有管理员权限的Java运行时进程

  •  4
  • Markus Lausberg  · 技术社区  · 15 年前

    我想执行一个StupU.EXE安装程序,用Java 1.6在Vista上安装一个软件。

    用户不是管理员。当我尝试启动该进程时,会收到错误消息:

    CreateProcess error=740
    

    这表示用户没有足够的权限启动进程。

    我可以提交一个标志或一个选项来指示流程应该以管理员权限执行吗?Vista本身在菜单工具栏中有这个功能。我能在Java中使用这个函数吗?

    我叫以下代码

            Runtime rt = Runtime.getRuntime();
            Process process;
            try {
                String fileToExecute = new File(mFolder, mSetupFiles[0]).getCanonicalPath();
    
                if (logger.isDebugEnabled()) {
                    logger.debug("Execute runtime process");
                }
                process = rt.exec(fileToExecute, null, mFolder);
    
                process.getErrorStream().close();
                process.getInputStream().close();
                process.getOutputStream().close();
    
                if (logger.isDebugEnabled()) {
                    logger.debug("Wait until process is finished");
                }
                process.waitFor();
            } catch (IOException e) {
                throw new StartException(e);
            } catch (InterruptedException e) {
                throw new StartException(e);
            }
    
    2 回复  |  直到 14 年前
        1
  •  3
  •   Community Egal    7 年前

    (我没有尝试过),但似乎您可以使用“提升”程序从 here

    同时阅读 this 对于UAC概述

        2
  •  2
  •   Markus Lausberg    15 年前

    经过2天的测试,我发现了以下解决方案。

    激活Vista UAC功能时会出现错误。每当流程需要管理员权限时,UAC都会显示一个问题对话框。

    显示此对话框会导致问题。

    而不是使用旧的

    process = rt.exec(fileToExecute, null, mFolder);
    

    命令,我现在使用新的1.5 ProcessBuilder 命令

    编辑:

    为了避免这个问题,您必须打开一个请求权限的命令窗口。而不是你必须调用外部过程。

    ProcessBuilder builder = new ProcessBuilder(new String[] { "cmd.exe", "/C", fileToExecute });
    

    这里也描述了 Execute an external Program