2010-08-19 12 views
7

¿Cómo puedo consultar I por un precisa y localizada lista de actualizaciones de Windows instalado en una máquina con C#?de consulta para la lista precisa y localizada de las actualizaciones de Windows instalados

defino precisa como emparejar lo que se muestra en la categoría de "Microsoft Windows" de Vista instalada de diálogo Actualizaciones de Microsoft en Programas y características en Windows 7.

Si uso WUAPI.DLL, la información es devuelto localizado pero no puedo obtener una lista precisa. En el caso de WUAPI.DLL, algunas revisiones faltan y si una actualización se ha desinstalado, todavía aparece en la lista generada por el siguiente código:

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

El método de búsqueda Wuapi también no proporcionó una lista exacta usando el siguiente código:

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

Si uso de WMI para leer la lista de cambios, que puedo conseguir una lista exacta, pero no está localizada. Yo uso el siguiente código:

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

Respuesta

4

El Wuapi sólo registra las acciones realizadas a través de la Wuapi, por lo que si se instala o quita una actualización de forma manual, o bien se mantendrá en la lista después de ser desinstalado o no aparecer en la lista. Como resultado, en mi opinión, no se puede contar con WUApi para obtener una lista precisa.

WMI permite el acceso a una lista precisa de las Actualizaciones de Windows, pero la lista se filtra solo a la categoría "Microsoft Windows". Esto fue difícil, porque mi requisito era obtener una lista de todas las actualizaciones.

Internamente, el cuadro de diálogo "Ver actualizaciones instaladas" utiliza CBS (servicio basado en componentes). Desafortunadamente, CBS no es público. Algunos detalles sobre la API se pueden encontrar aquí: http://msdn.microsoft.com/en-us/library/Aa903048.aspx

+0

Nos enfrentamos a los mismos problemas al tratar de obtener todas las actualizaciones. ¿Cómo resolviste este problema? ¿Puedes compartir el código si es posible? –

+2

¿Hay alguna documentación en msdn sobre "El WUApi solo registra acciones completadas a través de WUApi"? –

Cuestiones relacionadas