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

问题描述 投票:0回答:3

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

该脚本创建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时才会失败)

这是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>"
windows batch-file powershell psexec
3个回答
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"} 

0
投票

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

答案是在所涉及的两台计算机之间建立适当的关系(参见上一个链接或只搜索谷歌搜索'powershell'和'第二跳')并添加到Invoke-Command:-Authentication Credssp -Credential


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.