Get-WMIObject 卸载与 Get-CIMInstance 卸载

Abr*_*ala 2 powershell wmi cim powershell-5.1

可能是一个愚蠢的问题,但我只是好奇。

为该类下的应用程序调用卸载时Get-CIMInstance和调用卸载时有区别吗?我问的唯一原因是:Get-WMIObjectWin32_Product

  • 使用Get-CIMInstance卸载应用程序时,将使用某些程序重新启动我的计算机。
  • 用于Get-WMIObject卸载应用程序无需重新启动即可运行。

另外,将 a 管道连接Get-Member到任何Get-CIMInstance产品,并没有给我卸载的方法,但它确实使用Get-WMIObject. 开发者就是这么写的吗?虽然,Invoke-CIMMethod -Name Uninstall仍然有效。

获取 CIMInstance/卸载

Get-CIMInstance这是我使用/卸载多个应用程序时所做的操作Invoke-CIMMethod -Name Uninstall

Get-CimInstance -ClassName win32_product | Where-Object Name -Match "Visual" | 
    ForEach-Object -Process { 
        Invoke-CimMethod -InputObject $_ -Name Uninstall 
                            }
#Methods Returned
<#
Get-CimInstance -ClassName win32_product | Where-Object Name -Match "Visual" | Get-Member -MemberType Method


   TypeName: Microsoft.Management.Infrastructure.CimInstance#root/cimv2/Win32_Product

Name                      MemberType Definition
----                      ---------- ----------
Clone                     Method     System.Object ICloneable.Clone()
Dispose                   Method     void Dispose(), void IDisposable.Dispose()
Equals                    Method     bool Equals(System.Object obj)
GetCimSessionComputerName Method     string GetCimSessionComputerName()
GetCimSessionInstanceId   Method     guid GetCimSessionInstanceId()
GetHashCode               Method     int GetHashCode()
GetObjectData             Method     void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Ser...
GetType                   Method     type GetType()
ToString                  Method     string ToString()
#>
Run Code Online (Sandbox Code Playgroud)

获取 WMIObject / 卸载

Get-WMIObject -ClassName win32_product | Where-Object Name -Match "Visual" | 
    ForEach-Object -Process { 
        Invoke-WMIMethod -InputObject $_ -Name Uninstall 
                            }
#Methods Returned
<#
Get-WMIObject -Class win32_product | Where-Object Name -Match "Visual" | Get-Member -MemberType Method


   TypeName: System.Management.ManagementObject#root\cimv2\Win32_Product

Name      MemberType Definition
----      ---------- ----------
Configure Method     System.Management.ManagementBaseObject Configure(System.UInt16 InstallState, System.UInt16 InstallLevel, S...
Reinstall Method     System.Management.ManagementBaseObject Reinstall(System.UInt16 ReinstallMode)
Uninstall Method     System.Management.ManagementBaseObject Uninstall()
Upgrade   Method     System.Management.ManagementBaseObject Upgrade(System.String PackageLocation, System.String Options)
#>
Run Code Online (Sandbox Code Playgroud)

请原谅这篇长文,只是出于好奇。

如果不允许,请删除/关闭。

Ste*_*ven 6

使用 WMI cmdlet 和较新的 CIM cmdlet 之间存在很多差异。 Get-WMIObject在 Windows PowerShell 中已弃用,并已从 PowerShell Core 中删除,因此一般建议使用 CIM。不过,这些方法的行为不应有所不同,因此我无法解释您提到的重新启动行为。

Get-CimInstance don't have the methods, but you can pass them to Invoke-CimMethod`返回的对象。

$instance = Get-CimInstance win32_process -Filter "Name = 'powershell_ise.exe'"
$instance | Invoke-CimMethod -MethodName 'Terminate'
Run Code Online (Sandbox Code Playgroud)

您可以使用以下方法发现方法Get-CimClass

(Get-CimClass win32_process ).CimClassMethods
Run Code Online (Sandbox Code Playgroud)

-Arguments如果您需要给定方法的参数,则可以使用哈希表作为参数通过参数传递它们。您可以在帮助文件或此处找到示例

您也可以直接使用 Invoke-WMIMethod:

Invoke-CimMethod -Query "SELECT * FROM Win32_Process WHERE Name = 'powershell_ise.exe'" -MethodName Terminate
Run Code Online (Sandbox Code Playgroud)

我通常不会这样做,因为-Filter与 一起使用会稍微不那么冗长-CLassName,并且-Filter与 一起使用时丢失不可用Invoke-CimMethod但是,这些只是个人喜好。

我建议您也阅读CIM Cmdlet 简介

此外,Win32_Product 的声誉也很差。如果你用谷歌搜索,你可以获得更多信息,但这是我通过一些问题很快找到的一篇文章:Why Win32_Product is Bad News

作为一般规则,您应该将过滤移到命令中的左侧。使用-Query-Filter参数,而不是获取所有实例并Where{}随后使用 a 。特别是考虑 Win32_Product 的已知性能问题。