Richiedi i privilegi di amministratore per l'app Java su Windows Vista
-
06-07-2019 - |
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?
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"
}