繁体   English   中英

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

[英]Howto use psexec via powershell invoke-command on a remote computer? (invalid handle)

我编写了一个 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 时才会失败)

这是 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>"

您可以尝试替换您的 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"} 

您遇到了第二跳问题: 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:-Authentication Credssp -Credential

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM