检测Windows是否已准备好下载/安装Windows更新的最佳方法?

时间:2008-09-23 15:04:25

标签: windows-xp windows-update

我对Windows 2000 / XP特别感兴趣,但Vista / 7也很有趣(如果不同的话)。

我正在考虑每天安排批处理文件或同等文件的任务。

编辑:对不起,我应该提供更多信息。问题涉及我手动应用更新的10台机器。我不想以编程方式安装更新,而只是使用批处理或脚本找出是否有准备下载/安装的更新(即系统托盘中的更新屏蔽图标表明这一点)。感谢。

6 个答案:

答案 0 :(得分:3)

您可以使用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);
                }
            }
        }

答案 1 :(得分:1)

Windows SUS适用于网络上的多台计算机。

答案 2 :(得分:0)

“最简单”的方法是将Windows更新设置为每晚进行并下载更新(如果有),然后将更新屏蔽图标放入系统托盘中。只需看一下托盘,看看图标是否存在。

您还可以设置Windows以每晚检查更新,然后在指定时间下载并安装它们。

答案 3 :(得分:0)

关于mdsindzeleta所说的内容 - 以编程方式进行此操作可能不是最佳解决方案。我会使用Windows XP中内置的功能来下载和安装更新。我假设Vista有类似的功能。

答案 4 :(得分:0)

我相信使用BITS服务下载Windows更新。您可以使用Windows支持工具中的Bitsadmin.exe。从命令行,您可以运行bitsadmin.exe / list,您可以看到BITS作业的状态。 (即下载进度,工作名称,工作状态)

答案 5 :(得分:0)

最后,Windows SUS不是一个选项,所以我在与ActiveState ActivePerl(推荐)的批处理文件中使用以下内容:

perl -nle“print $ _ if m m / updates detected / i”&lt; C:\ WINDOWS \ windowsupdate.log处

这可能是粗糙的或肮脏的,将来可能会破裂,但它目前正在做我需要的。

感谢所有想法。