当前位置: 首页 > 面试题库 >

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

阚小云
2023-03-14
问题内容

我正在用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也没有提示我授予权限。

我对使用exec()Java
不熟悉,因此很可能以某种方式误解了它的用法。因此,我在这里尝试做的事情是否可能?如果没有,有没有一种直接的替代方法可以真正为我获得所需的结果?


问题答案:

好的,我终于设法解决了一个我很满意的问题;这有点丑陋,但它可以满足我的需求。

我从借来的代码这个答案做实际的权限提升;
从那里开始,问题是实际上使该解决方案与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方法)。该解决方案假定要提升的过程是一个罐子;可以根据自己的需要进行更改,这并不难。



 类似资料:
  • 问题内容: 我有一个Java应用程序。无论如何,在Windows 7上,我是否可以知道该进程是否以管理员权限运行。 问题答案: 我在网上找到了此代码段,我认为它将为您完成这项工作。 它仅适用于Windows,并内置于核心Java包中。我刚刚测试了这段代码,它确实起作用了。它使我感到惊讶,但确实如此。 SID S-1-5-32-544是Windows操作系统中Administrator组的ID。 以

  • 问题内容: Java中是否有一种方法可以要求系统控制管理员功能。当然不做:右键单击exe->以admin身份运行。 我想要的是UAC提供的框架,例如Windows Vista或Windows 7。 还是在从jar中制作exe时进行一些设置? 问题答案: 你必须创建一个清单文件,该清单文件指定你的应用程序需要管理员权限。你可以将清单包含在exe中,也可以将其保留为单独的文件(yourapp.exe.

  • 本文向大家介绍c#通过app.manifest使程序以管理员身份运行,包括了c#通过app.manifest使程序以管理员身份运行的使用技巧和注意事项,需要的朋友参考一下 微软在Windows Vista开始引入了UAC(用户帐户控制)新技术(点击这儿了解什么是UAC)。当程序执行时需要权限的话,UAC会弹出警告消息:让用户确认是否同意允许这个程序改变你的计算机配置,windows需要得到你的许可

  • 问题内容: 到目前为止,我已经制作了一个Java应用程序,并在我的PC和铸造的PC中对其进行了测试。但是当我将我的应用程序“安装”到他的PC上时,该应用程序是我的另一个有迪斯科舞厅的朋友( Windows Vista 32位)无法正常工作,然后我继续搜索并发现问题是特权…我安装了Vista 32位和XP 32位虚拟机进行一些测试,我我无法使用管理员权限来运行我的应用程序。 有什么方法可以创建批处理

  • 问题内容: 我正在开发一个小型关机计划程序项目,在该项目中,我必须将计算机置于模式下。我正在使用的命令是 此命令需要管理员权限,我不知道该如何获得。另外,在搜索以前的答案时,我发现我可以用作 正在执行任务,但正在浪费太多时间,即使软件变慢。还有其他快速方法吗?我正在使用Netbeans IDE。 问题答案: 您有几种选择 A.使用admin priv创建快捷方式。 快捷方式将运行 您的Java代码

  • 本文向大家介绍C#中用管理员身份运行程序代码实例,包括了C#中用管理员身份运行程序代码实例的使用技巧和注意事项,需要的朋友参考一下