我想通过Java Servlet运行PowerShell脚本。在localhost(Windows 10 Pro 64bit)测试中,一切正常。现在,我将代码部署在远程服务器上(Windows Server 2012 R2 64位上的Tomcat 8.5)并尝试运行它,但是powershell脚本没有输出。他们似乎根本不运行或不回信。 (根本没有打印cmd_line
,而check_ps_execution
停留在false
。)
我已经尝试将'"powershell " + ps_..._status.ps1 " + username
'更改为'"cmd /C powershell " + ps_..._status.ps1 " + username
'以通过CLI而不是PowerShell来运行它,但是效果相同。
没有错误消息,但也没有输出。
我通过cmd和powershell在服务器上直接运行ps脚本,在两种情况下都可以正常工作。它们位于与localhost相同的路径中。
public static boolean checkForwardingStatus(String username) throws IOException {
boolean forwarding = false;
boolean check_ps_execution = false;
Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec("cmd /C powershell " + ps_script_path + "check_forwarding_status.ps1 " + username);
InputStream is = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader reader = new BufferedReader(isr);
String cmd_line;
while ((cmd_line = reader.readLine()) != null) {
check_ps_execution = true;
logger.info(cmd_line);
if (cmd_line.contains("ForwardingAddress")) {
if (cmd_line.contains("[something it should contain]")) {
forwarding = true;
}
}
}
reader.close();
proc.getOutputStream().close();
if (!check_ps_execution) {
logger.error("PS Script checkForwardingStatus did not run!");
}
logger.info("Forwarding: " + forwarding);
return forwarding;
}
PowerShell Skript:
$user_name=$args[0]
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://[server]/PowerShell/ -Authentication Kerberos
Import-PSSession $Session
Get-Mailbox -Identity "$user_name" | fl *Forwarding*, *DeliverToMailboxAndForward*, *WindowsEmailAddress*
我可以尝试运行什么脚本?
更新: 当我登录服务器时,运行PowerShell并使用自己的用户名执行示例脚本,即可正常工作。但是,如果尝试使用其他用户名,则会收到以下错误代码:
FullyQualifiedErrorId : ErrorNoCommandsImportedBecauseOfSkipping,Microsoft.PowerShell.Commands.ImportPSSessionCommand
所以我想这是一个授权问题。
答案 0 :(得分:1)
文件未运行,因为服务器找不到文件。将文件部署到服务器后,您可能需要将文件从服务器下载到部署了战争的计算机上。
尝试为Runtime exec实现错误流,以准确查看错误。您也可以按照https://stackoverflow.com/a/5748494/4597596进行操作。