windows 如何通过powershell调用命令在远程计算机上使用psexec?(无效句柄)

v8wbuo2f  于 2022-12-19  发布在  Windows
关注(0)|答案(3)|浏览(244)

我已经编写了一个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或batch

  • 部署主机上的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>启动
  • 在目标主机上创建的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>"
crcmnpdw

crcmnpdw1#

你可以尝试替换你的psexec命令,并像这样使用cmd.exe吗?也可以在psexec中添加-s,这样它就可以作为系统用户运行了。

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

au9on6nz2#

您遇到了第二跳问题:http://blogs.technet.com/b/heyscriptingguy/archive/2012/11/14/enable-powershell-quot-second-hop-quot-functionality-with-credssp.aspx
答案是启用两台相关计算机之间的适当关系(请参阅前面的链接,或只需在谷歌上搜索“powershell”和“second hop”),并添加到Invoke-Command:- 身份验证凭据sp-凭据

wfsdck30

wfsdck303#

对我有效的是:启动-进程-文件路径。\PsExec.exe-参数列表“/acceptEula /s $计算机程序. exe/arg”

相关问题