Доступ к информации о патче? - PullRequest
0 голосов
/ 23 декабря 2011

Кто-нибудь знает, как при наличии GUID, идентифицирующего установленный продукт, вы можете найти патчи, установленные для этого продукта с помощью C #?

Приложение довольно сложное, и время от времени мы создаем патчи (файлы MSP) через Orca / MSI. Затем эти исправления можно установить на компьютер клиента, а затем просмотреть в «Просмотр установленных обновлений» в разделе «Программы и компоненты».

Я пробовал два подхода:

  1. Используя WMI, я могу найти свой продукт в Win32_Product и получить информация там. Тем не менее, если я тогда запросить либо Win32_PatchPackage или Win32_Patch для совпадений с "Код продукта". Я бы ожидал подписи / описание содержать информацию, которую я хочу, но все, что я получаю, это еще один отдельный набор идентификаторов GUID для каждого, который не кажется очевидным, что делать с этим.

  2. Аналогичным образом, используя реестр, я могу найти продукт (в HKLM \ Software \ Microsoft \ Uninstall \\, и с некоторыми копаниями я можно найти патчи (под HKLM \ Software \ Microsoft \ Installer \ UserData \ S-1-5-18 \ Products \) но ключ не очевиден. Это не то же самое, что мои продукты GUID установщика.

В этом вопросе обсуждаются аналогичные проблемы, но спрашивающий искал исправления для Windows, в то время как мне нужны мои собственные исправления для приложений - так что решение не работает для меня.

Спасибо заранее.

1 Ответ

0 голосов
/ 04 января 2012

Мне удалось этого добиться, подключив ProductCode, возвращенный из Win32_PatchPackage, в 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");
    }
...