Get-WMIObject Uninstall vs Get-CIMInstance Uninstall

Наверное, глупый вопрос, но мне просто любопытно.

Есть ли разница между и при запуске удаления для приложения в Win32_Productкласс? Я спрашиваю только потому, что:

  • Использование для удаления приложения перезагрузит мой компьютер с определенными программами.
  • Использование для удаления приложения просто запускается без перезагрузки.

Кроме того, трубопровод Get-Member к любому продукту, не дает мне способа удалить, но использует Get-WMIObject. Это просто так написали разработчики? Хотя, все еще работает.

Get-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()
#>

Get-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)
#>

Простите за длинный пост, просто любопытный ум.

Пожалуйста, удалите / закройте, если не разрешено.

2 ответа

Решение

Есть много различий между использованием командлетов WMI и новых командлетов CIM. 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'

Вы можете обнаружить методы, используя Get-CimClass

      (Get-CimClass win32_process ).CimClassMethods

Если вам нужны аргументы для данного метода, их можно передать через -Argumentsпараметр, используя хеш-таблицу в качестве аргумента. Вы можете найти примеры в файле справки или здесь

Вы также можете напрямую использовать Invoke-WMIMethod:

      Invoke-CimMethod -Query "SELECT * FROM Win32_Process WHERE Name = 'powershell_ise.exe'" -MethodName Terminate

Обычно я так не делаю, потому что это немного менее многословно для использования с -CLassName, и отсутствует, недоступен с Invoke-CimMethod Однако это лишь личные предпочтения.

Я рекомендую вам прочитать Введение в CIM командлетов , а также

Также у Win32_Product плохая репутация. Если вы погуглите, вы можете получить больше информации, но вот статья, которую я быстро нашел с помощью вопросов SO: Почему Win32_Product - это плохие новости

Как правило, вы должны переместить фильтрацию влево в команде. Использовать -Query или же -Filter параметры вместо получения всех экземпляров и использования Where{}потом. Особенно учитывая известные проблемы с производительностью Win32_Product.

Или с помощью get-package, предполагая, что это установка msi:

      get-package *visual* | uninstall-package

Класс win32_product также является заведомо медленным, поскольку он проверяет все msi-файлы при его использовании.

Другие вопросы по тегам