2016-04-28 3 views
1

Может быть, вы знаете, какие API-интерфейсы для Java вызывают удаленные сценарии PowerShell?Удаленные сценарии Powershell через Java

От этого API мне нужно что-то вроде:

  • Вход в машину Windows.
  • Выполнить PowerShell скрипт
  • Получить результат выполнения скрипта

Или существует еще методы, чтобы сделать это? Спасибо

+0

Проверить эту ссылку: https://social.technet.microsoft.com/Forums/office/en-US/d32537bd-0aef-440e- 8760-6b3085390c37/executing-powershell-script-via-java? Forum = winserverpowershell В самом конце этого есть рабочий пример, включающий обработку ошибок. – Martin

+0

Спасибо, но этого недостаточно, мне нужно войти в систему и выполнить удаленный скрипт; Например, я запустил код на моем компьютере Ubuntu -> connect to Windows machine -> execute на этом компьютере -> получить результат выполнения. Хотя, спасибо – GVArt

+0

Возможно, связано: https://serverfault.com/questions/638659/managing-windows-powershell-from-linux-terminal –

ответ

1

Если вы хотите выполнить удаленно что-то через Java, то приятно рассмотреть RMI. Я не знаю, хотите ли вы сохранить логин (нужно ли использовать разные пользователи?), Но этот метод работает, если вы меняете пароль для Windows и т. Д. Есть способы сохранить его также secure (но в домашней среде это не так необходимо). Для вызова оболочки я рекомендую использовать Apache Commons Exec (ExecuteWatchdog) для создания надежного решения.

Краткая история: вы можете обойти логин с этим и сохранить как-то портативное решение.

+0

Я попробую ваше решение и да, это необходимо для использования разными пользователями. – GVArt

+0

В PowerShell Вы можете переключать пользователей. Получите его как параметр, и он сможет сделать магию для вас. – Mark

0

Вы можете попробовать ProcessBuilder и перенаправить поток вывода, как это:

Собран с JAVAC 1.8.0_60 и побежал с: Java версии "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(); 
     } 
    } 
} 

Мои Script.ps1 был для тестирования, это был простой файл, который печатает в выходной поток:

Write-Host 'Hello World!' 
+0

Это не очень хорошая идея. Не обеспечено. Если машине нужны учетные данные, чтобы сделать некоторые сотрудники, ваш вариант плох. – GVArt

0

Привет, я не пробовал это специально с PowerShell, но я попробовал его с пакетными файлами и Windows Shell Host. Альтернативой использованию RMI является использование предоставляемых окон возможностей DCOM. Таким образом вам не нужно будет развертывать дополнительную удаленную службу на машине Windows. Вместо этого вы можете использовать сервер DCOM, предоставляемый каждой машиной Windows. Windows-машина выдает что-то, называемое Windows Shell Host. Этот хост оболочки Windows можно использовать для выполнения сценариев удаленно. Поскольку почти все в Windows поставляется в виде COM-объектов, я ожидаю, что Powershell также станет зарегистрированным сервисом COM, который вам нужно просто узнать.

В этой ссылке вы найдете решение проблемы с помощью Windows Shell Host и J-Interop как реализация Java протокола DCOM: 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")}); 

Если вам нужен выход из партии вы может использовать StdOut для его чтения.

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

Вы можете использовать JPowerShell библиотека: 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(); 
} 
Смежные вопросы