如何在旧Windows设备检查KB4474419安装状态并后台静默安装该更新
实现方案(C/C++ 原生Windows API)
1. 系统SHA256签名支持状态检测(避免误判新系统)
核心逻辑
首先通过系统版本判断跳过新系统检测,Win8/Server 2012及以上版本原生支持SHA256代码签名,无需校验KB更新:
- 系统版本 >= 6.2(主版本6,次版本2):直接返回支持SHA256
- 系统版本 == 6.1(Win7/Server 2008 R2):检测是否已安装KB4474419更新
- 系统版本 <6.1(Vista及更早):直接返回不支持SHA256
检测代码示例
#include <Windows.h> #include <wuapi.h> #pragma comment(lib, "wuapi.lib") // 校验系统是否支持SHA256签名 BOOL IsSHA256SignSupported() { // 第一步:判断系统版本 OSVERSIONINFOEX osInfo = {0}; osInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); GetVersionEx((LPOSVERSIONINFO)&osInfo); if (osInfo.dwMajorVersion > 6 || (osInfo.dwMajorVersion ==6 && osInfo.dwMinorVersion >=2)) { // Win8及以上原生支持 return TRUE; } if (osInfo.dwMajorVersion <6 || (osInfo.dwMajorVersion ==6 && osInfo.dwMinorVersion <1)) { // Vista及更早不支持 return FALSE; } // 第二步:Win7系统检测KB4474419是否安装 HRESULT hr; IUpdateSession* pUpdateSession = NULL; IUpdateSearcher* pUpdateSearcher = NULL; ISearchResult* pSearchResult = NULL; IUpdateCollection* pUpdates = NULL; BSTR searchStr = SysAllocString(L"IsInstalled=1 AND UpdateID='7E872523-25FE-4C4F-AF8C-6D6A56F37D0B'"); // KB4474419对应的官方更新ID BOOL isInstalled = FALSE; hr = CoCreateInstance(CLSID_UpdateSession, NULL, CLSCTX_INPROC_SERVER, IID_IUpdateSession, (void**)&pUpdateSession); if (FAILED(hr)) goto cleanup; hr = pUpdateSession->CreateUpdateSearcher(&pUpdateSearcher); if (FAILED(hr)) goto cleanup; hr = pUpdateSearcher->Search(searchStr, &pSearchResult); if (SUCCEEDED(hr)) { LONG updateCount = 0; pSearchResult->get_Updates(&pUpdates); pUpdates->get_Count(&updateCount); if (updateCount > 0) isInstalled = TRUE; } cleanup: SysFreeString(searchStr); if (pUpdates) pUpdates->Release(); if (pSearchResult) pSearchResult->Release(); if (pUpdateSearcher) pUpdateSearcher->Release(); if (pUpdateSession) pUpdateSession->Release(); return isInstalled; }
2. 静默安装KB4474419及结果校验
核心逻辑
- 提前将对应系统架构的KB4474419离线安装包写入本地临时目录
- 调用
CreateProcess传入静默参数启动安装,后台无窗口运行 - 等待安装进程退出后,重新调用上述
IsSHA256SignSupported接口校验安装结果 - 检测系统重启标记判断是否需要重启生效
安装与校验代码示例
// 静默安装KB4474419,返回是否安装成功,pbNeedReboot输出是否需要重启 BOOL SilentInstallKB4474419(BOOL* pbNeedReboot) { if (!pbNeedReboot) return FALSE; *pbNeedReboot = FALSE; // 替换为实际的安装包路径,可根据系统架构选择x86/x64版本 WCHAR szInstallPath[] = L"C:\\temp\\windows6.1-kb4474419-x64.msu"; WCHAR szCmdLine[MAX_PATH * 2] = {0}; swprintf_s(szCmdLine, L"wusa.exe \"%s\" /quiet /norestart", szInstallPath); STARTUPINFO si = {0}; PROCESS_INFORMATION pi = {0}; si.cb = sizeof(si); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; // 启动静默安装 if (!CreateProcess(NULL, szCmdLine, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) { return FALSE; } // 等待安装完成 WaitForSingleObject(pi.hProcess, INFINITE); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); // 校验安装结果 if (!IsSHA256SignSupported()) { return FALSE; } // 检测是否需要重启 HKEY hKey = NULL; if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Component Based Servicing\\RebootPending", 0, KEY_READ, &hKey) == ERROR_SUCCESS) { *pbNeedReboot = TRUE; RegCloseKey(hKey); } return TRUE; }
注意事项
- 静默安装需要程序持有管理员权限,否则会被系统权限拦截导致安装失败
- 建议提前校验安装包的哈希值,避免安装损坏的更新包
内容的提问来源于stack exchange,提问作者OneAndOnly
相关产品推荐
相关产品推荐

