什么库PowerShell的6包含了get-WmiObject可以命令?

时间:2019-02-02 16:27:40

标签: powershell wmi powershell-core cim

尝试在PowerShell(版本6)中使用get-WmiObject命令时出现以下错误:

PS C:\Users\zsofi> Get-WmiObject Win32_product | select name, packagecache

Get-WmiObject : The term 'Get-WmiObject' is not recognized as the name of a cmdlet, function, script file, or operable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:1
+ Get-WmiObject Win32_product | select name, packagecache
+ ~~~~~~~~~~~~~
+ CategoryInfo          : ObjectNotFound: (Get-WmiObject:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException`

2 个答案:

答案 0 :(得分:2)

据我所知,唯一的方法是兼容性模块。这是微软一个非常整洁的模块,实际上隐含远程在同一台机器上的Windows PowerShell 5.1会话的方式使得PS核心可用的Windows PS的cmdlet。 https://github.com/PowerShell/WindowsCompatibility

答案 1 :(得分:1)

Gert Jan Kraaijeveld's helpful answer为cmdlet提供了解决方案,这些cmdlet仅在 Windows PowerShell 中才可用(在PowerShell Core 中也不可用)。

但是,在这种特殊情况下,正如Lee_Daily在评论中指出的那样,您可以使用Get-CimInstance cmdlet 在PowerShell Core(v6 + ):

Get-CImInstance CIM_Product | Select-Object Name, PackageCache

注意CIM_Product类名; CIM类通常与WMI Win32_*对应类具有相同的属性。

实际上,即使在Windows PowerShell中也建议使用CIM(*-Cim*)cmdlet ,因为自引入以来,WMI(*-Wmi*)cmdlet已被弃用。版本3中的CIM cmdlet;来自Get-CimInstance docs

  

从Windows PowerShell 3.0开始,此cmdlet已被Get-CimInstance取代。

对于 为什么 CIM cmdlet是更好的选择(引自this TechNet blog post):

  

WMI cmdlet的最大缺点是它们使用DCOM访问远程计算机。 DCOM对防火墙不友好,可以被网络设备阻止,并在出现问题时发出一些不可思议的错误。

同一篇博客文章还介绍了CIM cmdlet的方式:

  • 使用与PowerShell本身(WS-Management)相同的基于基于标准的远程处理机制

  • 支持会话

  • 功能与过时的WMI同行略有不同,因为他们没有直接的方法; 方法必须使用Invoke-CimMethod 来调用。