2013-06-24 5 views
2

Чтобы установить/удалить/обновить наше программное обеспечение, наш пользовательский установщик использует WindowsInstaller.Installer.Products, чтобы получить список установленных продуктов из реестра Windows.Получение списка установленных продуктов C#

А на некоторых клиентских машинах, неизвестное программное обеспечение, вероятно, при добавлении новой записи в реестре «HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes \ Installer \ Products» ключ с именем что-то вроде «ABCD». Это вызывает ошибку WindowsInstaller.Installer.Products. Я могу создать этот сценарий, вручную добавив запись в раздел реестра «HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes \ Installer \ Products 'named' test '. И если я переименую тест на новый GUID, тогда смоделированная проблема будет решена.

Можете ли вы предложить любое возможное обходное решение/решение?

Использование инструмента MSIINV.exe будет затруднительным, так как это инструмент сторонних разработчиков, но это помогает.

+0

Ознакомьтесь с библиотеками взаимодействия MSI в DTX WiX (см. Ниже). Это намного проще и чище, чем пытаться использовать COM Interop с WindowsInstaller.Installer. –

ответ

2

Я хотел бы взглянуть на пространство имен Microsoft.Deployment.WindowsInstaller, обнаруженное в Microsoft Deployment Tools Foundation (DTF) в Windows Installer XML (WiX). Он имеет:

public static IEnumerable<ProductInstallation> GetProducts(
    string productCode, 
    string userSid, 
    UserContexts context 
) 

ProductCode (String)

ProductCode (GUID) экземпляры продукта, чтобы быть перечислены. Будут перечислены только экземпляры продуктов в рамках контекста , указанные параметрами userSid и context. Этот параметр может быть установлен в значение NULL, чтобы перечислять все продукты в указанном контексте .

userSid (строка)

Указывает идентификатор безопасности (SID), который ограничивает контекст перечисления. Значение SID другое , чем s-1-1-0, считается SID пользователя и ограничивает перечисление текущему пользователю или любому пользователю в системе . Специальная строка SID s-1-1-0 (Everyone) указывает перечисление для всех пользователей в системе. Для этого параметра может быть установлено значение null, чтобы ограничить область перечисления текущим пользователем . Если контекст установлен только для машинного контекста, userSid должен иметь значение NULL.

контекст (UserContexts)

Определяет пользовательский контекст.

, который обертывает функцию Win32 MSI API MsiEnumProductsEx. Это возвращает коллекцию ProductInstallation, в которой вы можете выполнять запросы Linq, чтобы узнать все, что вам нужно знать о установленных MSI.

+0

Спасибо за ваш ответ. Я вижу, что WIX DTF сейчас является проектом с открытым исходным кодом, хотя он был запущен Microsoft. Разве я не могу многое сделать с предоставленными Microsoft собраниями? Я не ненавистник с открытым исходным кодом, но здесь сложно что-то добавить! – ViV

+0

В качестве альтернативы я пытаюсь использовать свойство ProductEx, как показано ниже ... 'Interop.WindowsInstaller.Installer.ProductEx [" "," ", 7]'. Но я не могу понять, как использовать возвращенный RecordList. Это работает, несмотря на наличие «плохого» значения реестра, упомянутого выше. Можете ли вы рассказать мне, как использовать возвращенную запись RecordList в приложении C#. – ViV

+0

Установщик Windows вышел из платформы Windows и имеет поддержку только для Win32 и COM. Существует также поддержка WMI через класс Win32_Product, но, откровенно говоря, поддержка WMI ужасно нарушена, и у поддержки COM есть проблемы с созданием перехватов в последний раз, когда я проверял. Поддержка MSI в библиотеках базового класса .NET Framework отсутствует. –