如何在远程计算机上通过powershell invoke-command使用psexec? (无效句柄)

时间:2014-05-19 08:29:25

标签: windows batch-file powershell psexec

我编写了一个powershell脚本,根据远程主机应该远程启动这个脚本(通过powershell invoke-command或psexec)创建一个powershell脚本或批处理脚本。

该脚本创建PowerShell或批处理脚本,因为并非所有运行这些创建脚本的主机都支持WinRM(Windows远程管理)。

创建的脚本包括一些psexec行,这些行在另一个远程主机上执行命令。创建的批处理脚本按预期工作,但是从创建的powershell脚本中,我从psexec调用中得到以下错误。

NotSpecified: (:String) [], RemoteException
    + CategoryInfo          : NotSpecified: (:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError
    + PSComputerName        : <HOSTNAME REPLACED>

PsExec v2.1 - Execute processes remotely
Copyright (C) 2001-2013 Mark Russinovich
Sysinternals - www.sysinternals.com
The handle is invalid.
Access is denied.
Connecting to 10.XXX.XXX.127...Couldn't access 10.XXX.XXX.127:
Starting PSEXESVC service on 10.XXX.XXX.127...Could not start PSEXESVC service on 10.XXX.XXX.127:
Connecting to 10.XXX.XXX.127...Starting PSEXESVC service on 10.XXX.XXX.127...

以下是对所做工作的一个小概述:

  1. 部署主机上的Powershell脚本根据目标主机创建转出脚本(ps1或批处理)
  2. 部署主机上的Powershell脚本在目标主机上启动创建的转出脚本
    • Powershell将通过Invoke-Command -ComputerName <destination host> -FilePath <path to created script> -Authentication default
    • 启动
    • 批次将通过& psexec.exe \\<destination host> -n 60 -accepteula -c -f <path to created script>
    • 启动
  3. 目标主机上创建的rollout脚本执行psexec命令以在第三个主机上启动服务(仅当rollout脚本为powershell时才会失败)
  4. 这是psexec命令,如果通过远程启动的PowerShell脚本执行,则会失败。

    & psexec.exe \\<destination host> -n 60 -accepteula -u <user> -p <password> net stop <servicename>

    通过远程启动的批处理脚本执行的同一命令psexec.exe \\<destination host> -n 60 -accepteula -u <user> -p <password> net stop <servicename>可以正常工作。

    更新#1

    此外,如果我使用rdp连接到目标主机并启动powershell shell并粘贴命令,它可以正常工作。只有在远程启动时才会出现此问题。

    我已经尝试了以下启动psexec的变种,一切都没有运气!

    1. & psexec.exe \\<destination host> -n 60 -accepteula -s -u <user> -p <password> net stop <servicename>
    2. Start-Process cmd.exe -Credential "<domain>\<user>" -WorkingDirectory $env:systemdrive -ArgumentList "/C psexec.exe \\<destination host> -n 60 -accepteula -u <user> -p <password> net stop <servicename>"
    3. Start-Process powershell.exe -WorkingDirectory $env:systemdrive -Verb Runas -ArgumentList "cmd.exe /C psexec.exe \\<destination host> -n 60 -accepteula -u <user> -p <password> net stop <servicename>"

3 个答案:

答案 0 :(得分:0)

你可以尝试替换你的psexec命令,并像这样使用cmd.exe也将-s添加到psexec,以便它将作为系统用户运行。我的测试命令:

icm -cn computer1  -ScriptBlock{ cmd.exe "/c psexec -s -u <login> -p <password> /accepteula /n 10 \\computer2 net start audiosrv"} 

答案 1 :(得分:0)

您遇到了第二跳问题: http://blogs.technet.com/b/heyscriptingguy/archive/2012/11/14/enable-powershell-quot-second-hop-quot-functionality-with-credssp.aspx

答案是在所涉及的两台计算机之间建立适当的关系(请参阅上一个链接或只搜索谷歌搜索&#39; powershell&#39;以及&#39;第二跳&#39;)并添加到Invoke-命令:   -Authentication Credssp -Credential

答案 2 :(得分:0)

对我有用的是: Start-Process -FilePath。\ PsExec.exe -ArgumentList&#34; / acceptEula / s \ $ Computer program.exe / arg&#34;