web-dev-qa-db-fra.com

Java: exécuté en tant qu'administrateur

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

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

40
Martijn Courteaux

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 conserver dans un fichier séparé (yourapp.exe.manifest)

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

20
ZippyV

La manière la plus simple serait d'utiliser un wrapper pour lancer votre JVM, puis d'élever le wrapper. 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
9
Matt DeVillier

La réponse de ZippyV est correcte si vous avez l'intention de lancer javaw.exe avec les privilèges d'administrateur système, qui si pur Java est ce qui est bloqué par l'UAC (comme essayer d'écrire un fichier sur 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. En voici un .

8
Yishai

Vous pouvez utiliser un programme Windows pour élever votre privilège. Le programme affichera l'invite UAC, puis vous aurez le privilège d'administrateur.

http://jpassing.com/2007/12/08/launch-elevated-processes-from-the-command-line/

Vous pouvez ensuite exécuter une commande comme celle-ci:

Runtime.getRuntime().exec("Elevate.exe yourcommand");
5
mathd

Si vous pouvez exécuter tout ce dont vous avez besoin pour exécuter à partir d'un fichier batch Windows CMD .. Vous pouvez créer un fichier batch (à la volée même) à partir de votre Java application qui fait ce que vous voulez et lancez Je le fais fonctionner, donc mon programme Java lance ceci et fait apparaître l'invite UAC Windows normale à l'utilisateur, puis exécute les commandes s'il choisit OUI.

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

Voici un fil qui traite de la demande d'accès UAC dans un fichier de commandes Windows: Comment demander l'accès administrateur dans un fichier de commandes

REMARQUE: ProcessBuilder peut être un peu difficile à gérer, l'utilisation d'un StreamGobbler pour gérer la sortie fonctionne pour moi: Gérer l'entrée à l'aide de StreamGobbler

2
crig

Je vais vous expliquer comment obtenez-vous élevé Java application

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 un exemple appelez simplement 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 un programme élevé. Je vous recommande - Vous devez convertir en wrapper binaire comme Launch4j ou Parcle que vous pouvez cliquer - Si vous créez un programme d'installation personnalisé (fait par Java Swing ou Awt.)

J'espère que vous avez une bonne solution :) - Si vous utilisez Linux ou Mac OS X, vous devez utiliser le wrapper binaire Parcle ou un autre wrapper 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");
    }
}

N'oubliez pas d'utiliser '' et "" si -jar <filename>.jar de -Argument de Start-Process. Remarque n'oubliez pas - Si vous utilisez le répertoire de travail et que le fichier jar doit être dans l'exemple de répertoire de travail

  • .\myjar.jar
  • Java.\RunAsAdminExample.class

Que vous pouvez voir élevé Java avec argument :)

Meilleures salutations!

1
SourceSkyBoxer

J'utilise la ligne de commande sur Windows à 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, lorsque vous exécutez Java -jar il s'exécutera avec les droits d'administrateur.

1
Kaptkaos