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

9
当我通过Java ProcessBuilder类尝试在任务计划程序中创建新任务时,在Windows Vista上会出现访问被拒绝的错误。但在XP上可以正常工作。
当我使用“以管理员身份运行”选项时,它在Vista上也可以运行。
然而,这是一个额外的步骤,用户可能不知道。当用户只是双击应用程序图标时,将会出现访问被拒绝的错误。我的问题是,如何在启动后立即强制要求Java应用程序请求管理员特权?
5个回答

23

您考虑过使用launch4j将Java应用程序封装为.exe文件吗?通过这样做,您可以嵌入一个清单文件,允许您指定可执行文件的“执行级别”。换句话说,您可以控制应用程序应被授予的特权,有效地告诉操作系统“以管理员身份运行”,而不需要用户手动执行此操作。

例如...

build.xml:

<target name="wrapMyApp" depends="myapp.jar">
        <launch4j configFile="myappConfig.xml" />
</target>

myappConfig.xml:

<launch4jConfig>
  <dontWrapJar>false</dontWrapJar>
  <headerType>gui</headerType>
  <jar>bin\myapp.jar</jar>
  <outfile>bin\myapp.exe</outfile>
  <priority>normal</priority>
  <downloadUrl>http://java.com/download</downloadUrl>
  <customProcName>true</customProcName>
  <stayAlive>false</stayAlive>
  <manifest>myapp.manifest</manifest>
  <jre>
    <path></path>
    <minVersion>1.5.0</minVersion>
    <maxVersion></maxVersion>
    <jdkPreference>preferJre</jdkPreference>
  </jre>
</launch4jConfig>

我的应用程序清单:

<?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>  

请查看http://msdn.microsoft.com/en-us/library/bb756929.aspx和launch4j网站,以获取更多详细信息。


3

我不确定您是否可以通过编程实现。如果您有应用程序的安装程序,您可以添加注册表键以强制以管理员身份运行:

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

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

值:RUNASADMIN

类型:REG_SZ


12
我不确定我是否想要在javaw.exe上设置那个标志! - finnw
你需要管理员权限才能编辑注册表。 - Conner Dassen

1
尽管FreeCouch的答案很好,但我遇到了一些问题,并想在这里分享,以便下次其他人可以轻松受益。
要在Java中获得管理员权限,据我所知的解决方案是使用类似于Launch4J的程序将*.jar包装在*.exe中,并与之绑定清单。
要创建一个清单文件,请打开任何文本编辑器(如记事本),并在其中粘贴这些行,然后将其保存为文件名及其扩展名,例如:myApplication.exe.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>  

在Launch4J中,在“基本”选项卡上,将此文件添加到包装器清单选项中。

0

使用launch4j Gradle插件

特别是在已经使用Gradle的情况下,应用launch4j插件来解决这个问题非常容易。

freecouch的回答中所述,创建一个名为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中来应用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"
}

0

我还没有找到最好的解决方案。但是我有一个替代方法,与“James Van Huis”进行比较。使用RUNASINVOKE而不是每次运行应用程序时都要看到提示允许/拒绝。

注意:您始终必须是管理员,这就是我正在尝试解决的问题


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接