Запросить права администратора для приложения Java в Windows Vista - PullRequest
9 голосов
/ 03 ноября 2008

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

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

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

Ответы [ 5 ]

24 голосов
/ 23 февраля 2010

Рассматривали ли вы оборачивание вашего 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.

3 голосов
/ 03 ноября 2008

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

Путь: HKEY_CURRENT_USER \ Software \ Microsoft \ Windows NT \ CurrentVersion \ Appcompatflags \ слои

Ключ: << Полный путь к exe >>

Значение: RUNASADMIN

Тип: REG_SZ

2 голосов
/ 10 ноября 2014

Хотя ответ 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.

0 голосов
/ 04 апреля 2018

Использование плагина launch4j Gradle

Особенно, когда уже используется Gradle, легко применить плагин launch4j , чтобы это исправить.

Как и в freecouch 'answer , создайте файл 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"
}
0 голосов
/ 13 февраля 2010

Я еще не нашел лучшего решения. Но у меня есть альтернативный обходной путь по сравнению с «Джеймсом Ван Хьюисом». Вместо этого используйте RUNASINVOKE, чтобы вам не приходилось видеть подсказку Allow / Deny при каждом запуске приложения.

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

...