Pregunta

Cuando intento crear una nueva tarea en el programador de tareas a través de la clase Java ProcessBuilder, obtengo un error de acceso denegado en Windows Vista. En XP funciona bien.

Cuando uso " Ejecutar como administrador " opción, también se ejecuta en Vista ..

Sin embargo, este es un paso adicional solicitado y los usuarios podrían no saber sobre esto. Cuando el usuario hace doble clic en el icono de la aplicación, fallará con el acceso denegado. Mi pregunta es ¿cómo puedo forzar a una aplicación de Java a solicitar privilegios de administrador justo después del inicio?

¿Fue útil?

Solución

No estoy seguro de que pueda hacerlo mediante programación. Si tiene un instalador para su aplicación, puede agregar la clave de registro para forzar la ejecución como administrador:

  

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

     

Clave: < < Ruta completa a exe & Gt; & Gt;

     

Valor: RUNASADMIN

     

Tipo: REG_SZ

Otros consejos

¿Ha considerado envolver su aplicación Java en un .exe usando launch4j? Al hacer esto, puede incrustar un archivo de manifiesto que le permite especificar el & Quot; nivel de ejecución & Quot; para su ejecutable En otras palabras, usted controla los privilegios que deben otorgarse a su aplicación en ejecución, diciéndole efectivamente al sistema operativo que & "; Ejecutar como administrador &"; sin requerir que el usuario lo haga manualmente.

Por ejemplo ...

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>  

Ver http://msdn.microsoft.com/en-us/library /bb756929.aspx y el sitio web launch4j para obtener detalles del modo.

Aunque la respuesta de FreeCouch es buena, me enfrenté a un problema y pensé en ponerlo aquí para que la próxima vez otros puedan beneficiarse fácilmente.

Para obtener el permiso de administrador en Java, hasta donde encontré, la solución es envolver el * .jar dentro de un * .exe con un programa como Launch4J y vincular el manifiesto con él.

Para crear un archivo de manifiesto, abra cualquier editor de texto como el Bloc de notas y pegue estas líneas en él y guárdelo con el nombre del archivo junto con su extensión, por ejemplo: 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>  

En Launch4J, en la pestaña Basic agregue este archivo en la opción Wrapper Manifest.

Todavía no he encontrado la mejor solución. Pero tengo una solución alternativa en comparación con & Quot; James Van Huis & Quot ;. Utilice RUNASINVOKE en su lugar para no tener que ver el mensaje Permitir / Denegar cada vez que ejecute la aplicación.

Nota: siempre debes ser administrador, eso es lo que estoy tratando de resolver

Uso del complemento launch4j Gradle

Especialmente cuando ya está usando Gradle, es fácil aplicar el plugin launch4j para arreglar esto .

Como en respuesta de freecouch ', cree un archivo myapp.manifest con

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

luego aplique el complemento Gradle agregando a su 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"
}

o, si usa Kotlin Gradle DSL, a su 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top