Во многих корпоративных сетях внедрена система установки обновлений через 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.
Filed under: Без рубрики | 5 комментариев »