PowerShell. Remove-ADСomputer

Наводил я порядок в очередной компании с количеством пользователей 400+. Естественно, бардак неописуемый в AD (не буду описывать подробно какой). Одним из признаков бардака было количество учетных записей компьютеров, на 79% превышающих количество пользователей. Даже если учесть, что учетных записей серверов было около 35 (админиСраторы данной организации любят плодить виртуальные машины) - учетных записей компьютеров все равно чуть больше, чем дохера.


Естественно, обходить всех пользователей, и записывать на бумажку имя компьютера, потом в ручную убирать несуществующие - это маразм.

Шурик, вы комсомолец? Это же не наш метод! Где гуманизм? Где человек-человеку? Поймите, Шурик...В то время, когда  космические корабли, как вы знаете, бороздят...

У нас есть PowerShell - аналог командной строки в Linux-подобных системах, с помощью которого, при правильном его применении - можно сделать почти все и очень быстро (Лень-двигатель серого вещества администратора).

Для начала, чтобы оценить масштаб трагедии, выгрузим все существущие в AD учетные записи компьютеров

Get-ADComputer -Filter * -Property * | Select-Object Name,OperatingSystem,LastLogonDate,Enabled | Export-CSV  c:\ccwlld.txt -NoTypeInformation -Encoding UTF8

В параметр  Select-Object возможно добавить все, что вы хотите узнать - от времени создания до сервис-пака операционной системы. Параметры, которые можно добавить получить возможно с помощью команды

Get-AdComputer * -Identity %СomputerName%

Достаточно будет выгрузить параметры всего одного компьютера.

Вопрос, по какому параметру выбирать несуществующие компьютеры не стоял - LastLogonDate - время последнего входа в систему, т.е. время, когда компьютер крайний раз включался и соответственно сообщал AD, что тело живо и имеет место быть.

В сим нам поможет уже знакомая команда Get-ADComputer

Назначаем переменную $DaysLastLogon (название переменной по желанию)
$DaysLastLogon = 180 (Время в днях. Параметр по желанию)

Время, которое нас интересует. Текущее время минус количество дней, которое мы указали выше.
$time = (Get-Date).Adddays(-($DaysLastLogon))

Команда выбирает компьютеры, которые сообщали о своей жизни AD крайний раз 180 дней назад от текущей даты. Параметр distinguishedName, указывает полный путь до компьютера.

Get-ADComputer -Filter {LastLogonDate -lt $time} -Properties LastLogonDate | Select distinguishedName > C:\Computers.txt

Затем удаляем учетные записи компьютеров, которые были выгружены в файл Computers.txt

Get-Content C:\Computers.txt | Get-ADComputer | Remove-AdObject -recursive

После можем проверить общее количество компютеров, которое осталось в AD после операции и сравнить.

Get-ADComputer -Filter * -Property * | Select-Object Name,OperatingSystem,LastLogonDate,Enabled | Export-CSV  c:\ccwlld1.txt -NoTypeInformation -Encoding UTF8


Берегите себя.