2009-05-28 3 views
14

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

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

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

+0

Вы наверняка ищете API агента обновления Windows: http://msdn.microsoft.com/en-us/library/aa387099.aspx –

+0

Это COM-интерфейс ориентирован на C и C++, так что если вы хотел дать мне учебник о том, как вызывать COM API с C#, это не помогает мне = (. Хотя, я буду первым, кто признает, что это недостаток моих знаний, а не ваш ответ. – DevinB

+0

Я не знаю ни одного C# API. Но считаете ли вы [Службу обновления Windows Server] (http://technet.microsoft.com/en-us/wsus/default.aspx) для управления Windows Update для корпоративного уровня? –

ответ

19

добавить ссылку на 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 для получения дополнительной документации.

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

4

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

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

3

Если в вашем контексте разрешено использовать службу обновления Windows Server (WSUS), он предоставит вам доступ к Microsoft.UpdateServices.Administration Namespace.

Оттуда, вы должны быть в состоянии сделать некоторые интересные вещи :)

1

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

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

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

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

Это будет печатать на консоли все обновления для Windows с UpdateInstallationStates.Скачано

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

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

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

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

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

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

UpdateSession 
UpdateCollection 
UpdateDownloader 
IUpdateInstaller 
IInstallationResult 
Смежные вопросы