2009-05-02 75 views
17

我的計算機上安裝的每個更新和修補程序的列表,來自Microsoft Windows Update或來自知識庫。我需要每個KBxxxxxx或一些類似的表示形式的ID ...如何獲取已安裝更新和修補程序的列表?

目前我有:

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

但是,這似乎並沒有列出一切,它只列出QFE的。

我需要它在Windows XP,Vista的工作,7

回答

7

您可以使用IUpdateSession3::QueryHistory Method
返回條目的屬性在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

編輯描述:也看看http://msdn.microsoft.com/en-us/library/aa387287%28VS.85%29.aspx

+0

不幸的是,如果這些更新中的一個已被卸載,它仍然會在這個列表中顯示。 – 2010-07-21 22:43:01

+1

查看操作屬性 – 2013-11-02 21:24:23

+0

'updateEntry'中的所有屬性列表可以在這裏找到(http://msdn.microsoft.com/zh-cn/library/aa386400(v = vs.85)的.aspx)。 – nateirvin 2014-05-22 17:43:59

11

後上什麼,我早發現了一些進一步的搜索。 (是的,同爲VolkerK建議首先)

  1. 在VS2008 CMD位於%SystemRoot%\ SYSTEM32 \運行命令來獲得託管DLL:
    tlbimp.exe是WUAPI.DLL /out=WUApiInterop.dll
  2. 將WUApiInterop.dll添加爲項目引用,以便我們看到函數。

使用下面的代碼,我可以得到一個列表,從中我可以提取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

即使在卸載後,它是否也能正常工作? – user1438082 2014-03-22 10:53:29

+1

不知道,我認爲它會反映在Windows Update中看到的歷史;但可能是錯誤的,我建議你對它進行原型設計並看看它的功能。我目前沒有可用的Windows計算機,因爲我現在正在運行Gentoo Linux。 – 2014-03-22 14:24:53

+0

如何在遠程機器上創建'UpdateSession'實例? – 2016-05-02 17:57:55

0

萬一你只是想更新的列表,如果你得到它不在乎通過代碼或圖形用戶界面,在這裏是如何做到這一點在PowerShell中:

  1. 打開PowerShell中(最好是「作爲管理員身份運行」)
  2. 鍵入「Get-修補程序」,然後回車。而已。

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

上面是一個簡單的字符串,提取方法,我用它來發現,KB是在安全軟件包像湯姆Wijsman提到了和運行自己。

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

,這將讓你的KB編號就像你正在尋找我相信

相關問題