Как получить список установленных обновлений и исправлений?
Список всех обновлений и исправлений, установленных на моем компьютере, поступающих из Центра обновления 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 предлагает в первую очередь)
- Под VS2008 CMD в%SystemRoot%\System32\ выполните команду для получения управляемого dll:
tlbimp.exe wuapi.dll /out=WUApiInterop.dll - Добавьте 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:
- Откройте PowerShell (желательно "запускать от имени администратора")
- Наберите "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);
}
это даст вам номер КБ, как вы ищете, я считаю,