Сравнение списка ПК во WSUS и в AD
Однажды заметил, что не все компьютеры домена есть в списке WSUS. Стал разбирать и оказалось, что в списке AD около 1070 рабочих станций, а в списке WSUS всего 980. Следовательно не обновляется почти десятая часть ПК. Встал вопрос, а как же выяснить каких ПК не в списке, чтобы провести аудит и узнать причину. В интернете наткнулся на скрипт на PowerShell от Ильи Сазонова, который получает с помощью WSUS API список ПК WSUS и сравнивает его со списком ПК из Active Directory. На выходе получаем текстовый файл со списком компьютеров, которые по каким-то причинам на обновляются.
Далее привожу листинг скрипта. Копируем текст и сохраняем в текстовом файле с расширением ps1
####################################################################################### # # WSUSAD-Compare.ps1 PowerShell (c) sie # WSUS - сверка списка компьютеров с AD # http://sazonov.spaces.live.com/blog/cns!C80884C5BEC6A15D!170.entry ####################################################################################### # Текущая версия WSUS имеет API, который позволяет удаленное управление сервером. # Чтобы его задействовать, необходимо установить на компьютер клиентскую часть сервера. # После чего запускаем оболочку Powershell 2.0 и загружаем WSUS API: [reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration") # Теперь надо подключаемся к удаленному серверу по имени «WSUS»: # 8530 - порт $wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer("WSUS", $false, 8530) # Второй параметр $false говорит о том, что будет использоваться HTTP протокол, а не HTTPS, т.е. не будет шифрования. # Теперь получаем список всех компьютеров зарегистрированных на WSUS-сервере: $WSUScomps = $wsus.GetComputerTargets() # Каждый элемент массива $WSUScomps это объект, а нам нужны только имена компьютеров. Получаем FQDN имена компьютеров: $WSUSCompNames = $WSUScomps | ForEach { $_.FullDomainName.ToUpper() } #$WSUSCompNames | Out-File .\WSUScomps.txt -Encoding default # Перевод имени в верхний регистр не критичен (по умолчанию Powershell выполняет сравнение строк без учета регистра), но формально все же это надо сделать. # Следующий шаг – получение списка учетных записей компьютеров из Active Directory: $ADcomps = (new-object System.DirectoryServices.DirectorySearcher([ADSI]"LDAP://OU=Рабочие станции,OU=Оборудование,DC=domen,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: "`n`nИмена компьютеров, которые есть в Active Directory, но отсутствуют в WSUS:`n" $NoWSUSCompNames = $ADCompNames | Where { $WSUSCompNames -notcontains $_ } | Sort-Object $NoWSUSCompNames | Out-File .\NoWSUS.txt -Encoding default #$NoWSUSCompNames # И последний шаг – получаем имена компьютеров, которые есть в WSUS, но отсутствуют в AD: "`n`nИмена компьютеров, которые есть в WSUS, но отсутствуют в Active Directory:`n" $NoADCompNames = $WSUSCompNames | Where { $ADCompNames -notcontains $_ } | Where {$_ -like "*.vnipiet.ru"} |Sort-Object #$NoADCompNames | Out-File .\NoADComp.txt -Encoding default #$NoADCompNames
В результате я получил файл NoWSUS.txt со списком компьютеров, которых нет в AD. Но в нем оказалось много мусора, т.е. компьютеры, которые давно не включаются (пользователь в отпуске/в декрете/на больничном), но из AD его удалять нельзя.
Нашли опечатку в тексте? Пожалуйста, выделите ее и нажмите Ctrl+Enter! Спасибо!
Хотите поблагодарить автора за эту заметку? Вы можете это сделать!