17 января 2014

Удаление старых учетных записей компьютеров из Active Directory

Легенда:
Мы администратор домена domain.test крупного предприятия, и в нашей Active Directory имеются учетные записи компьютеров которые уже не используются в нашей сети. Появились они из-за того что при замене старых компьютеров, или переустановке на них операционных систем, системные администраторы не выводили их из домена, в некоторых случаях для этого не было возможности, так как компьютер не удавалось элементарно запустить.

Задача:
Организовать процедуру поиска и удаления, неиспользуемых в домене учетных записей компьютеров. Учесть то что в домен так же введены компьютеры под управлением Mac OS Х которые не умею работать с атрибутом LastLogonTimeStamp. Исключить подразделение, в котором находятся учетные записи серверов. Компьютеры удалять не сразу, а создать зону карантина в которой они будут находится некоторое время перед удалением.

Решение:
Решение этой задачи будет состоять из двух скриптов. Первый будет осуществлять поиск и перемещение устаревших учетных записей в специально созданную OU DisabledComputers (карантин). Второй будет удалять эти компьютеры оттуда, когда будет полная уверенность в том что они больше не нужны.

Скрипт №1 – Поиск и перемещение в карантин

·                     #Подключаем модуль ActiveDirectory
·                     Import-Module ActiveDirectory  
·                      
·                     # Берем текущую дату и отнимаем от неё необходимое количество дней. По умолчанию пароль учетной записи компьютера в домене меняется каждые 30 дней, поэтому задаем значение больше 30. В нашем случае это 45 дней.
·                     $Date = (Get-Date).AddDays(-45).ToFileTime()  
·                      
·                     #Исключаем OU с серверами
·         $DC = Get-ADComputer -Filter "*" -SearchScope Subtree -SearchBase "OU=Servers,DC=domain,DC=test" | select -exp distinguishedName
·          
·                     # Отбираем компьютеры у которые подключались к домену более 45-ти дней назад, у которых поле operatingSystem не пустое и не равно 'Mac OS X', а так же исключаем OU с контроллерами домена.
·                     $Computers = Get-ADComputer -Properties Name,LastLogonTimeStamp,operatingSystem  -Filter {LastLogonTimeStamp -lt $Date -and operatingSystem -notlike 'Mac OS X'| Where-Object {$_.operatingSystem -ne $null -and $DC -notcontains $_.DistinguishedName}
·                      
·                     #Отключаем выбранные компьютеры
·                     $Computers | Set-ADComputer -Enabled $false
·                      
·                     #Перемещаем в подразделение для удаленных компьютеров
·                     $DisabledComputersOU = "OU=DisabledComputers,DC=domain,DC=test"
·                     foreach ($comp in $Computers) {Move-ADObject -Identity $comp -TargetPath $DisabledComputersOU


Скрипт № 2 – Удаление учетных записей

·                     #Подключаем модуль ActiveDirectory
·                     Import-Module ActiveDirectory  
·                      
·                     #Отключаем запрос на подтверждение удаления, и вывод ошибок (а они будут, если объект защищен от случайного удаления)
·                     $ConfirmPreference = "None"
·                     $ErrorActionPreference = "SilentlyContinue"
·                      
·                     #Отбираем компьютеры из карантина, убеждаясь еще раз что они отключены
·                     $DelComputers = Get-ADComputer -Filter 'Enabled -eq $false' -SearchScope onelevel -SearchBase "OU=DisabledComputers,DC=domain,DC=test"
·                      
·                     #Удаляем выбранные компьютеры по очереди
·                     foreach ($DelComp in $DelComputers) {Remove-ADComputer -Identity $DelComp }


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