Запросить права администратора для приложения Java в Windows Vista

когда я пытаюсь создать новую задачу в планировщике задач через класс Java ProcessBuilder, я получаю ошибку отказа в доступе в Windows Vista. На XP он работает просто отлично.

когда я использую опцию "Запуск от имени администратора", она также работает на Vista..

однако это дополнительный шаг requeried пользователи могут не знать об этом. Когда пользователь просто дважды нажимает на значок приложения, он не сможет получить доступ. Мой вопрос в том, как я могу заставить приложение java reuest права администратора сразу после запуска?

5 ответов


Я не уверен, что вы можете сделать это программно. Если у вас есть установщик для вашего приложения, вы можете добавить раздел реестра для принудительного запуска от имени администратора:

путь: Раздел HKEY_CURRENT_USER Software\корпорация Майкрософт\Windows в NT\Currentversion\Appcompatflags\layers


вы рассматривали обертывание вашего приложения Java в an .exe с помощью launch4j? При этом вы можете встроить файл манифеста, который позволяет указать "уровень выполнения" для исполняемого файла. Другими словами, вы управляете привилегиями, которые должны быть предоставлены запущенному приложению, эффективно сообщая ОС "Запуск от имени администратора", не требуя от пользователя вручную сделать это.

для образец...

построить.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>

myapp.манифест:

<?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 для подробности режиме.


хотя ответ FreeCouch хорош, но я столкнулся с некоторой проблемой и подумал о том, чтобы поместить его здесь, чтобы в следующий раз другие могли легко извлечь выгоду.

чтобы получить разрешение администратора в Java, насколько я нашел решение, нужно обернуть *.фляги внутри *.exe с программой, как Launch4J и привязки манифеста с ним.

чтобы создать файл манифеста, откройте любой текстовый редактор, такой как Notepad, вставьте в него эти строки и сохраните его с именем файла вместе с расширением для e.g: myApplication.исполняемый.манифест

<?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, на Basic tab добавьте этот файл в параметр Манифеста оболочки.


Я еще не нашел лучшего решения. Но у меня есть альтернативная работа по сравнению с "James Van Huis". Вместо этого используйте RUNASINVOKE, чтобы не видеть приглашение разрешить / запретить каждый раз при запуске приложения.

Примечание: Вы всегда должны быть администратором, что я пытаюсь решить


использование плагина 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> 

затем примените плагин Gradle, добавив в свой 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"
}

или, если вы используете 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"
}