Domanda

Quando provo a creare una nuova attività nell'utilità di pianificazione tramite la classe Java ProcessBuilder ricevo un errore di accesso negato a Windows Vista. Su XP funziona bene.

Quando uso il " Esegui come amministratore " opzione funziona anche su Vista ..

Tuttavia, questo è un passaggio aggiuntivo richiesto e che gli utenti potrebbero non conoscere. Quando l'utente fa semplicemente doppio clic sull'icona dell'app fallirà con l'accesso negato. La mia domanda è: come posso forzare un'app Java a richiedere i privilegi di amministratore subito dopo l'avvio?

È stato utile?

Soluzione

Non sono sicuro che tu possa farlo a livello di codice. Se hai un programma di installazione per la tua app, puoi aggiungere la chiave di registro per forzare l'esecuzione come admin:

  

Percorso:   HKEY_CURRENT_USER \ Software \ Microsoft \ Windows   NT \ CurrentVersion \ AppCompatFlags \ strati

     Tasto

: < < Percorso completo per exe & Gt; & Gt;

     

Valore: RUNASADMIN

     

Tipo: REG_SZ

Altri suggerimenti

Hai pensato di racchiudere l'applicazione Java in un file .exe usando launch4j? In questo modo è possibile incorporare un file manifest che consente di specificare & Quot; livello di esecuzione & Quot; per il tuo eseguibile. In altre parole, controlli i privilegi che dovrebbero essere concessi alla tua applicazione in esecuzione, dicendo efficacemente al sistema operativo di & Quot; Esegui come amministratore & Quot; senza richiedere all'utente di farlo manualmente.

Ad esempio ...

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>  

Vedi http://msdn.microsoft.com/en-us/library /bb756929.aspx e il sito Web launch4j per i dettagli sulla modalità.

Sebbene la risposta di FreeCouch sia buona, ma ho affrontato alcuni problemi e ho pensato di metterlo qui in modo che la prossima volta gli altri possano essere beneficiati facilmente.

Per ottenere il permesso di amministratore in Java, per quanto ho trovato la soluzione è quella di avvolgere * .jar all'interno di un * .exe con un programma come Launch4J e associare Manifest con esso.

Per creare un file manifest, apri qualsiasi editor di testo come Blocco note e incolla queste righe e salvalo con il nome del file insieme alla sua estensione, ad esempio: 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>  

In Launch4J, nella scheda Basic aggiungi questo file nell'opzione Wrapper Manifest.

Non ho ancora trovato la soluzione migliore. Ma ho una soluzione alternativa rispetto a & Quot; James Van Huis & Quot ;. Utilizza invece RUNASINVOKE in modo da non dover visualizzare il messaggio Consenti / Nega ogni volta che esegui l'app.

Nota: devi sempre essere Admin, quello che sto cercando di risolvere

Uso del plug-in Gradle launch4j

Soprattutto quando si utilizza già Gradle, è facile applicare plugin launch4j per risolvere questo problema .

Come in risposta freecouch , crea un file 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> 

quindi applica il plug-in Gradle aggiungendolo al tuo 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, se si utilizza Kotlin Gradle DSL, sul 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"
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top