我正在使用Rundeck版本3.0.13通过WinRM将Powershell命令发送到Windows Server 2016主机。有什么方法可以将管道字符作为单个命令来运行powershell命令吗?例如,我很希望能够执行这样的命令来启动非禁用服务:
Get-Service | where-object {$_.StartType -ne "Disabled"} | foreach-object {Start-Service $_}
但是我得到了错误,但找不到“ where-object”命令。 WinRM节点执行程序在CMD提示符下将命令作为powershell的参数运行,因此发生的是该命令的Get-Service部分在Powershell中运行,但随后尝试在CMD中通过管道传递到“ where-object”提示,就像这样:
CMD> powershell Get-Service | where-object ...
是否有任何方法可以在Rundeck中转义powershell语句,以便管道命令在powershell中运行而不是仅在第一部分中运行?我尝试将其包含在-command“&{...}”中无济于事。 (在那种情况下,我得到一个语法错误,结果是Powershell帮助屏幕。)
谢谢!
答案 0 :(得分:1)
最简单的方法是按照@gravity的说明调用脚本,或使用内联脚本步骤,选择新的“脚本-执行内联脚本”步骤,然后在“高级”按钮中将“ powershell.exe”设置为“ “文件扩展名”文本框中的“调用字符串”和“ .ps1”(当然还有“输入要执行的整个脚本”框中的Powershell内容)。
如果在Windows节点中禁用了远程脚本执行,则可以在Windows节点上使用set-executionpolicy remotesigned
启用它。
更新答案:
如果您想直接在“命令步骤”上执行(因为安全策略受到您的限制),请确保在项目配置中配置了“ WinRM Node Executor Python”(在“ Default Node Executor”上),在“外壳”文本框中定义“ Powershell”。另外,在“默认文件复制器”上定义“ WinRM Node Executor Python”是一种很好的做法。
现在,您无需在命令中调用“ poweshell.exe”,只需输入管道命令即可,例如Get-Content myfile.txt | Select-string -SimpleMatch "${option.mystring}"
。
答案 1 :(得分:0)
您必须设置正确的节点定义,您的项目使用的是Windows和Linux节点还是Windows节点?
您是Rundeck服务器窗口吗?如果是,则将项目执行模式设置为本地,或使用WinRm节点执行程序python。 看一下以下节点定义,我正在使用pywinrm对启用了凭据委托的Windows节点执行,并将默认外壳设置为powershell,使用此配置,我可以运行第二跳查询和管道作为一个衬板。
<node name="server.WinRMPython"
description="JUMP"
tags="Server 2019,WinRMPython"
hostname="myserver" osArch="amd64"
osFamily="windows"
osName="Server 2019"
osVersion="2019"
role="jump server"
function="rundeck execution node"
username="my user"
winrm-password-option="winrmPassword"
winrm-password-storage-path="keys/windows/myserver.pass"
node-executor="WinRMPython"
file-copier="WinRMcpPython"
Winrm-protocol="http"
winrm-cmd="PowerShell"
winrm-auth-type="credssp"
file-copy-destination-dir="c:\temp"/>