如何在服务器上通过Java运行Powershell命令

时间:2019-05-07 11:29:06

标签: java powershell

我想通过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

所以我想这是一个授权问题。

1 个答案:

答案 0 :(得分:1)

文件未运行,因为服务器找不到文件。将文件部署到服务器后,您可能需要将文件从服务器下载到部署了战争的计算机上。

尝试为Runtime exec实现错误流,以准确查看错误。您也可以按照https://stackoverflow.com/a/5748494/4597596进行操作。