Visual C++、Windows 更新接口 (IUpdate) <wuapi.h>、get_MsrcSeverity
Posted
技术标签:
【中文标题】Visual C++、Windows 更新接口 (IUpdate) <wuapi.h>、get_MsrcSeverity【英文标题】:Visual C++, Windows Update Interface (IUpdate) <wuapi.h>, get_MsrcSeverity 【发布时间】:2014-02-25 12:22:13 【问题描述】:我可能只是瞎了眼,但我在这里看不到任何错误(我已经研究这个问题好几天了......)
我正在尝试使用 Visual Studio 中的以下代码从 Windows 更新界面获取补丁优先级(严重性):
#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 现在如何将更新分类为“重要”和“可选”,就像您在控制面板的更新中看到的那样?
感谢您的任何提示! // 马库斯
【问题讨论】:
【参考方案1】:我已经为同样的问题苦苦挣扎了好几个小时……我终于发现微软似乎只在某些更新上设置了 MsrcSeverity 值。对于一般的 Windows 更新,它通常为空。对于大多数安全更新,它设置为以下之一:
“严重” “中等” “重要” “低”似乎从未使用过“未指定”值,尽管它记录在 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();
希望这对某人有所帮助!
【讨论】:
【参考方案2】:在列表中查找捆绑的更新。捆绑的更新没有this 页面上描述的某些属性或方法。
备注
如果 BundledUpdates 属性包含 IUpdateCollection,则某些 更新的属性和方法可能仅在 捆绑更新,例如 DownloadContents 或 CopyFromCache。
您正在处理的更新是捆绑更新。从此包中提取各个更新,它将具有您正在寻找的属性。
IUpdate
接口有一个 get_BundledUpdates
方法,如果此集合的大小大于 0,它会为您提供 IUpdateCollection
,这是一个捆绑更新。
【讨论】:
感谢您的提示!我将您的建议添加到我的代码中,它确实找到了捆绑更新,然后我遍历捆绑更新列表,但它仍然在“bundledUpdates”迭代中为get_MsrcSeverity()
返回“bad btr”...
我想我错过了再告诉你一点,严重性与安全更新相关联,而不是其他类型的更新。所以如果给定的更新是安全更新,你应该找到严重性..
好的,谢谢。但我知道我有一个重要更新(关于控制面板中的 Windows 更新) - 它是 KB2858725(.NET 框架更新)
大多数情况下,安全更新的标题会以“用于...的安全更新”行开头,但此更新的标题为 Microsoft .NET Framework 4.5.1 for Windows 7基于 x64 的系统 (KB2858725)
嗯,这也是我的想法——但为什么 Windows 会在控制面板中将此显示为“重要”更新——我该如何获取这些信息? get_DownloadPriority
返回不同的东西,我已经尝试过了 :) 感谢您迄今为止的所有努力和帮助!以上是关于Visual C++、Windows 更新接口 (IUpdate) <wuapi.h>、get_MsrcSeverity的主要内容,如果未能解决你的问题,请参考以下文章
我有两个用 Visual Studio 构建的 Windows C++ 应用程序。现在我想开发一个更新应用程序来更新这些应用程序
《Visual C++面向对象与可视化程序设计》期末复习资料