【问题标题】:Problems with running remote daemon (and not only) processes via PowerShell通过 PowerShell 运行远程守护程序(而不仅仅是)进程的问题
【发布时间】:2013-07-23 09:20:58
【问题描述】:

从我的脚本中,我想在远程 Windows 框中运行一些命令。所以我用谷歌搜索了一下,似乎最流行和标准的方法是使用 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>};"

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

所以,我在使用这些命令时遇到了几个问题,需要帮助来解决这些问题。他们在这里:

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

【问题讨论】:

    标签: windows powershell powershell-2.0 remote-access invoke-command


    【解决方案1】:

    哇,这是一个艰难的过程,你的那种到处都是,所以如果我错过了你试图做的事情,请告诉我。

    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 /delete 之前执行 schtasks.exe /query 并检查运行的“状态”。

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

    注意:您不能将 PSCredentials 传递给此命令。我建议制作一个只提示输入用户名和密码的 GUI,而不转换为安全字符串。我尽量避免在我的脚本中进行远程处理,因为它总是让一切变得如此缓慢。有时你别无选择,但在这种情况下,我相信你有。

    【讨论】:

      猜你喜欢
      • 2011-02-13
      • 2010-09-18
      • 2023-03-02
      • 1970-01-01
      • 2014-04-12
      • 2013-05-11
      • 2018-03-10
      • 2012-05-19
      • 2012-07-28
      相关资源
      最近更新 更多