我正在编写一个Java安装程序,因此需要提升特权才能访问Program Files目录。 根据我在网上find的信息,我写了一个实现如下:
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 } }
我用来检查权限的testing从这里find的答案略有修改,看起来像这样:
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; }
当我运行这个,它的特权testing失败 – 如预期 – 并调用exec。 通过查看p.isAlive()
检查调用是否工作,表明该过程实际上是活着的; 但是,我没有看到新进程的任何证据,Windows并没有提示我授予权限。
我不熟悉在Java中使用exec()
,所以我很可能以某种方式误解了它的用法。 对于这个问题,我在这里试图做甚么? 如果没有,是否有一个直接的select,实际上会让我得到我期待的结果?
好吧,我终于设法解决了这个我很高兴的问题。 这有点丑陋的一面,但它适用于我在做什么。
我借用这个答案的代码来做实际的特权提升。 从那里,问题是实际得到解决方案与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程序。