通过 WinRM 重新使用 PowerShell 会话
Re-using PowerShell session with WinRM
我的总体目标是初始化一次 powershell 会话,随着时间的推移调用一些命令,最后关闭会话。我需要通过 winrm 调用 powershell。由于我正在开发 Java 应用程序,因此我使用 winrm4j 通过 winrm 调用 shell 命令。
保持 ps 会话打开的动机是我通过 Connect-ExchangeOnline
cmdlet 访问 Exchange Online。不幸的是,这大约需要 10 秒,为了节省时间,我想为 Get-Mailbox
等多个命令重新使用 ps 会话,而不是每次调用 Exchange cmdlet 时都连接到 Exchange Online。
这是我正在执行的 pseudo-powershell 代码。现在,我运行宁对我的本地机器:
- 开始会话:
$s = New-PSSession -Name mysession -ComputerName . -Authentication Basic -Credential ...
Invoke-Command -Session $s -ScriptBlock { <# here comes Exchange online initialization #> }
Disconnect-PSSession -Session $s
- 调用命令:
$rs = Get-PSSession -Name mysession -ComputerName . -Authentication Basic -Credential ...
Connect-PSSession -Session $s
Enter-PSSession -Session $s
<# run the actual Exchange cmdlet #>
Exit-PSSession
Disconnect-PSSession -Session $s
- 清理:
$rs = Get-PSSession -Name mysession -ComputerName . -Authentication Basic -Credential ...
Remove-PSSession -Session $rs
当我手动执行此操作时,我可以 运行 a Get-Mailbox
并获得正确的结果。 但是,当我以编程方式运行时,它不起作用。返回一个错误,指出 Get-Mailbox
找不到 cmdlet。以及初始化或不可用的其他变量。
这里通过 winrm 有何不同?
正如 Mathias 在评论中指出的那样,解决方案是使用 Invoke-Command
而不是 Enter-PSSession
,因为它仅用于交互式会话。不幸的是,以编程方式通过 winrm 调用 Enter-PSSession
时没有错误消息或类似消息。
我的总体目标是初始化一次 powershell 会话,随着时间的推移调用一些命令,最后关闭会话。我需要通过 winrm 调用 powershell。由于我正在开发 Java 应用程序,因此我使用 winrm4j 通过 winrm 调用 shell 命令。
保持 ps 会话打开的动机是我通过 Connect-ExchangeOnline
cmdlet 访问 Exchange Online。不幸的是,这大约需要 10 秒,为了节省时间,我想为 Get-Mailbox
等多个命令重新使用 ps 会话,而不是每次调用 Exchange cmdlet 时都连接到 Exchange Online。
这是我正在执行的 pseudo-powershell 代码。现在,我运行宁对我的本地机器:
- 开始会话:
$s = New-PSSession -Name mysession -ComputerName . -Authentication Basic -Credential ...
Invoke-Command -Session $s -ScriptBlock { <# here comes Exchange online initialization #> }
Disconnect-PSSession -Session $s
- 调用命令:
$rs = Get-PSSession -Name mysession -ComputerName . -Authentication Basic -Credential ...
Connect-PSSession -Session $s
Enter-PSSession -Session $s
<# run the actual Exchange cmdlet #>
Exit-PSSession
Disconnect-PSSession -Session $s
- 清理:
$rs = Get-PSSession -Name mysession -ComputerName . -Authentication Basic -Credential ...
Remove-PSSession -Session $rs
当我手动执行此操作时,我可以 运行 a Get-Mailbox
并获得正确的结果。 但是,当我以编程方式运行时,它不起作用。返回一个错误,指出 Get-Mailbox
找不到 cmdlet。以及初始化或不可用的其他变量。
这里通过 winrm 有何不同?
正如 Mathias 在评论中指出的那样,解决方案是使用 Invoke-Command
而不是 Enter-PSSession
,因为它仅用于交互式会话。不幸的是,以编程方式通过 winrm 调用 Enter-PSSession
时没有错误消息或类似消息。