【问题标题】:Running PsExec.exe on Remote PC在远程 PC 上运行 PsExec.exe
【发布时间】:2019-04-05 20:20:03
【问题描述】:

我有一个 PowerShell 脚本,当在本地用户帐户上运行时,它会在我们的远程服务器上配置 WinRM。但是,我需要将脚本上传到 TFS 并让每个主机自己运行脚本。

脚本检查是否配置了 WinRM。如果不存在,则检查 C:\PSTools\PsExec.exe 路径是否存在。如果路径存在,则需要配置 WinRM 使用:

$configure = (C:\PSTools\PsExec.exe \\$hostname -s winrm.cmd -q 2> $null)

但是,上面的结果是错误的

术语“C:\PSTools\PsExec.exe”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。检查名称的拼写,如果包含路径,请验证路径是否正确,然后重试。

我知道文件在那里,所以我不确定我在这里做错了什么。我见过的其他示例单独使用psexec./PsExec.exe,但这些都不起作用。

任何建议表示赞赏,谢谢。

【问题讨论】:

  • 去掉括号,因为它们是不必要的
  • gcm /pstools/psexec 有什么回报吗?
  • 对,括号只是样式偏好,不影响操作。 Get-Command -Name c:/pstools/psexec.exe 确实返回文件信息(命令类型:应用程序 - 名称:psexec.exe - 版本:2.20.0.0 - 来源:C:\pstools\psexec.exe)
  • 当您说“将脚本上传到 TFS 并让每个主机自己运行脚本”时 - 这是否意味着您正在 TFS 服务器上运行脚本或在需要配置 winrm 的每个主机上运行它开吗?

标签: powershell psexec


【解决方案1】:

虽然这不能解释为什么 psexec.exe 不起作用(尽管我怀疑这是因为该文件实际上并不存在),但您可以改用 WMI 来启用 WinRM

([wmiclass]"\\$hostname\root\cimv2:win32_process").
    Create('powershell "Enable-PSRemoting -Force -SkipNetworkProfileCheck"')

并远程重新启动您的服务(即使Enable-PSRemoting 处理此问题):

$svc = [wmi]"\\$hostname\root\cimv2:win32_service.Name='winrm'"
$svc.StopService()
$svc.StartService()

【讨论】:

  • 我知道该文件在那里,因为我昨天把它放在那里,目前正在登录到那台远程 PC 看它哈哈。我不知道能够在 WMI 中做同样的事情,不过,我会试一试。脚本中唯一使用 PsExec 的其他命令是重新启动 WinRM,我假设 WMI 也可以这样做?
  • @Skyler 是的,$svc = [wmi]"\\$hostname\root\cimv2:win32_service.Name='winrm'"; $svc.StopService(); $svc.StartService()Enable-PSRemoting 无论如何都会为你做这件事。
  • 太棒了,感谢@TheIncorrigible1,感谢您的帮助。重启工作正常,但启用函数返回Cannot convert value \\<hostname>\root\cimv2:win32_process" to type "System.Management.ManagementObject". Error: "Specified argument was out of the range of valid values. Parameter name: path"。正在寻找解决方案。
  • @Skyler 我已经更新了我的答案。我使用了错误的类型转换
  • 谢谢,我会用它做一些测试。我们在 TFS 中运行了几个 powershell 脚本,因此将首先运行此脚本以确保首先启用 WinRM,否则所有后续脚本都会失败。
最近更新 更多