2010-08-19 11 views
7

Come posso interrogare per un accurata e localizzato elenco degli aggiornamenti di Windows installato su una macchina utilizzando C#?query per la lista precisa e localizzata degli aggiornamenti di Windows installati

definisco accurata come corrispondente a ciò che viene visualizzato nella categoria "Microsoft Windows" di Vista installata dialogo Aggiornamenti di Microsoft in Programmi e funzionalità in Windows 7.

Se uso wuapi.dll, le informazioni vengono restituito localizzato ma non riesco a ottenere un elenco accurato. Nel caso di wuapi.dll, alcuni aggiornamenti rapidi mancano e se un aggiornamento è stato disinstallato, si vede ancora nella lista generata dal codice seguente:

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 
      } 
     } 
    } 
} 

Il metodo di ricerca Wuapi, inoltre, non ha fornito un elenco accurato utilizzando il seguente codice:

 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); 
     } 

Se uso WMI per leggere l'elenco degli aggiornamenti, posso ottenere un elenco accurato, ma non è localizzato. Io uso il seguente codice:

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); 
    } 
} 

risposta

4

L'Wuapi registra solo le azioni completate attraverso il Wuapi, quindi se installare o rimuovere manualmente un aggiornamento sarà o rimanere nella lista dopo essere disinstallato o non presentarsi nella lista. Di conseguenza, secondo me, non è possibile contare su WUApi per un elenco accurato.

WMI consente di accedere a un elenco accurato di aggiornamenti di Windows, ma l'elenco viene filtrato solo alla categoria "Microsoft Windows". Questo è stato difficile, perché il mio requisito era quello di ottenere un elenco di tutti gli aggiornamenti.

Internamente la finestra di dialogo "Visualizza aggiornamenti installati" utilizza CBS (Component Based Servicing). Sfortunatamente, la CBS non è pubblica. Alcuni dettagli relativi all'API possono essere trovati qui: http://msdn.microsoft.com/en-us/library/Aa903048.aspx

+0

Siamo di fronte agli stessi problemi durante il tentativo di ottenere tutti gli aggiornamenti. Come hai risolto questo problema. Puoi per favore condividere il codice se possibile? –

+2

C'è qualche documentazione su msdn su "Il WUApi registra solo le azioni completate tramite WUApi"? –

Problemi correlati