gpt4 book ai didi

c# - 查询已安装 Windows 更新的准确和本地化列表

转载 作者:太空狗 更新时间:2023-10-29 20:32:15 24 4
gpt4 key购买 nike

如何使用 C# 查询安装在计算机上的 Windows 更新的准确本地化列表?

我将准确定义为与 Windows 7 中“程序和功能”下 Microsoft 的“查看已安装的更新”对话框的“Microsoft Windows”类别中显示的内容相匹配。

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

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 搜索方法也没有使用以下代码提供准确的列表:

        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 读取更新列表,我可以获得准确的列表,但它不是本地化的。我使用以下代码:

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);
}
}

最佳答案

WUApi 仅注册通过 WUApi 完成的操作,因此如果您手动安装或删除更新,它将在卸载后保留在列表中或永远不会出现在列表中。因此,在我看来,WUApi 不能指望获得准确的列表。

WMI 允许访问准确的 Windows 更新列表,但该列表仅过滤到“Microsoft Windows”类别。这很难,因为我的要求是获取所有更新的列表。

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

关于c# - 查询已安装 Windows 更新的准确和本地化列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3525059/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com