privilégios pedido de administração para aplicativo Java no Windows Vista
-
06-07-2019 - |
Pergunta
Quando tento criar uma nova tarefa no Agendador de tarefas através da classe Java ProcessBuilder eu recebo um erro de acesso negado um Windows Vista. No XP ele funciona muito bem.
Quando eu use a opção "Executar como administrador" ele é executado no Vista, bem ..
No entanto, este é um passo adicional consultada um os usuários podem não saber sobre isso. Quando o usuário só clicar duas vezes sobre o aplicativo ícone ele irá falhar com acesso negado. A minha pergunta é como eu pode forçar um aplicativo java para reuest privilégios de administrador logo após a inicialização?
Solução
Eu não tenho certeza que você pode fazê-lo por meio de programação. Se você tem um instalador para o seu aplicativo, você pode adicionar a chave Registro para forçar executado como admin:
Caminho: HKEY_CURRENT_USER \ Software \ Microsoft \ Windows NT \ CurrentVersion \ AppCompatFlags \ camadas
Key: << Caminho completo para exe >>
Valor: RunAsAdmin
Tipo: REG_SZ
Outras dicas
Você já considerou envolvendo seu aplicativo Java em um .exe usando launch4j? Ao fazer isso você pode incorporar um arquivo de manifesto que permite que você especifique o "nível de execução" para o seu executável. Em outras palavras, você controla os privilégios que devem ser concedidos para a sua aplicação em execução, dizendo efetivamente o sistema operacional para "Executar como administrador" sem que o usuário de fazer manualmente-lo.
Por exemplo ...
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 e no site da launch4j para detalhes da modalidade.
A resposta de Embora FreeCouch é bom, mas eu enfrentei alguns problemas e pensei em colocá-lo aqui para próximos outros horários pode ser beneficiado com facilidade.
Para obter permissão de administrador em Java, tanto quanto eu encontrei a solução é envolver o .jar * dentro de um .exe * com programa como Launch4J e manifestar ligação com ele.
Para criar um arquivo de manifesto, Abra qualquer editor de texto como o bloco de notas e cole essas linhas nele e salve-o com o nome do arquivo, juntamente com a sua extensão para, por exemplo: 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>
Em Launch4J, na guia Basic
adicionar este arquivo opção Wrapper manifesto em.
Eu não encontrei a melhor solução ainda. Mas eu tenho uma solução alternativa alternativa comparando com "James Van Huis". Use RUNASINVOKE vez para que você não tem que ver o prompt Permitir / Negar toda vez que você executar o aplicativo.
Nota: você sempre tem de ser administrador, que o que eu estou tentando resolver
Usando o launch4j Gradle plug-in
Especialmente quando já usando Gradle, é fácil de aplicar o launch4j plug-in para corrigir isso .
Como em freecouch' resposta , crie um arquivo com 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>
em seguida, aplicar o plugin Gradle adicionando à sua 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"
}
ou, se estiver usando Kotlin Gradle DSL, à sua 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"
}