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?

Foi útil?

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"
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top