Я, вероятно, просто слепой, но здесь я не вижу никаких ошибок (и я уже несколько дней ищу эту проблему …)
Я пытаюсь получить приоритет исправления (серьезность) из интерфейса Центра обновления Windows, используя следующий фрагмент кода в Visual Studio:
#include "stdafx.h"#include <wuapi.h>
#include <iostream>
#include <ATLComTime.h>
#include <wuerror.h>
using namespace std;int _tmain(int argc, _TCHAR* argv[])
{HRESULT hr;
hr = CoInitialize(NULL);
IUpdateSession* iUpdate;
IUpdateSearcher* searcher;
ISearchResult* results;
BSTR criteria = SysAllocString(L"IsInstalled=0");
hr = CoCreateInstance(CLSID_UpdateSession, NULL, CLSCTX_INPROC_SERVER, IID_IUpdateSession, (LPVOID*)&iUpdate);
hr = iUpdate->CreateUpdateSearcher(&searcher);
wcout << L"Searching for updates ..."<<endl;
hr = searcher->Search(criteria, &results);
SysFreeString(criteria);
switch(hr)
{
case S_OK:
wcout<<L"List of applicable items on the machine:"<<endl;
break;
case WU_E_LEGACYSERVER:
wcout<<L"No server selection enabled"<<endl;
return 0;
case WU_E_INVALID_CRITERIA:
wcout<<L"Invalid search criteria"<<endl;
return 0;
}
IUpdateCollection *updateList;
IUpdateCollection *bundledUpdates;
IUpdate *updateItem;
IUpdate *bundledUpdateItem;
LONG updateSize;
LONG bundledUpdateSize;
BSTR updateName;
BSTR severity;
results->get_Updates(&updateList);
updateList->get_Count(&updateSize);
if (updateSize == 0)
{
wcout << L"No updates found"<<endl;
}
for (LONG i = 0; i < updateSize; i++)
{
updateList->get_Item(i,&updateItem);
updateItem->get_Title(&updateName);
severity = NULL;
updateItem->get_MsrcSeverity(&severity);
if (severity != NULL)
{
wcout << L"update severity: " << severity << endl;
}
wcout<<i+1<<" - " << updateName << endl;
// bundled updates
updateItem->get_BundledUpdates(&bundledUpdates);
bundledUpdates->get_Count(&bundledUpdateSize);
if (bundledUpdateSize != 0)
{
// iterate through bundled updates
for (LONG ii = 0; ii < bundledUpdateSize; ii++)
{
bundledUpdates->get_Item(ii, &bundledUpdateItem);
severity = NULL;
bundledUpdateItem->get_MsrcSeverity(&severity);
if (severity != NULL)
{
wcout << L" bundled update severity: " << severity << endl;
}
}
}
}
::CoUninitialize();
wcin.get();return 0;
}
Итак, вот проблема: updateItem->get_MsrcSeverity(&severity);
ничего не возвращает. Если я поймаю код результата с HRESULT
это всегда возвращается S_OK
,
Ссылка на MSDN IUpdate MsrcSeverity: http://msdn.microsoft.com/en-us/library/windows/desktop/aa386906(v=vs.85).aspx
Можете ли вы увидеть, что я делаю, очевидно, неправильно или это get_MsrcSeverity
функция в настоящее время нарушена?
@EDIT: изменен код для перебора «BundledUpdates», как было предложено.
@ EDIT2: теперь код выводит значение серьезности updateItem
так же хорошо как bundledUpdatesItem
, но это всегда NULL
,
Я также знаю, что на моем компьютере есть одно важное обновление, касающееся Центра обновления Windows в панели управления. Это KB2858725.
@ EDIT3: Ладно, получается, что KB2858725 не является обновлением для системы безопасности и поэтому не имеет рейтинга серьезности со стороны Microsoft. Но как Microsoft Windows Update теперь классифицирует обновления как «важные» и «необязательные», как вы можете видеть это в обновлении панели управления?
Спасибо за любые подсказки!
// Маркус
Я часами боролся с точно такой же проблемой … Я наконец-то понял, что Microsoft, похоже, устанавливает значение MsrcSeverity только в некоторых обновлениях. Для общих обновлений Windows это обычно ноль. Для большинства обновлений безопасности установлено одно из:
Кажется, что значение «Unspecified» никогда не используется, хотя оно задокументировано в MSDN (http://msdn.microsoft.com/en-us/library/microsoft.updateservices.administration.msrcseverity(v=vs.85).aspx).
Я написал небольшую программу на C # для перечисления всех доступных обновлений и их серьезности. Требуется ссылка на WUApiLib:
using System;
using WUApiLib;
namespace EnumerateUpdates
{
class Program
{
static void Main(string[] args)
{
var session = new UpdateSession();
var searcher = session.CreateUpdateSearcher();
searcher.Online = false;
// Find all updates that have not yet been installed
var result = searcher.Search("IsInstalled=0 And IsHidden=0");
foreach (dynamic update in result.Updates)
{
Console.WriteLine(update.Title + ": " + update.Description);
Console.WriteLine("Severity is " + update.MsrcSeverity);
Console.WriteLine();
}
Console.ReadLine();
}
}
}
Надеюсь, это поможет кому-то!
Посмотрите на обновления в комплекте. Связанные обновления не имеют некоторых свойств или методов, как описано в этот стр.
замечания
Если свойство BundledUpdates содержит IUpdateCollection, некоторые
Свойства и методы обновления могут быть доступны только на
связанные обновления, например, DownloadContents или CopyFromCache.
Обновление, в котором вы обрабатываете, является пакетным обновлением. Извлеките отдельные обновления из этого пакета, он будет иметь свойство, которое вы ищете.
IUpdate
интерфейс имеет метод get_BundledUpdates
который дает вам IUpdateCollection
если размер этой коллекции больше 0, это связанное обновление.