我对 Windows 2000/XP 特别感兴趣,但 Vista/7 也会很有趣(如果不同的话)。
我正在考虑每天安排批处理文件或等效文件的任务。
编辑:对不起,我应该提供更多信息。这个问题与我手动应用更新的 10 台机器有关。我不想以编程方式安装更新,而只是使用批处理或脚本找出是否有准备好下载/安装的更新(即系统托盘中的更新盾牌图标表明这一点)。谢谢。
我对 Windows 2000/XP 特别感兴趣,但 Vista/7 也会很有趣(如果不同的话)。
我正在考虑每天安排批处理文件或等效文件的任务。
编辑:对不起,我应该提供更多信息。这个问题与我手动应用更新的 10 台机器有关。我不想以编程方式安装更新,而只是使用批处理或脚本找出是否有准备好下载/安装的更新(即系统托盘中的更新盾牌图标表明这一点)。谢谢。
你可以使用WUApiLib
:
UpdateSessionClass session = new UpdateSessionClass();
IUpdateSearcher search = session.CreateUpdateSearcher();
ISearchResult result = search.Search("IsInstalled=0 and IsPresent=0 and Type='Software'");
int numberOfUpdates = result.Updates.Count - 1;
Log.Debug("Found " + numberOfUpdates.ToString() + " updates");
UpdateCollection updateCollection = new UpdateCollection();
for (int i = 0; i < numberOfUpdates; i++)
{
IUpdate update = result.Updates[i];
if (update.EulaAccepted == false)
{
update.AcceptEula();
}
updateCollection.Add(update);
}
if (numberOfUpdates > 0)
{
UpdateCollection downloadCollection = new UpdateCollection();
for (int i = 0; i < updateCollection.Count; i++)
{
downloadCollection.Add(updateCollection[i]);
}
UpdateDownloader downloader = session.CreateUpdateDownloader();
downloader.Updates = downloadCollection;
IDownloadResult dlResult = downloader.Download();
if (dlResult.ResultCode == OperationResultCode.orcSucceeded)
{
for (int i = 0; i < downloadCollection.Count; i++)
{
Log.Debug(string.Format("Downloaded {0} with a result of {1}", downloadCollection[i].Title, dlResult.GetUpdateResult(i).ResultCode));
}
UpdateCollection installCollection = new UpdateCollection();
for (int i = 0; i < updateCollection.Count; i++)
{
if (downloadCollection[i].IsDownloaded)
{
installCollection.Add(downloadCollection[i]);
}
}
UpdateInstaller installer = session.CreateUpdateInstaller() as UpdateInstaller;
installer.Updates = installCollection;
IInstallationResult iresult = installer.Install();
if (iresult.ResultCode == OperationResultCode.orcSucceeded)
{
updated = installCollection.Count.ToString() + " updates installed";
for (int i = 0; i < installCollection.Count; i++)
{
Log.Debug(string.Format("Installed {0} with a result of {1}", installCollection[i].Title, iresult.GetUpdateResult(i).ResultCode));
}
if (iresult.RebootRequired == true)
{
ManagementClass mcWin32 = new ManagementClass("Win32_OperatingSystem");
foreach (ManagementObject shutdown in mcWin32.GetInstances())
{
shutdown.Scope.Options.EnablePrivileges = true;
shutdown.InvokeMethod("Reboot", null);
}
}
}
Windows SUS适用于网络上的多台机器。
“最简单”的判断方法是将 Windows 更新设置为每晚发生并下载更新(如果有),然后将更新盾牌图标放在系统托盘中。只需看一眼托盘即可查看图标是否存在。
您还可以将 Windows 设置为每晚检查更新,然后在指定时间下载并安装它们。
关于 mdsindzeleta 所说的 - 以编程方式进行此操作可能不是最佳解决方案。我会使用 Windows XP 内置的功能来下载和安装更新。我假设 Vista 具有类似的功能。
我相信 Windows 更新是使用 BITS 服务下载的。您可以使用 Windows 支持工具中的 Bitsadmin.exe。您可以从命令行运行 bitsadmin.exe /list 并查看 BITS 作业的状态。(即下载进度、作业名称、作业状态)
最后,Windows SUS不是一个选项,所以我在批处理文件中使用以下内容以及ActiveState ActivePerl(推荐):
perl -nle "打印 $_ 如果检测到 m/更新/i" < c:\Windows\WindowsUpdate.log
这可能是粗糙或肮脏的,并且将来可能会损坏,但它目前可以满足我的需求。
感谢所有的想法。