繁体   English   中英

在Windows上以管理员身份运行Java应用程序

[英]Run Java application as administrator on Windows

我正在用Java编写安装程序,因此需要提升权限才能访问Program Files目录。 根据我在网上找到的信息,我编写了如下实现:

public static void main(String args[]) {
    if (!checkPrivileges()) { // spawn a copy w/ elevated privileges
        Runtime runtime = Runtime.getRuntime();
        try {
            Process p = runtime.exec(
                "runas /profile /user:Administrator \"java -cp . main.Main\"");
        } catch (IOException e) { ... }
    } else {
        // Run with elevated privileges
    }
}

我用于检查权限的测试稍微修改一下,在这里找到的答案如下所示:

private static boolean checkPrivileges() {
    File testPriv = new File("C:\\Program Files\\");
    if (!testPriv.canWrite()) return false;
    File fileTest = null;
    try {
        fileTest = File.createTempFile("test", ".dll", testPriv);
    } catch (IOException e) {
        return false;
    } finally {
        if (fileTest != null)
            fileTest.delete();
    }
    return true;
}

当我运行它时,它失败了特权测试 - 正如预期的那样 - 并调用exec。 通过查看p.isAlive()检查调用是否有效,这表明该进程实际上是活着的; 但是,我没有看到任何新进程的证据,Windows也没有提示我授予权限。

我不熟悉在Java中使用exec() ,所以很可能我以某种方式误解了它的用法。 就此而言,我试图在这里做甚么可能吗? 如果没有,是否有一个直接的选择,实际上会得到我正在寻找的结果?

好的,我终于设法找到了一个我很满意的问题的解决方案; 它有点丑陋,但它适用于我正在做的事情。

我借用了这个答案中的代码来实现特权提升; 从那里,问题是实际上获得使用Java的解决方案之一。 代码最终看起来像这样:

    if (!checkPrivileges()) {
        try {
            String jarPath = DownloaderMain.class.getProtectionDomain().getCodeSource().getLocation().getPath();
            String decodedPath = URLDecoder.decode(jarPath, "UTF-8");
            decodedPath = decodedPath.substring(1, decodedPath.length());
            Elevator.executeAsAdministrator(System.getProperty("java.home") + "\\bin\\java", "-jar " + "\"" + decodedPath + "\"");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    } else {
        // Run with elevated privileges
    }

checkPrivileges方法从上面保持不变, Elevator类几乎与链接解决方案中出现的相同(我刚刚取出了不需要的main方法)。 该解决方案假设要升高的过程是一个罐子; 改变这一点以满足您的个人需求应该不会太难。

我认为实现这一目标的最佳方法是使用microsoft为开发人员构建的工具,因为您无法在简单的Java中实现。 在这种情况下使用清单文件http://msdn.microsoft.com/en-us/library/aa375632(v=vs.85).aspx只需构建包装器.exe,请求此权限,然后生成您的java程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM