2017-05-25 91 views
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; 

誰能請解釋我是如何可以得到所有的更新?

回答

4

WUA API僅列出通過Windows Updates Services安裝的更新。

要列出其他種類的更新,你可以使用Windows Installer API,具體如下:

+0

謝謝。所以我的代碼應該只返回控制面板 - 程序和功能 - 安裝更新的Microsoft Windows部分的更新,對吧? – rudolfninja

+0

@rudolfninja它不僅限於Windows。其他Microsoft產品和某些第三方組件(如驅動程序)的更新也可能通過Windows Update進行安裝。 – zett42

+0

謝謝。我接到你了。還有一個問題。爲什麼我的輸出不同於wmic qfe get hotfixid輸出? WMI輸出與控制面板 - 程序和功能 - 安裝的更新中的Microsoft Windows部分具有完全相同的列表。順便說一句,你提到的功能有助於從控制面板獲得其他更新,但不是在Microsoft Windows部分。現在,我發現從本節獲得所有更新的唯一方法是WMI查詢。我的代碼中有什麼不正確? – rudolfninja