Используйте С# для взаимодействия с Центром обновления 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.
Ответ 3
Если в вашем контексте разрешено использовать службу обновления Windows Server (WSUS), он предоставит вам доступ к Пространство имен Microsoft.UpdateServices.Administration.
Оттуда вы сможете сделать несколько приятных вещей:)
Ответ 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