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

StackOverflow https://stackoverflow.com/questions/258728

Вопрос

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

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

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

Это было полезно?

Решение

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

Путь:HKEY_CURRENT_USER\Программное обеспечение\Microsoft\Windows NT\Currentversion\Appcompatflags\слои

Клавиша:<< Полный путь к исполняемому файлу >>

Значение:ЗАПУСК АДМИНИСТРАТОРА

Тип: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>

мое приложение.манифест:

<?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.

Я еще не нашел лучшего решения. Но у меня есть альтернативный обходной путь по сравнению с & "James Van Huis &". Вместо этого используйте 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"
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top