Лучший способ определить, есть ли у Windows обновления Windows, готовые для загрузки / установки? - PullRequest
3 голосов
/ 23 сентября 2008

Меня особенно интересует Windows 2000 / XP, но Vista / 7 тоже будет интересна (если отличается).

Я думал о том, как планировать задачи для пакетного файла или его эквивалента на ежедневной основе.

РЕДАКТИРОВАТЬ: Извините, я должен был предоставить больше информации. Вопрос касается 10 машин, к которым я вручную применяю обновления. Я не хочу устанавливать обновления программно, но просто узнаю, есть ли обновления, готовые к загрузке / установке (т. Е. Значок щита обновлений в системном трее указывает на это), используя пакет или скрипт. Спасибо.

Ответы [ 6 ]

3 голосов
/ 13 мая 2009

Вы можете использовать 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 голос
/ 23 сентября 2008

Windows SUS отлично работает на нескольких машинах в сети.

0 голосов
/ 22 июля 2009

В конце концов, Windows SUS не было опцией, поэтому я использую следующее в пакетном файле вместе с ActiveState ActivePerl (рекомендуется):

perl -nle "печатать $ _, если обнаружены обновления m / i /"

Это может быть грубым или грязным и может сломаться в будущем, но в настоящее время он делает то, что мне нужно.

Спасибо за все идеи.

0 голосов
/ 13 мая 2009

Я считаю, что обновления Windows загружаются с помощью службы BITS. Вы можете использовать Bitsadmin.exe, найденный в средствах поддержки Windows. Из командной строки вы можете запустить bitsadmin.exe / list и увидеть состояние заданий BITS. (то есть прогресс загрузки, имя задания, статус задания)

0 голосов
/ 23 сентября 2008

Что касается того, что сказал mdsindzeleta, то, пожалуй, програматически, не лучшее решение. Я бы использовал функции, встроенные в Windows XP, для загрузки и установки обновлений. Я предполагаю, что Vista имеет аналогичные функции.

0 голосов
/ 23 сентября 2008

Самый простой способ определить это - настроить Обновления Windows на вечернее время и загрузить обновления, если они доступны, после чего поместить значок щита обновлений в системный трей. Просто взгляните на лоток, чтобы увидеть, присутствует ли значок.

Вы также можете настроить Windows для ночной проверки обновлений, а затем загрузить и установить их в указанное время.

...