Запросить права администратора для приложения Java в Windows Vista
Когда я пытаюсь создать новую задачу в планировщике задач через класс Java ProcessBuilder, я получаю сообщение об ошибке отказа в доступе в Windows Vista. На XP работает просто отлично.
Когда я использую опцию "Запуск от имени администратора", она также работает в Vista.
Однако это дополнительный шаг, который пользователи могут не знать об этом. Когда пользователь просто дважды щелкнет значок приложения, произойдет сбой при отказе в доступе. Мой вопрос: как я могу заставить приложение Java повторно получить права администратора сразу после запуска?
5 ответов
Я не уверен, что вы можете сделать это программно. Если у вас есть установщик для вашего приложения, вы можете добавить раздел реестра для принудительного запуска от имени администратора:
Путь: HKEY_CURRENT_USER\ Программное обеспечение \Microsoft\Windows NT\Currentversion\Appcompatflags\layer
Ключ: << Полный путь к exe >>
Значение: РУНАСАДМИН
Тип: REG_SZ
Рассматривали ли вы оборачивать ваше Java-приложение в.exe с помощью launch4j? Делая это, вы можете встроить файл манифеста, который позволяет вам указать "уровень выполнения" для вашего исполняемого файла. Другими словами, вы управляете привилегиями, которые должны быть предоставлены вашему запущенному приложению, фактически сообщая операционной системе "Запуск от имени администратора", не требуя, чтобы пользователь делал это вручную.
Например...
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>
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>
См. Http://msdn.microsoft.com/en-us/library/bb756929.aspx и веб-сайт launch4j для получения подробной информации о режиме.
Хотя ответ FreeCouch хорош, но я столкнулся с некоторой проблемой и подумал о том, чтобы поставить ее здесь, чтобы в следующий раз можно было легко воспользоваться другими.
Чтобы получить разрешение администратора в Java, насколько я обнаружил, решение состоит в том, чтобы обернуть *.jar внутри *.exe с помощью программы, такой как Launch4J, и связать с ней Manifest.
Чтобы создать файл манифеста, откройте любой текстовый редактор, например Блокнот, вставьте в него эти строки и сохраните его вместе с именем файла и его расширением, например, для 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, на Basic
добавьте этот файл в опцию Wrapper Manifest.
Я еще не нашел лучшего решения. Но у меня есть альтернативный обходной путь по сравнению с "Джеймсом Ван Хьюисом". Вместо этого используйте RUNASINVOKE, чтобы вам не приходилось видеть подсказку Allow/Deny при каждом запуске приложения.
Примечание: вы всегда должны быть администратором, вот что я пытаюсь решить
Использование плагина 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"
}