如何获得Windows安装的更新

时间:2017-05-25 15:01:19

标签: c++ windows winapi windows-update

我需要在Windows机器上获取所有已安装的更新。我尝试过WUA API,但结果与我在“控制面板 - 已安装的更新”中看到的结果不同。我的代码返回321更新,而在控制面板中我看到508.这是我的代码:

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;

任何人都可以解释我如何获得所有更新?

1 个答案:

答案 0 :(得分:4)

WUA API仅列出通过Windows更新服务安装的更新。

要列出其他类型的更新,您可以使用Windows Installer API,具体来说: