Удалите пакеты MSP, отличные от Windows, с PowerShell - PullRequest
0 голосов
/ 30 марта 2012

Я пытаюсь удалить MSP не от Microsoft с сервера под управлением Win2k3 или Win2k8.Обновление отображается в окне «Установка и удаление программ» при выборе «Просмотр установленных обновлений».Однако я не могу найти способ получить GUID MSP.

Я планировал использовать

msiexec /i {GUID-OF-PRODUCT} MSIPATCHREMOVE={GUID_OF_PATCH} /qb 

, который был найден в этой статье: как удалить патчиз консоли

Однако у меня нет способа получить GUID патча из командной строки.Кто-нибудь еще мог сделать что-то подобное?Существует множество способов сделать это для исправлений Microsoft, но, поскольку это не Microsoft, я надеюсь, что это все еще возможно.Спасибо, Грег

1 Ответ

0 голосов
/ 05 апреля 2012

Вы можете использовать com-объект установщика Windows для перечисления исправлений.

Проверьте эту статью. Он не делает именно то, что вам нужно, но предоставляет файл comObject.types.ps1xml, который вам понадобится:

http://www.snowland.se/2010/02/21/read-msi-information-with-powershell/

Тогда вы можете сделать это, чтобы получить патч:

$installer_obj =  New-Object -com WindowsInstaller.Installer;
$patches = $installer_obj.InvokeParamProperty("PatchesEx", "Product-Code-GUID", "s-1-1-0", 7, 15);

Product-Code-GUID - это GUID для интересующего вас продукта. Я также предпочитаю перечислять список продуктов и программно получать GUID на основе понятного человеку имени (то есть того, которое отображается в Add. / Удаление программ).

$installer_obj =  New-Object -com WindowsInstaller.Installer;
$all_products = $installer_obj.GetProperty("Products");
foreach($product_code in $all_products) {
    $product_name = $installer_obj.InvokeParamProperty("ProductInfo", $product_code, "ProductName")
    if($product_name -eq "MySQL Server 5.1")    {
        $interesting_product_code = $product_code;
    }
}
$patches = $installer_obj.InvokeParamProperty("PatchesEx", $interesting_product_code, "s-1-1-0", 7, 15);

Любой маршрут, по которому вы идете, теперь вам просто нужно перебрать $ patches и вызвать msiexec из командной строки с правильными аргументами (если вы решите использовать буквальную строку для кода $интересный_продукт_кода, просто замените переменную и объедините с буквенной строкой GUID.):

foreach($patch in $patches) {                   
    $patch_code = $patch.GetProperty("PatchCode");                              
    $argument_list = "/I" + $interesting_product_code + " MSIPATCHREMOVE=$patch_code /qb /norestart";       
    Start-Process -FilePath "msiexec.exe" -ArgumentList $argument_list -Wait;
}   

Вот ссылка на com-объект установщика Windows. Вы можете сделать с ним и другие забавные вещи:

http://msdn.microsoft.com/en-us/library/windows/desktop/aa369432%28v=vs.85%29.aspx

Надеюсь, это поможет, Аарон

...