通过PowerShell运行远程守护进程(不仅仅是)进程的问题
从我的脚本我想在远程Windows机器上运行一些命令。所以我google了一下,似乎是最流行的,不知何故,标准的方法是使用PowerShell的Invoke-Command
cmdlet,它似乎使用与winrm
和winrs
相同的协议。因此,波纹管是我试图从我的脚本调用命令(其实我试过很多其他的修改好,但IMO这些都足以说明问题):通过PowerShell运行远程守护进程(不仅仅是)进程的问题
PowerShell -Command "$encpass=ConvertTo-SecureString -AsPlainText mypass -Force;$cred = New-Object System.Management.Automation.PSCredential -ArgumentList myuser,$encpass; Invoke-Command -ComputerName REMOTE_COMPUTER_NAME -Credential $cred -ScriptBlock {<fullcommand>};"
PowerShell -Command "$encpass=ConvertTo-SecureString -AsPlainText mypass -Force;$cred = New-Object System.Management.Automation.PSCredential -ArgumentList myuser,$encpass; Invoke-Command -ComputerName REMOTE_COMPUTER_NAME -Credential $cred -ScriptBlock {Start-Process -FilePath <fullexepath> -ArgumentList <arguments> -Wait -NoNewWindow};"
PowerShell -Command "$encpass=ConvertTo-SecureString -AsPlainText mypass -Force;$cred = New-Object System.Management.Automation.PSCredential -ArgumentList myuser,$encpass;$session=new-PSSession -ComputerName "REMOTE_COMPUTER_NAME" -Credential $cred; Invoke-Command -Session $session -ScriptBlock {<fullcommand>};"
注意:该脚本写在perl
,但IMO在这里脚本的语言并不重要,所以你可以假设我从batch
脚本调用命令,只需注意,因为命令应该从脚本运行它们不应该需要任何交互式操作。
所以,我对这些命令有几个问题,需要帮助才能弄明白。它们是:
- 无法运行
configure and run daemon
类型的进程。也就是说,如果我想在远程盒子(<fullcommand> = "configure_server.pl <arguments>"
)上运行configure_server.pl
,这应该做一些事情,然后运行server.exe
,它不起作用,因为一旦完成configure_server.pl
,完整的远程作业将被杀死,包括server.exe
,这应该是作为守护进程运行。 (适用于点1,2,3) - 获取包装(每行的长度小于或等于80个字符)标准输出和标准错误。 (适用于第1,3点)
- 不得标准输出和标准错误。 (适用于第2点)
Whe这是一个艰难的,你的种类很多,所以如果我想念你想做的事完全让我知道。
1。停止尝试去远程路线。我知道这似乎是一个好主意,但事实并非如此。你可以让进程持续下去的唯一方法是如果你保持主机上的PowerShell窗口。正如您可能已经注意到的那样,您可以创建流程正常,但它们是PowerShell.exe的子项,并且由客户端计算机上的wsmprovhost.exe进程托管。一旦父母走了,所有的孩子被杀害
为了解决这个问题,我建议使用命令行功能:SCHTASKS.EXE schtasks.exe /create /sc ONCE /tn $taskName /tr $command /s $serverName /u $userName /p $pass /ru $userName /rp $pass /st $startTime
该命令将创建一个计划任务运行一次,然后删除后自己。它甚至需要计算机名称,因此不需要远程访问。您也可以执行schtasks.exe/query并在执行schtasks.exe /删除之前检查“状态”是否正在运行。
2。使用`(反向)指定进位执行到PowerShell的下一行
3。我用这个函数得到标准输出和错误,有时在大脚本中执行时不输出,但总是可以使用$?捕捉错误。
注意:您无法将PSCredentials传递给此命令。我建议制作一个仅仅提示输入用户名和密码的GUI,而不必转换为安全字符串。我尽量远离脚本中的远程处理,因为它总是让一切变得如此缓慢。有时你没有选择,但在这种情况下,我相信你会这样做。