2010-08-19 1 views
7

Как я могу запросить для точной и локализованного списка обновлений Windows, установленного на компьютер с помощью C#?запросов для точного и локализованного списка установленных обновлений для Windows

Я определяю точный в соответствие то, что отображается в категории «Microsoft Windows» ЗРЕНИЯ установлен диалог от Microsoft Updates под Программы и компоненты в Windows, 7.

Если я использую WUApi.DLL, информация вернулся локализован, но я не могу получить точный список. В случае WUApi.dll, некоторые исправления отсутствуют, и если обновление было удалено, он по-прежнему отображается в списке сгенерирован следующий код:

public static void GetWindowsUpdates() 
{ 
    var updateSession = new UpdateSession(); 
    var updateSearcher = updateSession.CreateUpdateSearcher(); 
    var count = updateSearcher.GetTotalHistoryCount(); 
    if (count == 0) 
     return; 

    var history = updateSearcher.QueryHistory(0, count); 
    for (int i = 0; i < count; i++) 
    { 
     if (history[i].ResultCode == OperationResultCode.orcSucceeded) 
     { 
      Console.WriteLine(history[i].Title); 

      if (history[i].Operation == UpdateOperation.uoUninstallation) 
      { 
       Console.WriteLine("!!! Operation == uninstall"); // This is never true 
      } 
     } 
    } 
} 

Метод поиск WUApi также не обеспечивает точный список, используя следующий код:

 WUApiLib.UpdateSessionClass session = new WUApiLib.UpdateSessionClass(); 
     WUApiLib.IUpdateSearcher searcher = session.CreateUpdateSearcher(); 

     searcher.IncludePotentiallySupersededUpdates = true; 

     WUApiLib.ISearchResult result = searcher.Search("IsInstalled=1"); 
     Console.WriteLine("Updates found: " + result.Updates.Count); 
     foreach (IUpdate item in result.Updates) 
     { 
      Console.WriteLine(item.Title); 
     } 

Если я использую WMI, чтобы прочитать список обновлений, я могу получить точный список, но он не локализован. Я использую следующий код:

ManagementObjectSearcher searcher = new ManagementObjectSearcher(new ObjectQuery("select * from Win32_QuickFixEngineering")); 
searcher.Options.UseAmendedQualifiers = true; 
searcher.Scope.Options.Locale = "MS_" + CultureInfo.CurrentCulture.LCID.ToString("X"); 
ManagementObjectCollection results = searcher.Get(); 

Console.WriteLine("\n==WMI==" + results.Count); 
foreach (ManagementObject item in results) 
{ 
    Console.WriteLine("\t--Properties--"); 
    foreach (var x in item.Properties) 
    { 
     Console.WriteLine(x.Name + ": " + item[x.Name]); 
    } 
    Console.WriteLine("\t--System Properties--"); 
    foreach (var x in item.SystemProperties) 
    { 
     Console.WriteLine(x.Name + ": " + x.Value); 
    } 
    Console.WriteLine("\t--Qualifiers--"); 
    foreach (var x in item.Qualifiers) 
    { 
     Console.WriteLine(x.Name + ": " + x.Value); 
    } 
} 

ответ

4

WUApi только регистрирует действия законченные через WUApi, так что если вы вручную установить или удалить обновление он либо останется в списке после деинсталляции или не отображаться в списке. В результате, на мой взгляд, WUApi нельзя рассчитывать на точный список.

WMI позволяет получить доступ к точному списку обновлений Windows, но список фильтруется только для категории «Microsoft Windows». Это было сложно, потому что мое требование состояло в том, чтобы получить список всех обновлений.

Внутренне диалоговое окно «Просмотр установленных обновлений» использует CBS (обслуживание на основе компонентов). К сожалению, CBS не является публичной. Некоторые подробности относительно API можно найти здесь: http://msdn.microsoft.com/en-us/library/Aa903048.aspx

+0

Мы сталкиваемся с теми же проблемами при попытке получить все обновления. Как вы решили эту проблему. Не могли бы вы поделиться, если это возможно, кодом? –

+2

Есть ли какая-либо документация по msdn о «Только WUApi регистрирует действия, выполненные через WUApi»? –

Смежные вопросы