【问题标题】:Determine PowerShell version remotely via WMI通过 WMI 远程确定 PowerShell 版本
【发布时间】:2015-06-22 07:53:20
【问题描述】:

我已经在这里和其他地方搜索过,但找不到答案,所以这是我的问题。

使用 WMI 在远程计算机上确定 PowerShell 版本的最佳方法是什么?

背景

我的任务是审核大约 1000 台服务器并将其更新到最新版本的 PowerShell。其中一些具有 PowerShell v1,而另一些则没有配置 WinRM,因此 Invoke-command 不是一个选项。 PSExec 在此环境中也不是一个选项。这就是为什么我需要使用 WMI 来完成这项任务。

任何帮助将不胜感激。

编辑:

经过大量研究,我仍然倾向于 WMI。特别是检索“powershell.exe”的文件版本。在我看来,这是覆盖所有版本的唯一方法。

到目前为止我的代码在这里:

$path = "C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\powershell.exe" 
$query = "SELECT Version FROM CIM_DataFile WHERE Name = '$path'" 
$PSFileVer = Get-WmiObject -Query $query -ComputerName $servername -Credential $creds 
$BuildVer = [version]$PSFileVer.Version.Split()[0]

我现在只需要一个完整的列表,将文件版本(内部版本号)映射到 powershell 版本。有什么想法吗?

【问题讨论】:

  • 使用像 System Center Configuration Manager 这样的管理工具怎么样?在没有好的工具的情况下管理几十台服务器是浪费时间。
  • SCCM 是一个选项,但仅涵盖大约 80% 的服务器。我正在寻找 PowerShell/WMI 解决方案的另一个原因。
  • 那么registry keys 怎么样?
  • @vonPryz 谢谢。 “Microsoft 推荐的前向兼容方法” 不幸的是,PowerShell 版本 3 无法使用。如果您坚持使用版本 1 和 2,它仍然是一个可行的选择。

标签: powershell wmi powershell-remoting


【解决方案1】:

here的解决方案是

$command = "ipconfig/all > C:\temp\result.txt"
$cmd = "cmd /c $command"

Invoke-WmiMethod -class Win32_process -name Create -ArgumentList $cmd -ComputerName "remotepc"
sleep 1
Get-Content \\remotepc\C$\temp\result.txt

您也可以通过this 方法进行类似操作。如果这样做,你不能直接得到返回值,你必须重定向到一个文件。

您可以为结果设置共享,而不是将结果放在本地机器上

【讨论】:

  • 谢谢@majkinetor。这绝对是通过 WMI 在远程 PC 上执行代码的合理方式。虽然我真的不喜欢使用 .tmp 文件来获取结果,但如果我没有想出更好的方法,我最终可能会使用它。
【解决方案2】:

如果有帮助,这里是命令:

$command = "powershell -command "+'"$PSVersionTable.PsVersion.Major | out-file c:\temp\version.txt"'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 2016-08-22
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    相关资源
    最近更新 更多