首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查询安装的Windows更新的准确和本地化列表

查询安装的Windows更新的准确和本地化列表
EN

Stack Overflow用户
提问于 2010-08-19 18:37:08
回答 1查看 6.5K关注 0票数 8

如何查询使用C#安装在计算机上的精确的和本地化的列表?<代码>E29

我将精确定义为匹配在Windows 7中程序和功能下的Microsoft视图安装更新对话框的"Microsoft“类别中显示的内容。

如果使用WUApi.DLL,则返回本地化的信息,但无法获得准确的列表。对于WUApi.dll,缺少一些修补程序,如果已卸载更新,它仍然显示在由以下代码生成的列表中:

代码语言:javascript
复制
public static void GetWindowsUpdates() 
{ 
    var updateSession = new UpdateSession(); 
    var updateSearcher = updateSession.CreateUpdateSearcher(); 
    var count = updateSearcher.GetTotalHistoryCount(); 
    if (count == 0) 
        return; 

    var history = updateSearcher.QueryHistory(0, count); 
    for (int i = 0; i < count; i++) 
    { 
        if (history[i].ResultCode == OperationResultCode.orcSucceeded) 
        { 
            Console.WriteLine(history[i].Title); 

            if (history[i].Operation == UpdateOperation.uoUninstallation) 
            { 
                Console.WriteLine("!!! Operation == uninstall"); // This is never true 
            } 
        } 
    } 
} 

WUApi搜索方法也没有使用以下代码提供准确的列表:

代码语言:javascript
复制
        WUApiLib.UpdateSessionClass session = new WUApiLib.UpdateSessionClass(); 
        WUApiLib.IUpdateSearcher searcher = session.CreateUpdateSearcher(); 

        searcher.IncludePotentiallySupersededUpdates = true; 

        WUApiLib.ISearchResult result = searcher.Search("IsInstalled=1"); 
        Console.WriteLine("Updates found: " + result.Updates.Count); 
        foreach (IUpdate item in result.Updates) 
        { 
            Console.WriteLine(item.Title); 
        } 

如果我使用WMI读取更新列表,我可以得到一个准确的列表,但它不是本地化的。我使用以下代码:

代码语言:javascript
复制
ManagementObjectSearcher searcher = new ManagementObjectSearcher(new ObjectQuery("select * from Win32_QuickFixEngineering")); 
searcher.Options.UseAmendedQualifiers = true; 
searcher.Scope.Options.Locale = "MS_" + CultureInfo.CurrentCulture.LCID.ToString("X"); 
ManagementObjectCollection results = searcher.Get(); 

Console.WriteLine("\n==WMI==" + results.Count); 
foreach (ManagementObject item in results) 
{ 
    Console.WriteLine("\t--Properties--"); 
    foreach (var x in item.Properties) 
    { 
        Console.WriteLine(x.Name + ": " + item[x.Name]); 
    } 
    Console.WriteLine("\t--System Properties--"); 
    foreach (var x in item.SystemProperties) 
    { 
        Console.WriteLine(x.Name + ": " + x.Value); 
    } 
    Console.WriteLine("\t--Qualifiers--"); 
    foreach (var x in item.Qualifiers) 
    { 
        Console.WriteLine(x.Name + ": " + x.Value); 
    } 
} 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-11-15 18:39:44

WUApi只注册通过WUApi完成的操作,因此如果手动安装或删除更新,它将在卸载后保留在列表中,或者永远不会出现在列表中。因此,在我看来,WUApi并不是一个准确的列表。

WMI允许访问精确的Windows更新列表,但该列表仅筛选为"Microsoft“类别。这很困难,因为我的要求是获得所有更新的列表。

在内部,“查看安装更新”对话框使用CBS (基于组件的服务)。不幸的是,CBS并不是公开的。有关API的一些详细信息可以在这里找到:http://msdn.microsoft.com/en-us/library/Aa903048.aspx

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3525059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档