2009-09-06 7 views
37

Existe-t-il un moyen Java de demander au système de contrôler les fonctionnalités de l'administrateur? Bien sûr, sans faire: Faites un clic droit sur l'exe -> exécuter en tant qu'administrateur.
Qu'est-ce que je veux, c'est qu'il y a une trame de UAC comme dans Windows Vista ou Windows 7.Java: exécuté en tant qu'administrateur

Ou dois-je faire quelques réglages en faisant un exe du pot?

Répondre

20

Vous devez créer un fichier manifeste qui spécifie que votre application a besoin d'autorisations d'administrateur. Vous pouvez inclure le manifeste dans votre exe ou le garder dans un fichier séparé (yourapp.exe.manifest)

http://msdn.microsoft.com/en-us/library/bb756929.aspx

+8

Le problème est bien sûr que "l'exécutable" sera la JVM, pas votre propre code. Et puisque le manifeste s'applique à la JVM, il s'applique à tout ce qui est exécuté par cette JVM. – MSalters

+1

Et si vous avez un wrapper exe qui lance java? L'accès administrateur sera-t-il hérité par le processus fils (jvm)? – Cal

+3

@Cal - Oui - une fois qu'un processus est élevé, tous les processus qu'il crée seront élevés. L'élévation de l'UAC change littéralement l'utilisateur que l'application est en cours d'exécution, et c'est une rue à sens unique - vous pouvez l'élever, mais vous ne pouvez pas redescendre. –

8

La réponse de ZippyV est bien si vous avez l'intention de lancer le javaw.exe avec des privilèges d'administrateur système, qui Si le code Java pur est ce qui est bloqué par l'UAC (comme essayer d'écrire un fichier dans un répertoire privilégié), alors c'est ce que vous devrez faire.

Si, cependant, vous essayez de lancer quelque chose d'extérieur, mais juste avec l'élévation, vous pouvez regrouper un exe qui élève une commande. Here is one.

+0

Merci! Normalement, vous ne voulez pas qu'une application utilisateur s'exécute en tant qu'administrateur (seulement certaines actions privilégiées), c'est donc probablement la solution la plus appropriée dans la plupart des cas. J'aime aussi le fait que Elevate.exe possède une option -wait donc vous pouvez bloquer jusqu'à ce que la commande élevée soit terminée. – rob

+0

Si je lis votre lien correctement, il faut aussi modifier le registre qui n'est pas toujours une option. – likejiujitsu

9

La manière la plus simple serait d'utiliser un wrapper pour lancer votre machine virtuelle Java, élever ensuite l'emballage. J'utilise un simple script d'installation NSIS avec le plugin UAC pour ce faire:

; Java Launcher 
;-------------- 

; You want to change the below lines 
Name "my program" 
Caption "my program Launcher"  
Icon "iconfile.ico"  
OutFile "java launcher.exe" 

; param below can be user, admin  
RequestExecutionLevel admin 

!include UAC.nsh 

SilentInstall silent 
AutoCloseWindow true 
ShowInstDetails show 

Section ""  
    ; command to execute  
    StrCpy $0 'javaw -jar myjarfile'  
    SetOutPath $EXEDIR  
    Exec $0  
SectionEnd 
1

-je utiliser la ligne de commande sur les fenêtres à cet effet. Dans le menu Démarrer, tapez cmd dans la zone de texte et lorsque le programme cmd.exe apparaît, faites un clic droit dessus et sélectionnez Exécuter en tant qu'administrateur. Maintenant, quand vous exécutez java -jar il fonctionnera avec des droits d'administrateur.

+0

C'est un travail pour moi, merci pour une solution très simple –

-3

Accédez à java.exe et à javaw.exe dans le dossier d'installation. ie - C: \ Program Files \ Java \ jre7 \ bin ou C: \ Program Files \ Java \ jdk1.7.0_17 \ bin faites un clic gauche dessus et sélectionnez Propriétés-> Compatibilité et là: cochez "Exécuter ce programme comme administrateur".

+2

C'est une très mauvaise idée, car cela donne à tout le monde des droits d'administrateur de programme Java. Les logiciels malveillants n'auront même pas besoin de profiter des failles de sécurité dans l'implémentation de Java pour envoyer votre système, car vous venez de remettre la clé. –

2

Si vous pouvez exécuter tout ce dont vous avez besoin à partir d'un fichier de commandes Windows CMD .. Vous pouvez créer un fichier batch (à la volée) depuis votre application java qui fait ce que vous voulez et le lance. Je l'ai fonctionné donc mon programme de Java lance ceci et il sauve l'invite normale de UAC de fenêtres à l'utilisateur et puis exécute les commandes s'ils choisissent OUI.

String[] commands = {"cmd.exe", "/C" "mybatchfile.bat"}; 
    ProcessBuilder pb = new ProcessBuilder(commands); 
    .. 
    pb.start(); 

Voici un fil qui traite de demander l'accès UAC dans un fichier batch windows: How to request Administrator access inside a batch file

REMARQUE: ProcessBuilder peut être un peu difficile à traiter, en utilisant un StreamGobbler pour gérer les travaux de sortie pour moi: Handle Input using StreamGobbler

0

Je vais vous expliquer comment obtenez-vous application java élevée

import java.io.IOException; 

public class RunAsAdminExample { 
    public static void main(String[] args) throws IOException { 
     Process myappProcess = Runtime.getRuntime().exec("powershell.exe Start-Process <program.exe> -verb RunAs"); 
    } 
} 

program.exe est par exemple il suffit d'appeler notepad.exe

import java.io.IOException; 

public class RunAsAdminExample { 
    public static void main(String[] args) throws IOException { 
     Process myappProcess = Runtime.getRuntime().exec("powershell.exe Start-Process notepad.exe -verb RunAs"); 
    } 
} 

Que vous avez programme élevé. Je recommande vous - Vous devez convertir en emballage binaire comme Launch4j ou parcle Que vous pouvez cliquer - (. Réalisé par Java Swing ou Awt) Si vous créez programme d'installation personnalisé

J'espère que vous avez une bonne solution :) - Si vous utiliser Linux ou Mac OS X que vous avez besoin d'utiliser wrapper binaire parcle ou tout autre emballage si vous savez ...

// EDIT bonne idée par Kaptkaos que vous écrivez simple:

import java.io.IOException; 

public class RunAsAdminExample { 
    public static void main(String[] args) throws IOException { 
     Process myappProcess = Runtime.getRuntime().exec("powershell.exe Start-Process -FilePath java.exe -Argument '-jar runasadmin.jar' -verb RunAs"); 
    } 
} 

ne pas oublier de utilisez '' and "" if -jar .jar from -Argument de Start-Process. Remarque ne pas oublier - Si vous utilisez le répertoire de travail et le fichier jar doit être dans l'exemple de répertoire de travail \ myjar.jar java \ RunAsAdminExample.class Que vous pouvez voir java élevée avec l'argument :)

Meilleures salutations..!

Questions connexes