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-файлы при его использовании.