如何确定是否使用Inno安装程序安装了特定的Windows Update软件包(KB * .msu)?

我想知道如何确定是否在目标计算机上安装了特定的Windows Update软件包,例如可以说名称为KB2919355的Windows Update软件包。

存在一个内置的function来检查? 如果不是,那么确定它的代码是什么? 也许搞乱registry,或者可能是最干净和/或安全的方式?

伪代码:

[Setup] ... [Files] Source: {app}\*; DestDir: {app}; Check: IsPackageInstalled('KB2919355') [Code] function IsPackageInstalled(packageName): Boolean; begin ... Result := ...; end; 

Solutions Collecting From Web of "如何确定是否使用Inno安装程序安装了特定的Windows Update软件包(KB * .msu)?"

 function IsKBInstalled(KB: string): Boolean; var WbemLocator: Variant; WbemServices: Variant; WQLQuery: string; WbemObjectSet: Variant; begin WbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); WbemServices := WbemLocator.Connectserver('', 'root\CIMV2'); WQLQuery := 'select * from Win32_QuickFixEngineering where HotFixID = ''' + KB + ''''; WbemObjectSet := WbemServices.ExecQuery(WQLQuery); Result := (not VarIsNull(WbemObjectSet)) and (WbemObjectSet.Count > 0); end; 

使用像:

 if IsKBInstalled('KB2919355') then begin Log('KB2919355 is installed'); end else begin Log('KB2919355 is not installed'); end; 

积分:

  • WMI查询更新:
    如何通过命令行查询我的系统是否安装了KB修补程序?
  • 使用Inno Setup中的WMI:
    @ TLama回答 Inno Setup Pascal脚本来搜索正在运行的进程 。

当我在Windows 7上测试我的安装程序时, WbemScripting.SWbemLocator不能正常工作。于是我采取了不同的方法,并连接到了WUA(Windows更新代理):

 function IsUpdateInstalled(KB: String): Boolean; var UpdateSession: Variant; UpdateSearcher: Variant; SearchResult: Variant; I: Integer; begin UpdateSession := CreateOleObject('Microsoft.Update.Session'); UpdateSearcher := UpdateSession.CreateUpdateSearcher() SearchResult := UpdateSearcher.Search('IsInstalled=1') for I := 0 to SearchResult.Updates.Count - 1 do begin if SearchResult.Updates.Item(I).KBArticleIDs.Item(0) = KB then begin Result := true; Exit; end; end; Result := false; end; 

调用如下:

 if IsUpdateInstalled('3020369') then ...