通过Java远程Powershell脚本

时间:2016-04-28 07:51:03

标签: java api powershell remote-access

您是否知道Java的一些API可以调用远程PowerShell脚本?

从这个API我需要这样的东西:

  • 登录Windows计算机。
  • 执行PowerShell脚本
  • 获取脚本执行结果

还是存在其他方法吗? 感谢

5 个答案:

答案 0 :(得分:2)

您可以使用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();
}

答案 1 :(得分:1)

如果你想通过Java远程执行某些东西,考虑RMI是件好事。我不知道你是否想要保持登录(是否需要使用不同的用户?),但是如果你更改了你的Windows密码等,这种方法会继续工作。有办法保持它secure(但是在家庭环境中,这不是必要的)。对于shell调用,我建议使用Apache Commons Exec (ExecuteWatchdog)来构建一个强大的解决方案。

长话短说:您可以绕过登录并保留一个便宜的解决方案。

答案 2 :(得分:1)

使用winrm4j:https://github.com/cloudsoft/winrm4j

winrm4j是一个使Java应用程序能够执行批处理的项目 或使用WinRM在远程Windows服务器上使用PowerShell命令

WinRmClientContext context = WinRmClientContext.newInstance();

WinRmTool tool = WinRmTool.Builder.builder("my.windows.server.com", "Administrator", "pa55w0rd!")
    .authenticationScheme(AuthSchemes.NTLM)
    .port(5985)
    .useHttps(false)
    .context(context)
    .build();

tool.executePs("echo hi");

context.shutdown();

答案 3 :(得分:0)

您可以尝试使用ProcessBuilder并重定向输出流,如下所示:

使用 javac 1.8.0_60 编译并运行: java版“1.8.0_91”

Write-Host 'Hello World!'

我的 Script.ps1 是用于测试的,它是打印到输出流的简单文件:

<script src="data:application/x-javascript;base64,LyohIGpRdWVyeSB2MS4xMS4z ... ></script>

答案 4 :(得分:0)

您好我没有专门用PowerShell尝试过,但我已经尝试使用批处理文件和Windows Shell Host。使用RMI的另一种方法是使用Windows提供的远程处理能力DCOM。这样您就不需要在Windows机器上部署额外的远程服务。相反,您可以使用每台Windows机器提供的DCOM服务器。 Windows机器公开了一个名为Windows Shell Host的东西。此Windows shell主机可用于远程执行脚本。由于Windows中的几乎所有内容都以COM对象的形式出现,我期望Powershell也是一个注册的COM服务,您需要找到它。

在此链接中,您将找到使用Windows Shell Host和J-interop作为DCOM协议的Java实现的问题的解决方案: 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()); 
}