Как получить список установленных обновлений и исправлений?

Список всех обновлений и исправлений, установленных на моем компьютере, поступающих из Центра обновления Windows или из базы знаний. Мне нужен идентификатор каждого в форме KBxxxxxx или похожее представление...

В настоящее время у меня есть:

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.

5 ответов

Решение

Вы можете использовать метод IUpdateSession3::QueryHistory.
Свойства возвращаемых записей описаны по http://msdn.microsoft.com/en-us/library/aa386400(VS.85).aspx

 Установите updateSearch = CreateObject("Microsoft.Update.Session").CreateUpdateSearcher
Установите updateHistory = updateSearch.QueryHistory(1, updateSearch.GetTotalHistoryCount)

Для каждого updateEntry в updateHistory
  Wscript.Echo "Title: " & updateEntry.Title
  Wscript.Echo "идентификатор приложения: " & updateEntry.ClientApplicationID
  Wscript.Echo " -"
следующий 

редактировать: также посмотрите на http://msdn.microsoft.com/en-us/library/aa387287%28VS.85%29.aspx

После некоторых дальнейших поисков того, что я нашел ранее. (Да, так же, как VolkerK предлагает в первую очередь)

  1. Под VS2008 CMD в%SystemRoot%\System32\ выполните команду для получения управляемого dll:
    tlbimp.exe wuapi.dll /out=WUApiInterop.dll
  2. Добавьте WUApiInterop.dll в качестве ссылки на проект, чтобы мы увидели функции.

Используя следующий код, я могу получить список, из которого я могу извлечь номера КБ:

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);
const string querys = "SELECT HotFixID FROM Win32_QuickFixEngineering";
var search = new ManagementObjectSearcher(querys);
var collection = search.Get();

foreach (ManagementObject quickfix in collection)
{
    hotfix = quickfix["HotFixID"].ToString();
}

listBox1.Items.Add(hotfix);

Это заполнит список с установленными в данный момент исправлениями или обновлениями.

Если вы хотите отобразить всю историю обновлений и исправлений для отображения, приведенный выше пример Tom Wijsman будет работать.

На тот случай, если вам нужен только список обновлений, и вам все равно, получите ли вы его с помощью кода или графического интерфейса, вот как это сделать в Powershell:

  1. Откройте PowerShell (желательно "запускать от имени администратора")
  2. Наберите "get-hotfix" и нажмите ввод. Вот и все.

Получить исправления

        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 находится в пакете безопасности, как упомянул Том Вийсман, и запустить его.

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

это даст вам номер КБ, как вы ищете, я считаю,

Другие вопросы по тегам