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

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

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

Однако это дополнительный шаг, который требуется, и пользователи могут не знать об этом. Когда пользователь просто дважды щелкает значок приложения, произойдет сбой с отказом в доступе. У меня вопрос: как заставить Java-приложение повторно использовать права администратора сразу после запуска?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
9
0
15 895
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

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

Path: HKEY_CURRENT_USER\Software\Microsoft\Windows NT\Currentversion\Appcompatflags\layers

Key: << Full path to exe >>

Value: RUNASADMIN

Type: REG_SZ

Я не уверен, что хотел бы установить этот флаг на javaw.exe!

finnw 13.02.2010 14:15

Вам не нужны права администратора для редактирования реестра

Conner Dassen 06.06.2018 09:50

Я пока не нашел лучшего решения. Но у меня есть альтернативный обходной путь по сравнению с "Джеймсом Ван Хьюисом". Вместо этого используйте 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"
}

Другие вопросы по теме