24

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

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

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

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

runas /user:Administrator myjar.jar

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

4

4 回答 4

46

这个答案适用于那些愿意为其 jar 或 java 类提供管理权限的人。成功开发 exe 以编辑保存在管理员中的文件后。受限目录,我已经为你制定了这些步骤,希望这可以帮助你: 需要理解的事情:1)Jars不会直接使用特权编译,你必须用其他一些mainfest文件包装它们才能最终拥有exe能够在具有权限的 windows xp/vista/ 或更高版本上运行的文件。实际上,直到现在可能的答案是,在运行之前,exe 强制用户授予管理员权限,这与以前用户应该知道如何使用不友好的管理员权限运行 jar 不同。

现在简单的步骤:

  1. 创建你的 jar 文件,比如 try2.jar,其中包含一些 mainifest 文件——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 列中添加此文件清单文件。然后单击“保存配置”选项,然后单击--Build Wrapper。

现在你有了包含你的 jar 的 exe,它要求用户在执行之前给予管理员权限。现在用户无需知道点击以外的任何内容!

于 2014-03-01T06:18:39.937 回答
8

我在https://github.com/rritoch/super-user-application的 github 上为这个问题创建了一个通用的基于 Java 的解决方案。系统使用 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。

随意为这个项目做出贡献。

于 2015-04-28T11:56:57.050 回答
1

以管理员模式运行命令提示符。更具体地说:

  1. 找到%windir%\system32\cmd.exe文件。
  2. 右键单击和run as administrator特权。
于 2015-03-09T06:16:37.843 回答
1

使用 Gradle

您还可以使用 Gradle 和launch4j 插件从Ashium 答案的第 3 步开始myapp.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>  

然后添加到您的build.gradle

plugins {
  id 'java'
  id 'edu.sc.seis.launch4j' version '2.4.3'
}

launch4j {
    mainClassName = 'com.mypackage.MainClass'
    icon = "$projectDir/icons/icon.ico"
    manifest = "$projectDir/myapp.manifest"
}
于 2018-04-05T06:47:41.873 回答