通过PowerShell运行远程守护程序(而不仅仅是)进程的问题

时间:2013-07-23 09:20:59

标签: windows powershell powershell-v2.0 remote-access invoke-command

从我的脚本中我想在远程Windows框中运行一些命令。所以我用google搜索了一下,似乎最流行和不知何故的标准方法是使用PowerShell的Invoke-Command cmdlet,它似乎使用与winrmwinrs相同的协议。所以,下面是我试图从我的脚本调用的命令(实际上我已经尝试了很多其他的修改,但IMO这些足以说明问题):

  1. 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>};"

  2. 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};"

  3. 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>};"

  4. 注意:脚本是用perl编写的,但IMO脚本的语言并不重要,所以你可以假设我从batch调用命令脚本,请注意,作为命令应该从脚本运行,它们不应该需要任何交互操作。

    所以,我对这些命令有几个问题,需要帮助来弄清楚它们。他们在这里:

    1. 无法运行configure and run daemon类型的进程。也就是说,如果我想在远程方框(configure_server.pl)上运行<fullcommand> = "configure_server.pl <arguments>",这应该做一些事情,然后运行server.exe,它就不起作用,因为只要{{1}完成后,完整的远程作业被杀死,包括应该作为守护进程运行的configure_server.pl。 (适用于第1,2,3点)
    2. 获取包装(每行的长度小于或等于80个字符)标准输出和标准错误。 (适用于第1,3点)
    3. 不要获得标准输出和标准错误。 (适用于第2点)

1 个答案:

答案 0 :(得分:0)

这是一个艰难的,你到处都是如此,如果我想念你想要完成的事情,请完全告诉我。

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 /查询并在执行schtasks.exe / delete之前检查“状态”是否正常运行。

2。使用`(反引号)将进位执行指定到powershell中的下一行 3。我用这个函数得到标准输出和错误,有时在大脚本中执行时不输出,但总是可以使用$?捕获错误。

注意:您无法将PSCredentials传递给此命令。我建议创建一个只提示输入userName和密码的GUI,而不转换为安全字符串。我试图远离我的脚本中的远程处理,因为它总是让一切都变得如此缓慢。有时你没有选择,但在这种情况下我相信你这样做。