主要通过WUA API实现,源代码如下:
#include <wuapi.h>
#pragma comment(lib, "comsupp.lib")
//检测操作系统安全补丁是否最新
BOOL DetectSecPatch()
{
HRESULT ret ;
IUpdateSession *Session = NULL;//定义更新域
ret = CoInitialize(NULL);//初始化COM接口
if (FAILED(ret))
return ERROR;
ret = CoCreateInstance(CLSID_UpdateSession,
NULL,
CLSCTX_INPROC_SERVER,
IID_IUpdateSession ,
(LPVOID*)&Session);//实例化COM接口
if (FAILED(ret))
return ERROR;
IUpdateSearcher *Searcher = NULL;
ret = Session->CreateUpdateSearcher(&Searcher);//创建搜索对象
if(FAILED(ret))
return ERROR;
ret = Searcher->put_Online(VARIANT_FALSE);//查询模式
if(FAILED(ret))
return ERROR;
ISearchResult *SearchResult = NULL;
BSTR barBstr = ::SysAllocString(L"IsInstalled = 0 and Type = 'Software'");//IsInstalled = 0表示未安装,1表示安装。
ret = Searcher->Search(barBstr, &SearchResult); //执行搜索,结果集放在SearchResult中
::SysFreeString(barBstr);
if(SearchResult == NULL)//获取补丁信息失败
return ERROR;
if(FAILED(ret))
return ERROR;
IUpdateCollection *Collection;
ret = SearchResult->get_Updates(&Collection);
if(FAILED(ret))
return ERROR;
long Colnum;
ret = Collection->get_Count(&Colnum);//安全补丁个数
if(FAILED(ret))
return ERROR;
for (int i = 0;i < Colnum;i++)
{
IUpdate *Update;
ret = Collection->get_Item(i,&Update);
BSTR SecLevel = NULL;
ret = Update->get_MsrcSeverity(&SecLevel);//Critical Important Moderate Low
if(SecLevel != NULL)//补丁不是最新.(有些补丁没有安全等级,无需安装的。只要安装了有安全等级的补丁,认为最新)
//个人认为
{
::SysFreeString(SecLevel);
return FALSE;
}
::SysFreeString(SecLevel);
}
return TRUE;//补丁为最新
}