我正在尝试从运行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,我希望它仍然可行。 谢谢, 格雷格
答案 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
希望有所帮助, 亚伦