2009-05-02 34 views
17

Danh sách mọi cập nhật và hotfix đã được cài đặt trên máy tính của tôi, đến từ Microsoft Windows Update hoặc từ cơ sở kiến ​​thức. Tôi cần ID của mỗi theo hình thức KBxxxxxx hoặc một số đại diện tương tự ...Làm cách nào để nhận danh sách các bản cập nhật và hotfix được cài đặt?

Hiện nay tôi có:

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

Nhưng điều này dường như không liệt kê tất cả mọi thứ, nó chỉ liệt kê QFE của.

tôi cần nó để làm việc trên Windows XP, Vista và 7.

Trả lời

7

Bạn có thể sử dụng IUpdateSession3::QueryHistory Method.
Các tính chất của các mục trở lại được mô tả tại 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

chỉnh sửa: cũng hãy nhìn vào http://msdn.microsoft.com/en-us/library/aa387287%28VS.85%29.aspx

+0

Thật không may nếu một trong các bản cập nhật đã được gỡ bỏ cài đặt, nó sẽ vẫn hiển thị trong danh sách này. –

+1

Hãy xem thuộc tính Hoạt động –

+0

Danh sách tất cả các thuộc tính trong 'updateEntry' có thể tìm thấy tại đây (http://msdn.microsoft.com/en-us/library/aa386400 (v = vs.85) .aspx). – nateirvin

11

Sau khi một số tìm kiếm sâu hơn về những gì tôi đã tìm thấy trước đó. (Vâng, giống như VolkerK gợi ý đầu tiên)

  1. Dưới VS2008 CMD trong% SystemRoot% \ System32 \ chạy một lệnh để có được một dll quản lý:
    Tlbimp.exe wuapi.dll /out=WUApiInterop.dll
  2. Thêm WUApiInterop.dll làm tham chiếu dự án để chúng tôi thấy các chức năng.

Sử dụng đoạn mã sau tôi có thể có được một danh sách mà từ đó tôi có thể trích xuất các số 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

Tính năng này có hoạt động ngay cả sau khi gỡ cài đặt không? – user1438082

+1

Không có ý tưởng, tôi nghĩ rằng nó sẽ phản ánh lịch sử như đã thấy trong Windows Update; nhưng có thể sai, tôi đề nghị bạn thử nghiệm nó và xem nó làm gì. Hiện tại tôi không có máy tính Windows, vì hiện tại tôi đang chạy Gentoo Linux. –

+0

Làm thế nào tôi có thể tạo một thể hiện của 'UpdateSession' trên một máy từ xa? –

0

Chỉ trong trường hợp bạn chỉ muốn danh sách các bản cập nhật và không quan tâm nếu bạn nhận được nó thông qua mã hoặc một giao diện, đây là cách để làm điều đó trong Powershell:

  1. mở PowerShell (tốt nhất là "chạy như admin")
  2. Loại "get-hotfix" và nhấn enter. Đó là nó.

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

Trên đây là một phương pháp chiết xuất chuỗi đơn giản tôi sử dụng để tìm KB đó là trong gói bảo mật như Tom Wijsman đã đề cập và chạy của mình.

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

điều này sẽ giúp bạn có được số KB như bạn đang tìm kiếm tôi tin

Các vấn đề liên quan