是否有任何 API 用于编写可以与 Windows 更新交互的 C# 程序,并使用它来选择性地安装某些更新?
我正在考虑将列表存储在已批准更新的中央存储库中。然后客户端应用程序(必须安装一次)将与 Windows Update 交互以确定哪些更新可用,然后安装批准列表中的更新。这样,更新仍然会从客户端的角度自动应用,但我可以选择正在应用哪些更新。
顺便说一句,这不是我在公司中的角色,我真的只是想知道是否有用于 Windows 更新的 API 以及如何使用它。
是否有任何 API 用于编写可以与 Windows 更新交互的 C# 程序,并使用它来选择性地安装某些更新?
我正在考虑将列表存储在已批准更新的中央存储库中。然后客户端应用程序(必须安装一次)将与 Windows Update 交互以确定哪些更新可用,然后安装批准列表中的更新。这样,更新仍然会从客户端的角度自动应用,但我可以选择正在应用哪些更新。
顺便说一句,这不是我在公司中的角色,我真的只是想知道是否有用于 Windows 更新的 API 以及如何使用它。
将 WUApiLib 的引用添加到您的 C# 项目中。
using WUApiLib;
protected override void OnLoad(EventArgs e){
base.OnLoad(e);
UpdateSession uSession = new UpdateSession();
IUpdateSearcher uSearcher = uSession.CreateUpdateSearcher();
uSearcher.Online = false;
try {
ISearchResult sResult = uSearcher.Search("IsInstalled=1 And IsHidden=0");
textBox1.Text = "Found " + sResult.Updates.Count + " updates" + Environment.NewLine;
foreach (IUpdate update in sResult.Updates) {
textBox1.AppendText(update.Title + Environment.NewLine);
}
}
catch (Exception ex) {
Console.WriteLine("Something went wrong: " + ex.Message);
}
}
假设您有一个带有 TextBox 的表单,这将为您提供当前安装的更新列表。有关更多文档,请参阅http://msdn.microsoft.com/en-us/library/aa387102(VS.85).aspx。
但是,这将不允许您找到不是通过 Windows 更新分发的 KB 修补程序。
做你想做的最简单的方法是使用WSUS。它是免费的,基本上可以让您设置自己的本地 Windows 更新服务器,您可以在其中决定哪些更新已为您的计算机“批准”。WSUS 服务器和客户端都不需要位于域中,但如果它们位于域中,则可以更轻松地配置客户端。如果您有不同的机器需要批准不同的更新集,那么这也是受支持的。
这不仅实现了您的既定目标,而且通过仅从 WSUS 服务器下载一次更新来节省您的整体网络带宽。
如果在您的上下文中您被允许使用 Windows Server Update Service ( WSUS ),它将允许您访问Microsoft.UpdateServices.Administration 命名空间。
从那里,你应该能够做一些好事:)
PL 对。我首先尝试了 Christoph Grimmer-Die 方法,但在某些情况下,它不起作用。我猜这是由于不同版本的 .net 或操作系统架构(32 位或 64 位)。然后,为了确保我的程序始终获得每个计算机域的 Windows 更新等待列表,我执行了以下操作:
将所有工作站和服务器添加到 WSUS 服务器
获取 SimpleImpersonation Lib 以使用不同的管理员权限运行此程序(可选)
仅在您的开发工作站上安装管理控制台组件并运行以下程序:
它将在控制台中使用 UpdateInstallationStates.Downloaded 打印所有 Windows 更新
using System;
using Microsoft.UpdateServices.Administration;
using SimpleImpersonation;
namespace MAJSRS_CalendarChecker
{
class WSUS
{
public WSUS()
{
// I use impersonation to use other logon than mine. Remove the following "using" if not needed
using (Impersonation.LogonUser("mydomain.local", "admin_account_wsus", "Password", LogonType.Batch))
{
ComputerTargetScope scope = new ComputerTargetScope();
IUpdateServer server = AdminProxy.GetUpdateServer("wsus_server.mydomain.local", false, 80);
ComputerTargetCollection targets = server.GetComputerTargets(scope);
// Search
targets = server.SearchComputerTargets("any_server_name_or_ip");
// To get only on server FindTarget method
IComputerTarget target = FindTarget(targets, "any_server_name_or_ip");
Console.WriteLine(target.FullDomainName);
IUpdateSummary summary = target.GetUpdateInstallationSummary();
UpdateScope _updateScope = new UpdateScope();
// See in UpdateInstallationStates all other properties criteria
_updateScope.IncludedInstallationStates = UpdateInstallationStates.Downloaded;
UpdateInstallationInfoCollection updatesInfo = target.GetUpdateInstallationInfoPerUpdate(_updateScope);
int updateCount = updatesInfo.Count;
foreach (IUpdateInstallationInfo updateInfo in updatesInfo)
{
Console.WriteLine(updateInfo.GetUpdate().Title);
}
}
}
public IComputerTarget FindTarget(ComputerTargetCollection coll, string computername)
{
foreach (IComputerTarget target in coll)
{
if (target.FullDomainName.Contains(computername.ToLower()))
return target;
}
return null;
}
}
}