Наводил я порядок в очередной компании с количеством пользователей 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
Берегите себя.