2
我需要在Windows计算机上获取所有安装的更新。我尝试使用WUA API,但结果与我在控制面板 - 安装的更新中看到的不同。我的代码返回321更新,而在控制面板中我看到508这里是我的代码:如何获取Windows安装更新
IUpdateSearcher* updateSearcher = NULL;
IUpdateSession* updateSession = NULL;
IUpdateCollection* updateList = NULL;
ISearchResult* results = NULL;
IUpdate* updateItem = NULL;
BSTR criteria = NULL;
LONG updateSize = 0;
HRESULT hr;
if ((hr = CoInitialize(NULL)) != S_OK)
{
return -1;
}
if ((hr = CoCreateInstance(CLSID_UpdateSession, NULL, CLSCTX_INPROC_SERVER, IID_IUpdateSession, (LPVOID*)&updateSession)) != S_OK)
{
return -1;
}
if ((hr = updateSession->CreateUpdateSearcher(&updateSearcher)) != S_OK)
{
return -1;
}
if ((hr = updateSearcher->put_ServerSelection(ssWindowsUpdate)) != S_OK)
{
return -1;
}
criteria = SysAllocString(L"IsInstalled=1 or IsInstalled=0 or IsHidden=1 or IsPresent=1");
if ((hr = updateSearcher->Search(criteria, &results)) == S_OK)
{
std::wcout << L"[*]Successfully completed search for updates on this host" << std::endl;
}
else
{
std::wcout << L"[-]Failed to search for updates" << std::endl;
return -1;
}
results->get_Updates(&updateList);
updateList->get_Count(&updateSize);
if (updateSize == 0)
{
std::wcout << L"[-]No updates available for this host" << std::endl;
CoUninitialize();
return 0;
}
std::set<std::wstring> KBs;
for (LONG i = 0; i < updateSize; i++)
{
IStringCollection *KBCollection;
LONG KBsSize = 0;
updateList->get_Item(i, &updateItem);
updateItem->get_KBArticleIDs(&KBCollection);
KBCollection->get_Count(&KBsSize);
for (LONG i = 0; i < KBsSize; i++)
{
BSTR KBValue;
KBCollection->get_Item(i, &KBValue);
std::wstring ws(KBValue, SysStringLen(KBValue));
KBs.insert(ws);
}
}
if ((hr = updateSearcher->put_ServerSelection(ssOthers)) != S_OK)
{
return -1;
}
BSTR serviceID = SysAllocString(L"7971f918-a847-4430-9279-4a52d1efe18d");
if ((hr = updateSearcher->put_ServiceID(serviceID)) != S_OK)
{
return -1;
}
hr = updateSearcher->Search(criteria, &results);
if ((hr = updateSearcher->Search(criteria, &results)) == S_OK)
{
std::wcout << L"[*]Successfully completed search for updates on this host" << std::endl;
}
else
{
std::wcout << L"[-]Failed to search for updates" << std::endl;
}
results->get_Updates(&updateList);
updateList->get_Count(&updateSize);
if (updateSize == 0)
{
std::wcout << L"[-]No updates available for this host" << std::endl;
CoUninitialize();
return 0;
}
for (LONG i = 0; i < updateSize; i++)
{
IStringCollection *KBCollection;
LONG KBsSize = 0;
updateList->get_Item(i, &updateItem);
updateItem->get_KBArticleIDs(&KBCollection);
KBCollection->get_Count(&KBsSize);
for (LONG i = 0; i < KBsSize; i++)
{
BSTR KBValue;
KBCollection->get_Item(i, &KBValue);
KBs.insert(KBValue);
}
}
SysFreeString(criteria);
SysFreeString(serviceID);
CoUninitialize();
std::wcout << KBs.size() << std::endl;
谁能请解释我是如何可以得到所有的更新?
谢谢。所以我的代码应该只返回控制面板 - 程序和功能 - 安装更新的Microsoft Windows部分的更新,对吧? – rudolfninja
@rudolfninja它不仅限于Windows。其他Microsoft产品和某些第三方组件(如驱动程序)的更新也可能通过Windows Update进行安装。 – zett42
谢谢。我接到你了。还有一个问题。为什么我的输出不同于wmic qfe get hotfixid输出? WMI输出与控制面板 - 程序和功能 - 安装的更新中的Microsoft Windows部分具有完全相同的列表。顺便说一句,你提到的功能有助于从控制面板获得其他更新,但不是在Microsoft Windows部分。现在,我发现从本节获得所有更新的唯一方法是WMI查询。我的代码中有什么不正确? – rudolfninja