2009-05-02 8 views
17

Un elenco di tutti gli aggiornamenti e gli aggiornamenti rapidi installati sul computer, provenienti da Microsoft Windows Update o dalla knowledge base. Ho bisogno l'ID di ogni sotto forma di KBxxxxxx o di una qualche rappresentazione simile ...Come posso ottenere un elenco di aggiornamenti e hotfix installati?

Attualmente ho:

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

Ma questo non sembra elencare tutto, elenca solo QFE di.

ho bisogno di lavorare su Windows XP, Vista e 7.

risposta

7

È possibile utilizzare IUpdateSession3::QueryHistory Method.
Le proprietà delle voci restituite sono descritti in 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: anche dare un'occhiata al http://msdn.microsoft.com/en-us/library/aa387287%28VS.85%29.aspx

+0

Purtroppo se uno di questi aggiornamenti è stato disinstallato, sarà ancora visualizzare in questa lista. –

+1

Dai un'occhiata alla proprietà Operation –

+0

L'elenco di tutte le proprietà in 'updateEntry' può essere trovato [qui] (http://msdn.microsoft.com/en-us/library/aa386400 (v = vs.85) aspx). – nateirvin

11

Dopo qualche ulteriore ricerca su quello che ho trovato in precedenza. (Sì, lo stesso che VolkerK suggerisce prima)

  1. Sotto VS2008 CMD in% SystemRoot% \ System32 \ eseguire un comando per ottenere una DLL gestita:
    tlbimp.exe wuapi.dll /out=WUApiInterop.dll
  2. Aggiungere WUApiInterop.dll come riferimento di progetto in modo da visualizzare le funzioni.

utilizzando il seguente codice posso ottenere un elenco dal quale posso estrarre i numeri 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

Funziona anche dopo la disinstallazione? – user1438082

+1

Nessuna idea, penso che rifletta la cronologia vista in Windows Update; ma potrebbe essere sbagliato, ti suggerisco di prototiparlo e vedere cosa fa. Al momento non ho a disposizione un computer Windows, dato che ora sto usando Gentoo Linux. –

+0

Come posso creare un'istanza di 'UpdateSession' su una macchina remota? –

0

Nel caso in cui si desidera solo l'elenco degli aggiornamenti e non mi importa se si ottiene tramite codice o una GUI, qui è come farlo in PowerShell:

  1. Aprire PowerShell (preferibilmente "Esegui come amministratore")
  2. Tipo "aggiornamento rapido get-" e premi invio. Questo è tutto.

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

sopra è un metodo semplice stringa di estratto che uso per scoprire che KB è nel pacchetto sicurezza come Tom Wijsman aveva accennato ed eseguire la sua.

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

questo sarebbe ottenere il numero di KB, come stai cercando credo