2016-04-28 9 views
1

Können Sie einige APIs für Java kennen, um Remote-PowerShell-Skripts aufzurufen?Remote Powershell-Skripte über Java

Von diesem API muss ich Dinge wie:

  • Melden Sie sich bei Windows-Rechner.
  • ausführen Powershell-Skript
  • Get Ergebnis der Skriptausführung

Oder existiert eine andere Methoden, es zu tun? Danke

+0

prüfen Sie diesen Link: https://social.technet.microsoft.com/Forums/office/en-US/d32537bd-0aef-440e- 8760-6b3085390c37/executing-powershell-script-via-java? Forum = winserverpowershell Am Ende von diesem gibt es ein funktionierendes Beispiel einschließlich Fehlerbehandlung. – Martin

+0

Danke, aber es ist nicht genug, ich muss mich einloggen und Remote Script ausführen; Zum Beispiel werde ich Code auf meinem Ubuntu ausführen -> Verbindung zu Windows Maschine -> Skript auf diesem Rechner ausführen -> Ergebnis der Ausführung zurück zu bekommen. Obwohl, danke – GVArt

+0

Möglicherweise verwandt: https://serverfault.com/questions/638659/managing-windows-powershell-from-linux-terminal –

Antwort

1

Wenn Sie etwas über Java remote ausführen möchten, ist es eine gute Sache zu betrachten RMI. Ich weiß nicht, ob Sie den Login beibehalten möchten (ist es notwendig, verschiedene Benutzer zu verwenden?), Aber diese Methode funktioniert, wenn Sie Ihr Windows-Passwort ändern usw. Es gibt Möglichkeiten, es zu behalten secure (aber in einer häuslichen Umgebung es ist nicht so notwendig). Zum Shell-Aufruf empfehle ich, Apache Commons Exec (ExecuteWatchdog) zu verwenden, um eine robuste Lösung zu erstellen.

Lange Rede kurzer Sinn: Sie könnten damit umgehen und eine irgendwie tragbare Lösung behalten.

+0

Ich werde versuchen, Ihre Lösung und ja, es ist notwendig, verschiedene Benutzer zu verwenden. – GVArt

+0

In PowerShell Sie können Benutzer wechseln. Holen Sie es als Parameter und es wird in der Lage sein, die Magie für Sie zu tun. – Mark

0

Sie könnten Process versuchen, den Ausgangsstrom umleiten, wie folgt aus:

Zusammengestellt mit Javac 1.8.0_60 und lief mit: java version "1.8.0_91"

import java.util.*; 
import java.io.*; 
public class Test { 
    public static void main(String ... args) { 
     try { 
      ProcessBuilder launcher = new ProcessBuilder(); 
      Map<String, String> environment = launcher.environment(); 
      launcher.redirectErrorStream(true); 
      launcher.directory(new File("\\\\remote_machine\\Snaps\\")); 
      launcher.command("powershell.exe", ".\\Script.ps1"); 
      Process p = launcher.start(); // And launch a new process 
      BufferedReader stdInput = new BufferedReader(new 
      InputStreamReader(p.getInputStream())); 
      String line; 
      System.out.println("Output :"); 
      while ((line = stdInput.readLine()) != null) { 
       System.out.println(line); 
      } 
     } catch (Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 

Meine Script.ps1 war ein zum Testen, es war eine einfache Datei, die auf den Ausgabestrom druckt:

Write-Host 'Hello World!' 
+0

Es ist keine gute Idee. Ist nicht gesichert. Wenn die Maschine Anmeldeinformationen für einige Mitarbeiter benötigt, ist Ihre Variante schlecht. – GVArt

0

Hallo Ich habe dies nicht speziell mit PowerShell versucht, aber ich habe es mit Batch-Dateien und Windows Shell Host versucht. Eine Alternative zur Verwendung von RMI ist die Verwendung der von Windows bereitgestellten Remoting-Funktionen DCOM. Auf diese Weise müssen Sie keinen zusätzlichen Remote-Dienst auf dem Windows-Computer bereitstellen. Stattdessen können Sie den DCOM-Server verwenden, der von jedem Windows-Computer bereitgestellt wird. Der Windows-Computer macht etwas bekannt, das Windows Shell-Host genannt wird. Dieser Windows-Shell-Host kann zur Remote-Ausführung von Skripten verwendet werden. Da fast alles in Windows in Form von COM-Objekten zur Verfügung steht, ist es meine Erwartung, dass Powershell auch als ein registrierter COM-Dienst kommt, den Sie gerade herausfinden müssen.

In diesem Link eine Lösung für Ihr Problem mit Windows Shell Host und J-Interop als Java-Implementierung des DCOM-Protokoll finden: How to call a remote bat file using jinterop

/ Create a session 
JISession session = JISession.createSession(<domain>, <user>, <password>); 
session.useSessionSecurity(true); 

// Execute command 
JIComServer comStub = new JIComServer(JIProgId.valueOf("WScript.Shell"),<IP>, session); 
IJIComObject unknown = comStub.createInstance(); 
final IJIDispatch shell =  (IJIDispatch)JIObjectFactory.narrowObject((IJIComObject)unknown.queryInterface(IJIDispatch.I ID)); 
JIVariant results[] = shell.callMethodA("Exec", new Object[]{new JIString("%comspec% /c asadmin.bat")}); 

Wenn Sie die Ausgabe aus dem Ansatz müssen Sie kann StdOut verwenden, um es zu lesen.

JIVariant stdOutJIVariant = wbemObjectSet_dispatch.get("StdOut"); 
IJIDispatch stdOut = (IJIDispatch)JIObjectFactory.narrowObject(stdOutJIVariant.getObjectAsComObject()); 

// Read all from stdOut 
while(!((JIVariant)stdOut.get("AtEndOfStream")).getObjectAsBoolean()){ 
    System.out.println(stdOut.callMethodA("ReadAll").getObjectAsString().getString()); 
} 
-1

können Sie JPowerShell Bibliothek verwenden: https://github.com/profesorfalken/jPowerShell

PowerShell powerShell = null; 
try { 
    //Creates PowerShell session 
    PowerShell powerShell = PowerShell.openSession(); 
    //Increase timeout to give enough time to the script to finish 
    Map<String, String> config = new HashMap<String, String>(); 
    config.put("maxWait", "80000"); 

    //Execute script 
    PowerShellResponse response = powerShell.configuration(config).executeScript("./myPath/MyScript.ps1"); 

    //Print results if the script 
    System.out.println("Script output:" + response.getCommandOutput()); 
} catch(PowerShellNotAvailableException ex) { 
    //Handle error when PowerShell is not available in the system 
    //Maybe try in another way? 
} finally { 
    //Always close PowerShell session to free resources. 
    if (powerShell != null) 
     powerShell.close(); 
} 
Verwandte Themen