Поиск осиротевших компьютеров в AD с Powershell


15 сентября 2019


Поиск осиротевших компьютеров в AD с Powershell

В небольших организациях, когда списывают компьютер, выводят из домена, а учетные записи не удаляют. Из-за таких действий появляется список компьютеров, которые скапливаются годами создавая неудобства. Для поиска таких компьютеров можно использовать штатную команду:

Get-ADComputer -Identity 'CL1'

Которая вернет:

DistinguishedName : CN=CL1,CN=Computers,DC=domain,DC=local
DNSHostName       : cl1.domain.local
Enabled           : True
Name              : CL1
ObjectClass       : computer
ObjectGUID        : 91a78b7b-fae8-4f15-866d-e2d051fad1ac
SamAccountName    : CL1$
SID               : S-1-5-21-2105492826-702646196-2230886998-1103
UserPrincipalName :

В нашем случае нужно вернуть больше свойств. Для этого нужно указать ключ Properties:

Get-ADComputer -Identity 'CL1' -Properties *
AccountExpirationDate                :
accountExpires                       : 9223372036854775807
AccountLockoutTime                   :
AccountNotDelegated                  : False
...
DistinguishedName                    : CN=CL1,OU=Domain Controllers,DC=domain,DC=local
DNSHostName                          : CL1.domain.local
...
KerberosEncryptionType               : {RC4, AES128, AES256}
LastBadPasswordAttempt               :
LastKnownParent                      :
lastLogoff                           : 0
lastLogon                            : 132129930895749474
LastLogonDate                        : 9/14/2019 11:18:09 AM
lastLogonTimestamp                   : 132129586898666176
...
whenCreated                          : 9/14/2019 11:17:29 AM

Теперь можно увидеть свойство LastLogonDate по которому мы поймем дату последнего использования учетной записи. Что бы узнать это свойство у всех компьютеров нужно использовать параметр Filter. Я так же укажу сервер, с которого будут запрашиваться объекты и привилегированную учетную запись. Осиротевший компьютер я считаю любым, который не использовался за последние 365 дней.

# Запрос учетных данных
$cred = Get-Credential
# Дата последнего использования учетной записи
$date = (Get-Date).AddDays(-365)
Get-ADComputer `
        -Server AD1 `
        -Credential $cred `
        -Filter * `
        -Properties LastLogonDate `
              | Where-Object LastLogonDate -lt $date `
              | Select-Object Name,LastLogonDate

Этот скрипт будет хорошо работать в каталогах маленького и среднего значения. Если каталог будет большим, то нужно использовать следующий вариант. Я так же экспортирую данные в CSV файл что бы еще раз проверить эти компьютеры перед удалением:

# Запрос учетных данных
$cred = Get-Credential
# Дата последнего использования учетной записи
$date = (Get-Date).AddDays(-365)
Get-ADComputer `
        -Server AD1 `
        -Credential $cred `
        -Filter {LastLogonDate -lt $date} `
        -Properties LastLogonDate `
             | Select-Object Name,LastLogonDate `
             | ConvertTo-CSV -NoTypeInformation > C:\oldpc.csv

В списке oldpc будут содержаться все компьютеры, у которых значение LastLogonDate больше года. Далее, с помощью Remove-Computer, удалим эти компьютеры:

Import-Csv -Path 'C:\oldpc.csv' | Remove-ADComputer

Если вы хотите убедиться в каждом удалении можно использовать параметр -Confirm. С этим параметром у вас будет запрашиваться каждое действие удаления.

...

Теги: #powershell #ad


Популярные тэги
О блоге
Этот блог представляет собой конспекты выученного материала, преобретенного опыта и лучшие практики в системном администрировании и программировании.