2009-05-02 26 views
17

Una lista de todas las actualizaciones y revisiones que se han instalado en mi computadora, procedentes de Microsoft Windows Update o de la base de conocimiento. Necesito la identificación de cada uno en la forma de KBxxxxxx o alguna representación similar ...¿Cómo obtengo una lista de las actualizaciones y revisiones instaladas?

Actualmente tengo:

const string query = "SELECT HotFixID FROM Win32_QuickFixEngineering"; 
var search = new ManagementObjectSearcher(query); 
var collection = search.Get(); 

foreach (ManagementObject quickFix in collection) 
    Console.WriteLine(quickFix["HotFixID"].ToString()); 

Pero esto no parece una lista de todo, es sólo muestra de QFE.

necesito que funcione en Windows XP, Vista y 7.

Respuesta

7

Usted puede utilizar IUpdateSession3::QueryHistory Method.
Las propiedades de las entradas devueltas se describen en http://msdn.microsoft.com/en-us/library/aa386400(VS.85).aspx

Set updateSearch = CreateObject("Microsoft.Update.Session").CreateUpdateSearcher 
Set updateHistory = updateSearch.QueryHistory(1, updateSearch.GetTotalHistoryCount) 

For Each updateEntry in updateHistory 
    Wscript.Echo "Title: " & updateEntry.Title 
    Wscript.Echo "application ID: " & updateEntry.ClientApplicationID 
    Wscript.Echo " --" 
Next

edit: también echar un vistazo a http://msdn.microsoft.com/en-us/library/aa387287%28VS.85%29.aspx

+0

Desafortunadamente, si una de estas actualizaciones se ha desinstalado, todavía mostrar en esta lista. –

+1

Eche un vistazo a la propiedad Operación –

+0

La lista de todas las propiedades en 'updateEntry' se puede encontrar [aquí] (http://msdn.microsoft.com/en-us/library/aa386400 (v = vs.85) .aspx). – nateirvin

11

Después de algún búsqueda adicional en lo que he encontrado antes. (Sí, lo mismo que VolkerK sugiere primero)

  1. Bajo VS2008 CMD en% SystemRoot% \ System32 \ ejecutar un comando para obtener una DLL administrada:
    tlbimp.exe wuapi.dll /out=WUApiInterop.dll
  2. Agregue WUApiInterop.dll como referencia de proyecto para que podamos ver las funciones.

Usando el siguiente código que puedo conseguir una lista de la que puede extraer los números de KB:

var updateSession = new UpdateSession(); 
var updateSearcher = updateSession.CreateUpdateSearcher(); 
var count = updateSearcher.GetTotalHistoryCount(); 
var history = updateSearcher.QueryHistory(0, count); 

for (int i = 0; i < count; ++i) 
    Console.WriteLine(history[i].Title); 
+0

¿Funciona esto incluso después de la desinstalación? – user1438082

+1

No tengo idea, creo que reflejaría la historia como se ve en Windows Update; pero podría estar equivocado, te sugiero que prototipos y veas qué hace. Actualmente no tengo una computadora con Windows disponible, dado que ahora estoy ejecutando Gentoo Linux. –

+0

¿Cómo puedo crear una instancia de 'UpdateSession' en una máquina remota? –

0

Sólo en caso de lo que desea es la lista de cambios y no me importa si usted lo consigue a través de código o una interfaz gráfica de usuario, aquí es cómo hacerlo en Powershell:

  1. abierto PowerShell (preferiblemente "ejecutar como administrador")
  2. Tipo "revisión conseguir-" y pulsa enter. Eso es.

Get hotfixes

0
 string ExtractString(string s) 
    { 
     // You should check for errors in real-world code, omitted for brevity 
     try 
     { 
      var startTag = "("; 
      int startIndex = s.IndexOf(startTag) + startTag.Length; 
      int endIndex = s.IndexOf(")", startIndex); 
      return s.Substring(startIndex, endIndex - startIndex); 
     } 
     catch 
     { 
      return ("CNVFL"); 
     } 
    } 

arriba es un simple método de cadena extracto que utilizo para encontrar que KB es en el paquete de seguridad como Tom Wijsman había mencionado y ejecutar su.

var updateSession = new UpdateSession(); 
var updateSearcher = updateSession.CreateUpdateSearcher(); 
var count = updateSearcher.GetTotalHistoryCount(); 
var history = updateSearcher.QueryHistory(0, count); 

for (int i = 0; i < count; ++i){ 
    //sets KB here!! 
    string _splitstring = ExtractString(history[i].Title); 
    Console.WriteLine(_splitstring); 
} 

esto sería conseguir que el número de KB que estás buscando Creo

Cuestiones relacionadas