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

2023-12-04

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

我不熟悉使用exec()在Java中,所以很可能我以某种方式误解了它的用法。就此而言,我在这里尝试做的事情可能吗?如果没有,是否有一个简单的替代方案可以真正让我得到我正在寻找的结果?


好吧,我终于找到了一个令我满意的解决方案;这有点难看,但它适合我正在做的事情。

我借用了代码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
    }

The checkPrivileges方法与上面相同,并且Elevator类实际上与链接解决方案中出现的类完全相同(我只是取出了不需要的main方法)。该方案假设要提升的进程是一个jar;改变它以满足您的个人需求应该不会太困难。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Windows 上以管理员身份运行 Java 应用程序 的相关文章

随机推荐

  • 如何在 Java 中按值(ArrayList)大小对 Map 进行排序?

    我有以下地图 Map
  • 为 Google.Apis.YouTube.v3 设置代理

    我有以下代码来调用 YouTubeService service new YouTubeService new BaseClientService Initializer ApiKey AppSettings Variables YouTu
  • docker内部和外部用户之间的混淆

    所以 我正在内部使用 apache2 构建一个 docker 容器 但我遇到权限问题 我不知道如何解决它 如果我运行没有 user 规范的容器 它运行良好 但我想外在地能够将其分配给用户并限制该用户只能读取和写入特定目录 我使用 v 映射的
  • 所有 OpenMP 任务在同一线程上运行

    我使用 OpenMP 中的任务编写了一个递归并行函数 虽然它给了我正确的答案并且运行良好 但我认为并行性存在问题 与串行解决方案相比 运行时间在我在没有任务的情况下解决的相同其他并行问题中无法扩展 当打印任务的每个线程时 它们都在线程 0
  • 打印给定 pid 的子进程 (MINIX)

    我目前正在开发一个项目 作为该项目的一部分 我需要在 MINIX 中实现系统调用 库函数 作为其中的一部分 我需要能够使用给定进程的 pid 打印其子进程列表 我想我已经找到了我需要的部分内容 但我坚持让它与给定的 pid 一起工作 str
  • Python 的 SSH 隧道自动关闭

    我需要一些关于我的程序结构的建议 我正在使用连接到外部 MySQL 数据库ssh隧道 现在它可以正常工作 我可以发出 SQL 命令并获取结果 但前提是这些命令与打开连接的函数相同 如果它们处于不同的功能 隧道会在我使用之前自动关闭 参见下面
  • GemBox 从电子表格或 Flexcel 检索计算值

    根据他们的文档 GemBox Spreadsheet可以读取和写入公式 但不能计算公式结果 当您在 MS Excel 中打开 XLS 文件时 将自动计算公式结果 因此 如果我创建一个包含一些注入值的电子表格并将其保存到磁盘 如果我在 Exc
  • 如何获取准确的拨出电话接听时间?

    我是安卓新手 我正在实现一个与来电和去电详细信息相关的应用程序 我通过使用广播接收器获取拨出电话和来电详细信息 问题是当有来电时广播接收器会上升 我拨打广播接收器拨打的电话 很好 但是当我单击绿色按钮时 拨出电话就会开始 但是 我想要接听对
  • 深拷贝和浅拷贝有什么区别?

    这个问题的答案是社区努力 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 深拷贝和浅拷贝有什么区别 广度与深度 考虑以对象作为根节点的引用树 Shallow 变量 A 和 B 引用不同的内存区域 当将 B 分配给 A 时 这两个变量引
  • SQL Server 2008 - 高级搜索/排序

    我需要对列进行搜索并按特定顺序对结果进行排序 搜索条件和排序顺序如下 给定搜索文本的至少 x 和至多所有字符必须匹配 结果应按开头 然后按匹配的字符数排序 和包含 然后按匹配的字符数和字母顺序排序 进行分组 例如 搜索文本 联盟A 数据库中
  • Java 在 JTextPane 上设置缩进大小

    我想设置制表符 t 的大小JTextPane宽度为 4 个空格 经过一番谷歌搜索后 我发现了一些东西 我将在这里包含我所尝试过的东西以及它们失败的原因 如何在 JEditorPane 中设置选项卡大小 JTextPane不是一个普通的文档
  • Windows Phone 7 和 System.Xml.Linq 库

    我正在尝试遵循有关 WP7 开发的教程 http mobile tutsplus com tutorials windows introduction to windows mobile 7 development 它谈论的是使用 XEle
  • TFF 加载预训练的 Keras 模型

    我的目标是从 hdf5 文件加载基本模型 它是 Keras 模型 并继续通过联合学习对其进行训练 以下是我初始化 FL 基本模型的方法 def model fn model tf keras load model path to model
  • WIF STS ID3242:无法对安全令牌进行身份验证或授权

    当我的客户端应用程序尝试对我的服务进行身份验证时 我收到以下错误 ID3242 无法对安全令牌进行身份验证或授权 这是客户端的配置
  • POST 请求中的 PHP Post 请求

    有一个联系表格 当前的操作是http www siteA com ContactInfo php 它发送字段和值 在 ContactInfo php 中 我只是捕获值并将其发送并通过电子邮件发送至 电子邮件受保护 但是 在 ContactI
  • 使用 GhostDriver 时如何设置屏幕/窗口大小

    我在一个基于 Java 的项目中使用 GhostDriver 作为 WebDriver 实现 我想拍摄页面快照 默认的页面大小有点尴尬 所以我想控制快照的页面大小 但是 我无法从 Google 找到任何示例 那么 有人可以告诉我怎么做吗 非
  • 有没有办法在多行代码中添加注释?

    这不起作用 something line of code Comment another line of code Comment and another one Comment etc 这也不 something Comment line
  • 循环堆积图 - 两组值之间的转换

    我有一个非常类似于的图表圆形包装 在某些时候 用户希望看到一些不同的数据 显然 可以立即显示不同的图表 但从感知和认知的角度来看 过渡会更好 注意 层次结构保持不变 没有新的或删除的节点 只有确定圆大小变化的基础值 实施这样的好方法是什么两
  • 如何模拟来自 Junit 的内部方法的调用

    我有 MyClass 我正在为每个方法做一个测试类 Method1Test public class MyClass public int method1 int a method2 return a public int method2
  • 在 Windows 上以管理员身份运行 Java 应用程序

    我正在用 Java 编写一个安装程序 因此需要提升权限才能访问 Program Files 目录 根据网上查到的资料 我写了一个实现 如下 public static void main String args if checkPrivil