使用PowerShell删除非Windows MSP包

时间:2012-03-30 14:58:07

标签: powershell patch updates

我正在尝试从运行Win2k3或Win2k8的服务器中删除非Microsoft MSP。选择“查看已安装的更新”时,更新会显示在“添加/删除”程序中。但是我似乎无法找到获得MSP GUID的方法。

我计划使用

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

在本文中找到:how to remove the Patch from console

但是,我无法从命令行获取Patch GUID。有没有其他人能够做这样的事情?有很多方法可以为Microsoft补丁执行此操作,但由于这不是Microsoft,我希望它仍然可行。 谢谢, 格雷格

1 个答案:

答案 0 :(得分:0)

您可以使用Windows Installer com对象枚举修补程序。

查看这篇文章。它并不能完全满足您的需求,但它提供了您需要的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。我更喜欢枚举产品列表,并根据人类可读的名称(即Add中显示的名称)以编程方式获取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);

你采取的路线,现在你只需要循环遍历$ patch并使用正确的参数从命令行调用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;
}   

以下是对Windows Installer com对象的引用。你也可以用它做一些有趣的事情:

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

希望有所帮助, 亚伦