Когда я пытаюсь создать новую задачу в планировщике задач через класс Java ProcessBuilder, я получаю ошибку отказа в доступе в Windows Vista. На XP работает нормально.
Когда я использую опцию «Запуск от имени администратора», она работает и в Vista.
Однако это дополнительный шаг, который требуется, и пользователи могут не знать об этом. Когда пользователь просто дважды щелкает значок приложения, произойдет сбой с отказом в доступе. У меня вопрос: как заставить Java-приложение повторно использовать права администратора сразу после запуска?




Не уверен, что можно сделать это программно. Если у вас есть установщик для вашего приложения, вы можете добавить раздел реестра для принудительного запуска от имени администратора:
Path: HKEY_CURRENT_USER\Software\Microsoft\Windows NT\Currentversion\Appcompatflags\layers
Key: << Full path to exe >>
Value: RUNASADMIN
Type: REG_SZ
Вам не нужны права администратора для редактирования реестра
Я пока не нашел лучшего решения. Но у меня есть альтернативный обходной путь по сравнению с "Джеймсом Ван Хьюисом". Вместо этого используйте RUNASINVOKE, чтобы вам не приходилось видеть приглашение Разрешить / Запретить каждый раз при запуске приложения.
Примечание: вы всегда должны быть администратором, это то, что я пытаюсь решить
Думали ли вы о том, чтобы обернуть свое 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.
Использование плагина launch4j Gradle
Это легко исправить, особенно если вы уже используете Gradle.
Как и в 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"
}
Я не уверен, что хотел бы установить этот флаг на
javaw.exe!