以管理员身份以完全权限运行 Java 文件

2022-09-01 20:09:28

我已经制作了一个Java应用程序,并在我的PC和我的创造的PC上测试了它,到目前为止,一切都很好......但是这个应用程序是为我的另一个朋友准备的,他们有一个迪斯科,当我在他的电脑(Windows Vista 32位)上“安装”我的应用程序时,它不起作用,然后我去搜索和搜索,我发现问题作为特权...我安装了 vista 32 位和 xp 32 位的虚拟机来执行一些测试,但我无法使用完全管理员权限运行我的应用程序。

有没有办法创建批处理文件或允许我以所有权限运行应用程序的内容?我的意思是所有,因为我需要连接到计算机的COM端口才能从设备获取一些数据,并且我需要存储一些文件,并且由于我使用的是外部库,因此我可能需要一些我不知道的权限...我已经尝试过这个,没有任何效果:

elevate "c:\Program Files\Java\jre\bin\java.exe" -jar "%CD%\installer.jar"

使用微软的提升脚本,我还创建了一个批处理文件

runas /user:Administrator myjar.jar

但没有任何效果:\有什么想法吗?提前感谢您


答案 1

这个答案是为那些愿意为他们的jar或java类提供管理特权的人准备的。在成功开发了一个exe来编辑保存在admin.受限目录中的文件后,我开发了这些步骤来遵循,希望这可以帮助你:1)Jars不会直接使用权限编译,而是必须将它们与其他一些mainfest文件打包在一起,最终拥有能够在Windows xp / vista /或更高版本上运行的exe文件。实际上,现在可能的答案是,在运行之前,exe强制用户授予管理员权限,这与以前不同,用户应该知道如何使用管理员权限运行jar,这并不友好。

现在简单的步骤:

  1. 创建你的jar文件,如try2.jar包含一些主文件 - My1.mf一如既往。因此,jar 文件的绝对路径为 C:\try.jar。

  2. 现在,您需要下载一个软件“Launch4j”,它将帮助您包装jar文件。其下载链接是:http://sourceforge.net/projects/launch4j/files/launch4j-3/3.1.0-beta2/

  3. 现在拿出5分钟并观看本教程:http://www.youtube.com/watch?v=mARUFRknTYQ;这将告诉您Launch4j的基本功能。但在这里,不清楚如何为您的exe创建清单文件。

  4. 了解这一点后,然后创建一个清单文件,它是一个简单的文本文件,扩展名为“.manifest”。但是这里有一些事情需要注意:首先,您的mainfest文件必须与要创建的最终exe具有相同的名称。在我的情况下,我的exe的名字应该是“Launchme.exe”,因此,我的清单文件必须命名为“Launchme.manifest”。其次,在清单文件中只需复制此内容:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
    <requestedPrivileges>
    <requestedExecutionLevel level="highestAvailable"   uiAccess="False" />
    </requestedPrivileges>
    </security>
    </trustInfo>
    </assembly>  
    

将上述代码复制到清单文件中。这里的第6行是整个问题的关键。然后保存并关闭它。

  1. 现在启动Launch4j,根据您的条件填写所有教学文本字段,就像在视频中一样。在 Wrapper mainfest 列中,添加此文件清单文件。然后单击“保存配置”选项,然后单击 - 构建包装器。

现在,您已经拥有了包含您的jar的exe,该jar请求用户在执行之前授予管理员权限。现在,用户除了点击之外,什么都不知道!


答案 2

我已经在github上为这个问题创建了一个通用的基于Java的解决方案,https://github.com/rritoch/super-user-application。系统使用 JNA 或 Sudo 提供以管理员权限执行的跨平台 Java 应用程序 (jar)。使用它的最简单方法是让你的主类扩展抽象类SuperUserApplication,并从你的主函数调用SU.run(new MyMain(),args),如下所示。

package com.vnetpublishing.java;

import com.vnetpublishing.java.suapp.SU;
import com.vnetpublishing.java.suapp.SuperUserApplication;

public class TestAdmin extends SuperUserApplication {

    public static void main(String[] args) {
        SU.run(new TestAdmin(), args);
    }

    public int run(String[] args) {
        System.out.println("RUN AS ADMIN! YAY!");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return 0;
    }
}

这个库已经在linux和Windows上进行了测试,但也应该适用于Mac / OSX。此解决方案的主要缺点是它仅在应用程序作为jar执行时起作用。当执行的 jar 没有管理员权限时,它需要使用管理员权限重新执行 jar。如果应用程序不是从 jar 中运行的,则会引发 InvalidStateException。

请随时为这个项目做出贡献。


推荐