WSUS — сверка списка компьютеров с AD


 

   Во многих корпоративных сетях внедрена система установки обновлений через WSUS сервер. Как правило клиенты настраиваются через групповую политику GPO. Система простая и довольно надежная. Но все же требует некоторого контроля. Вы его делаете? :-) Сейчас я предлагаю вам проверить все ли компьютеры, зарегистрированные в Active Directory, зарегистрированы на WSUS сервере: а вдруг политика не применяется к какому-нибудь контейнеру с учетными записями компьютеров или политика применяется, но компьютер не может подключиться к WSUS серверу из-за внутренних проблем или проблем с сетью?

   Текущая версия WSUS имеет API, который позволяет удаленное управление сервером. Чтобы его задействовать, необходимо установить на компьютер клиентскую часть сервера. После чего запускаем оболочку Powershell 2.0 и загружаем WSUS API:

[reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration")

   Теперь надо подключаемся к удаленному серверу по имени «WSUS»:

$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer("WSUS", $false)

   Второй параметр $false говорит о том, что будет использоваться HTTP протокол, а не HTTPS, т.е. не будет шифрования.

   Теперь получаем список всех компьютеров зарегистрированных на WSUS-сервере:

$WSUScomps = $wsus.GetComputerTargets()

   Каждый элемент массива $WSUScomps это объект, а нам нужны только имена компьютеров. Получаем FQDN имена компьютеров:

$WSUSCompNames = $WSUScomps | ForEach { $_.FullDomainName.ToUpper() }

   Перевод имени в верхний регистр не критичен (по умолчанию Powershell выполняет сравнение строк без учета регистра), но формально все же это надо сделать.

   Следующий шаг – получение списка учетных записей компьютеров из Active Directory:

$ADcomps = (new-object System.DirectoryServices.DirectorySearcher([ADSI]"LDAP://ou=DEPS,dc=DOMAIN,dc=RU","(&(objectCategory=computer)(!userAccountControl:1.2.840.113556.1.4.803:=2))")).findAll()

   Тут конструкция !userAccountControl:1.2.840.113556.1.4.803:=2 исключает запрещенные (disabled) учетные записи компьютеров. LDAP://ou=DEPS,dc=DOMAIN,dc=RU задает корень поиска в дереве AD. objectCategory=computer – выбираем только учетные записи компьютеров.

   Из объектов учетных записей компьютеров извлекаем имена компьютеров (также формально переводим их в верхний регистр):

$ADCompNames = $ADcomps | ForEach {$_.GetDirectoryEntry().dNSHostName.ToString().ToUpper()}

   И последний шаг – получаем имена компьютеров, которые есть в Active Directory, но отсутствуют в WSUS:

$NoWSUSCompNames = $ADCompNames | Where { $WSUSCompNames -notcontains $_ }

   Теперь нам остается проанализировать полученный список и разобраться почему выявленные компьютеры не получают обновления с WSUS.

комментариев 5

  1. У меня WSUS висит на нестандартном порту 8530. Ввожу и как wsusserver:8530 и как wsusserver.domain:8530К сожалению, не получается к нему подключиться. Получаю ошибкуException calling "GetUpdateServer" with "2" argument(s): "Invalid URI: A port was expected because of there is a colon (\’:\’) present but the port could not be parsed."Подскажите, как это обойти?

  2. Разобрались, вместо:$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer("WSUS", $false) следует вводить$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer("WSUS", $false,port_number)и все получается.

  3. У меня список компьютеров не выдается, просто команда выполняется и все.

  4. […] причину. В интернете наткнулся на скрипт на PowerShell от Ильи Сазонова, который получает с помощью WSUS API список ПК WSUS и […]

  5. […] задачи была реализована в скрипте который нашелся в блоге Ильи Сазонова. Немного подправив его под свои задачи […]

Ответить на it-padla Отменить ответ