在Windows Vista上请求Java应用程序的管理员权限

当我尝试通过Java ProcessBuilder类在任务调度程序中创建一个新任务时,我得到一个访问被拒绝错误的Windows Vista。 在XP上它工作得很好。

当我使用“Run as adminstrator”选项时,它也可以在Vista上运行。

然而,这是一个额外的步骤,用户可能不知道这一点。 当用户只需双击应用程序图标时,它将失败并拒绝访问。 我的问题是如何强制java应用程序在启动后立即重新获得管理员权限?

我不确定你能以编程方式做到这一点。 如果您的应用程序有安装程序,则可以添加注册表项以强制运行为admin:

路径:HKEY_CURRENT_USER \ Software \ Microsoft \ Windows NT \ Currentversion \ Appcompatflags \ layers

关键:<< exe的完整路径>>

价值:RUNASADMIN

键入:REG_SZ

您是否考虑过使用launch4j在.exe中包装Java应用程序? 通过执行此操作,您可以嵌入清单文件,该文件允许您指定可执行文件的“执行级别”。 换句话说,您可以控制应该授予正在运行的应用程序的权限,从而有效地告诉操作系统“以管理员身份运行”,而无需用户手动执行此操作。

例如…

build.xml文件:

    

myappConfig.xml:

  false gui bin\myapp.jar bin\myapp.exe normal http://java.com/download true false myapp.manifest   1.5.0  preferJre   

myapp.manifest:

           

有关模式详细信息,请参阅http://msdn.microsoft.com/en-us/library/bb756929.aspx和launch4j网站。

虽然FreeCouch的答案很好,但我遇到了一些问题,并考虑将其放在这里,以便下次其他人可以轻松获益。

要获得Java中的管理员权限,据我所知,解决方案是使用Launch4J等程序将* .jar包装在* .exe中并使用它绑定Manifest。

要创建清单文件,请打开任何文本编辑器(如记事本)并将这些行粘贴到其中,并将其与文件名及其扩展名一起保存,例如: myApplication.exe.manifest

           

在Launch4J中,在Basic选项卡上,在Wrapper Manifest选项中添加此文件。

我还没有找到最好的解决方案。 但我有一个替代工作 – 与“詹姆斯范惠斯”相比。 请改用RUNASINVOKE,这样您每次运行应用程序时都不必看到提示允许/拒绝。

注意:你总是必须是管理员,这是我想要解决的问题

使用launch4j Gradle插件

特别是当已经使用Gradle时,很容易应用launch4j插件来解决这个问题。

在freecouch的回答中 ,创建一个文件myapp.manifest with

           

然后通过添加到build.gradle来应用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" } 

或者,如果使用Kotlin Gradle DSL,则使用build.gradle.kts

 plugins { application kotlin("jvm") version "1.2.31" java id("edu.sc.seis.launch4j") version "2.4.3" } launch4j { mainClassName = "com.mypackage.MainKt" icon = "$projectDir/icons/icon.ico" manifest = "$projectDir/myapp.manifest" }