2009-09-11 5 views
4

Nous avons une application Java exécutée en tant que service Windows. Une fonctionnalité particulière doit exécuter un binaire mais avec un autre utilisateur que celui qui a démarré l'application.Appel d'un processus externe avec un utilisateur différent dans Java

Existe-t-il un moyen par lequel nous pouvons invoquer un exe avec le style 'Exécuter en tant qu'utilisateur différent'.

J'ai vérifié l'API de ProcessBuilder mais je n'ai trouvé aucun élément lié à l'utilisateur. Existe-t-il un outil tiers pour y parvenir?

Répondre

0

Je crois que vous pouvez utiliser la commande DOS runas à la rigueur, si vous ne trouvez pas autre chose. (Tapez runas dans une invite DOS pour l'information d'utilisation.)

Modifier: Malheureusement, selon une note here cela ne fonctionnera apparemment pas d'un service. :/Vous pourriez être en mesure de créer une petite application encapsuleur séparée que vous pourriez invoquer qui invoquerait alors le binaire avec runas, cependant.

+0

Mais il n'y a aucun moyen de spécifier le mot de passe. –

2

Vous pouvez utiliser PSExec pour exécuter des processus en tant qu'utilisateur différent. La ligne de commande ressemble à:

psexec.exe -u username -p password mybinary.exe 

Vous pouvez ensuite utiliser ProcessBuilder pour générer la commande autour de ceci.

Edit: ici est un exemple de la façon dont vous pouvez le faire:

public int startProcess(String username, String password, 
     String executable, String... args) throws IOException { 

    final String psexec = "C:\\PsTools\\psexec.exe"; //psexec location 

    //Build the command line 
    List<String> command = new LinkedList<String>(); 
    command.add(psexec); 

    if(username != null) { 
     command.add("-u"); 
     command.add(username); 
     command.add("-p"); 
     command.add(password); 
    } 

    command.add(executable); 
    command.addAll(Arrays.asList(args)); 

    ProcessBuilder builder = new ProcessBuilder(command); 
    Process process = builder.start(); 

    int returnCode; 

    try { 
     returnCode = process.waitFor(); 
    } catch (InterruptedException e) { 
     returnCode = 1; 
    } 

    return returnCode; 
} 

Vous pouvez alors l'utiliser comme ceci:.

startProcess("Bob", "Password", "Notepad.exe", "C:\\myfile.txt"); 
0

Runtime.getRuntime() exec (?) méthode.

Questions connexes