Удалите пакеты MSP, отличные от Windows, с помощью powershell

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

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

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

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

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


person gregs    schedule 30.03.2012    source источник


Ответы (1)


Вы можете использовать объект 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 на основе удобочитаемого имени (т. е. того, которое отображается в «Установке и удалении программ»). ).

$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 из командной строки с соответствующими аргументами (если вы решите использовать литеральную строку для $interesting_product_code, просто замените переменную и конкатенацию литералом строка 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

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

person Aaron Ray    schedule 04.04.2012
comment
Это работает. Однако у вас недостаточно репутации, чтобы проголосовать за ответ. - person gregs; 13.05.2013