我正在用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
}
}
我用来检查权限的测试会从找到的答案here略微修改,如下所示:
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()
,因此很可能我以某种方式误解了它的用法。就此而言,我试图在这里做什么甚至可能?如果没有,是否有一个直接的选择,实际上会让我得到我正在寻找的结果?
答案 0 :(得分:1)
好的,我终于设法找到了这个问题的解决方案,我很满意;它有点丑陋,但它适用于我正在做的事情。
我借用this回答的代码来做实际的特权提升;从那里,问题是实际上获得使用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
方法)。该解决方案假设要升高的过程是一个罐子;改变这一点以满足您的个人需求应该不会太难。
答案 1 :(得分:0)
我认为实现这一目标的最佳方法是使用microsoft为开发人员构建的工具,因为您无法在简单的Java中执行此操作。在这种情况下,使用清单文件 http://msdn.microsoft.com/en-us/library/aa375632(v=vs.85).aspx 只需构建包装器.exe,要求获得此权限,然后生成java程序。