您是否知道Java的一些API可以调用远程PowerShell脚本?
从这个API我需要这样的东西:
还是存在其他方法吗? 感谢
答案 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());
}