有谁知道,如果给定一个标识已安装产品的GUID,您可以找到使用C#为该产品安装的补丁吗?
应用程序非常复杂,我们不时通过Orca / MSI创建补丁(MSP文件)。然后可以将这些补丁安装在客户的计算机上,然后在“程序和功能”下的“查看已安装的更新”中查看。
我尝试了两种方法:
使用WMI我可以在Win32_Product中找到我的产品并检索 那里的信息。但是,如果我然后查询 Win32_PatchPackage或Win32_Patch用于匹配 “产品代码”。我本来期望字幕/描述 包含我想要的信息,但我得到的是另一个单独的信息 每个GUID的集合,似乎不是很明显该做什么 用它。
同样,使用注册表我可以找到产品(在 HKLM \ Software \ Microsoft \ Uninstall \\,还有一些挖掘我 可以找到补丁(在 HKLM \ SOFTWARE \微软\安装\的UserData \ S-1-5-18 \产品\) 但关键不明显。它与我的产品不一样 安装程序GUID。
This question讨论了类似的问题,但提问者正在寻找Windows补丁,而我需要自己的应用程序补丁 - 所以解决方案对我来说并不适用。
提前致谢。
答案 0 :(得分:0)
我能够通过将从Win32_PatchPackage返回的ProductCode插入到Win32 dll中然后使用它来实现这一目的。
[DllImport("msi.dll", CharSet = CharSet.Unicode)]
internal static extern Int32 MsiGetPatchInfoEx(string szPatchCode, string szProductCode, string szUserSid, int dwContext, string szProperty, [Out] StringBuilder lpValue, ref Int32 pcchValue);
// See http://msdn.microsoft.com/en-us/library/windows/desktop/aa370128%28v=vs.85%29.aspx
// for valid values for the property paramater
private static string getPatchInfoProperty(string patchCode, string productCode, string property)
{
StringBuilder output = new StringBuilder(512);
int len = 512;
MsiGetPatchInfoEx(patchCode, productCode, null, 4, property, output, ref len);
return output.ToString();
}
public static string GetPatchDisplayName(string patchCode, string productCode)
{
return getPatchInfoProperty(patchCode, productCode, "DisplayName");
}