Используйте С# для взаимодействия с Центром обновления Windows

Есть ли какой-либо API для написания программы на С#, которая может взаимодействовать с обновлением Windows и использовать ее для выборочной установки определенных обновлений?

Я думаю где-то рядом с тем, как хранить список в центральном репозитории одобренных обновлений. Затем клиентские приложения (которые должны быть установлены один раз) будут взаимодействовать с Центром обновления Windows, чтобы определить, какие обновления доступны, затем установите те, которые указаны в утвержденном списке. Таким образом, обновления по-прежнему применяются автоматически с клиентской точки зрения, но я могу выбрать, какие обновления применяются.

Это не моя роль в компании, кстати, мне было просто интересно, есть ли API для обновления Windows и как его использовать.

Ответы

Ответ 1

Добавьте ссылку на WUApiLib в проект С#.

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.

Это, однако, не позволит вам найти исправления KB, которые не распространяются через Центр обновления Windows.

Ответ 2

Самый простой способ сделать то, что вы хотите, - это WSUS. Он бесплатный и в основном позволяет настроить собственный локальный сервер обновлений Windows, где вы решите, какие обновления "одобрены" для ваших компьютеров. Ни сервер WSUS, ни клиенты не должны находиться в домене, хотя это упрощает настройку клиентов, если они есть. Если у вас есть разные наборы машин, которым требуется одобрение разных наборов обновлений, которые также поддерживаются.

Это не только позволяет достичь поставленной цели, но и сохраняет общую пропускную способность сети, только загружая обновления один раз с сервера WSUS.

Ответ 4

P-L справа. Сначала я попробовал метод Christoph Grimmer-Die, и в некоторых случаях он не работал. Я предполагаю, что это связано с другой версией архитектуры .net или OS (32 или 64 бита). Затем, чтобы моя программа всегда была в списке ожиданий Windows Update для каждого моего домена, я сделал следующее:

  • Установите службу с WSUS (может сохранить некоторые интернет-полосы): http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=5216
  • Добавьте все свои рабочие станции и серверы на сервер WSUS.

  • Получить SimpleImpersonation Lib для запуска этой программы с помощью другого права администратора (необязательно)

  • Установите только компонент консоли администрирования на рабочую станцию ​​dev и запустите следующую программу:

Он будет печатать на консоли все обновления Windows с помощью UpdateInstallationStates.Downloaded

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

Ответ 5

Я написал для этого несколько dummycode (простое консольное приложение, которое установит все необходимые нам обновления на основе параметров командной строки, его можно найти здесь и содержит все необходимое для выполнения обновлений)

https://bitbucket.org/LilleCarl/c-windowsupdate

Что вам нужно, если вы хотите сделать это сами:

Add reference to C:\Windows\System32\wuapi.dll
using WUApiLib;

Полезные интерфейсы:

UpdateSession
UpdateCollection
UpdateDownloader
IUpdateInstaller
IInstallationResult