Поиск неактивных компьютеров в Active Directory
Добрый день уважаемые читатели и гости блога, я очень часто пишу вам про доменную структуру Active Directory, так как считаю ее очень удобной и дружелюбной к системному администратору, так как позволяет в рамках одной учетной записи, предоставлять доступ к огромному количеству сервисов. По мимо учетных записей пользователей в Active Directory есть записи компьютеров, которые так же как и пользователи имеют свои пароли и проходят авторизацию при входе в сеть, контроллеры домена заставляют их даже менять свои пароли каждый месяц, что очень хорошо сказывается на безопасности, но бывают и обратные случаи, когда из за устаревшего пароля компьютер не проходит проверку подлинности на контроллере и приходится сбрасывать пароль компьютера, восстанавливая доверительные отношения. Так как компьютер проходит авторизацию, то он создает событие, которое можно отследить и тем самым найти неактивные компьютеры. У меня как раз и встала в очередной раз такая задача, и я решил себе написать подсказку, чтобы всегда можно было к ней обратиться, и сегодня мы получаем список неактивных компьютеров в Active Directory, для последующей чистки.
Как найти устаревшие учетные записи компьютеров
В решении нашей задачи мы будем использовать разные средства, как графические, так и консольные, в виде скриптов на Powershell, но обо всем по порядку.
Через оснастку active directory пользователи и компьютеры
Через ADUC можно получить список компьютер, по такому значению как последнее время изменения, которое по дате совпадает с параметром последнего логирования компьютера в Active Directory. Открываем active directory пользователи и компьютеры. Выбираем пункт сохраненные запросы и нажимаем создать запрос.
У вас откроется поле с созданием нового запроса к Active Directory. Задаем ему название, далее через кнопку обзор выбираем организационное подразделение, на которое следует натравить запрос, можете оставить и корень. Далее нажимаете кнопку запрос.
На вкладке пользователи выбираем пункт "Число дней со времени последнего входа в систему", я ставлю 60 дней, так как считаю, что таких командировок нет и компьютер уже точно не присутствует в локальной сети, и нет смысла хранения его учетной записи в базе контроллера домена.
Все, все параметры заданы и можно строить запрос к базе данных AD.
На выходе я получил список неактивных компьютеров в своей локальной сети, я называю их призраками. Они появляются, либо с поломкой техники, либо из-за халатности администратора. Простой пример системный администратор взял компьютер pyatilistnik01, для переустановки системы, в итоге при попытке ввода его в домен, он получает ошибку, о том, что такой компьютер уже есть и забивает на это, вводя другое имя, либо оставляет имя с генерируемое при установке системы, вида DESKTOP-4BA9AP5. В таких случаях помогает корпоративный стандарт именования компьютеров и автоматическое переименование на основании этих политик.
Зайдя в свойства любого компьютера, перейдите на вкладку объект, и посмотрите поле, изменен, оно будет совпадать по дате с полем LastLogonDate. В итоге я вижу, что данный компьютер не появлялся в сети с 14 ноября 2016 года, что дает мне мысли, о его удалении из базы NTDS.dit.
Как видите, хоть этот метод и графический, но не совсем удобный в плане автоматизации, так как подразумевает кучу ручной работы. К сожалению, выделив все компьютеры вы не сможете их отключить за один клик, вывод делаем все то же самое на powershell.
Через Powershell
За, что я люблю Poweshell, так это за его огромные возможности, у него для Active Directory отдельный модуль с командлетами, позволяющими производить большое количество манипуляций. Сразу приведу готовый код, который ищет компьютеры, от которых не было вестей 120 дней и выводит все это дело в тестовый файл с датой последнего обращения.
Get-ADComputer -Properties LastLogonDate -Filter {LastLogonDate -lt $date_with_offset } | Sort LastLogonDate | FT Name, LastLogonDate -AutoSize | Out-File c:\Script\services.txt
Замечательно список мы с вами научились получать, и вы можете посмотреть время последнего обращения компьютера к контроллеру домена. Идем дальше, теперь я хочу, чтобы данные компьютеры были выключены в Active Directory и были перемещены в отведенную под это дело OU. Вот пример кода.
$date_with_offset= (Get-Date).AddDays(-120)
$comps = Get-ADComputer -Properties LastLogonDate -Filter {LastLogonDate -lt $date_with_offset } | Sort LastLogonDate
foreach ($comp in $comps) {set-adcomputer $comp.name -enabled $false; move-adobject -identity $comp -targetpath "ou=Мск Л. рабочие станции на удаление,ou=Местоположение,dc=msk,dc=contoso,dc=com"}
Get-ADComputer -Properties LastLogonDate -Filter {LastLogonDate -lt $date_with_offset } | Sort LastLogonDate | FT Name, LastLogonDate -AutoSize | Out-File c:\Script\services.txt
Тут все отключенные компьютеры будут перемещаться в организационное подразделение Мск Л. рабочие станции на удаление. И далее я сделал, вывод в txt файл, чтобы видеть, какие именно учетные записи были отключены.
Далее вы этот скрипт можете повесить на контроллеры домена, через групповую политику и выполнять хотя бы раз в месяц. Я лично такие компьютеры через неделю удаляю.
Полезные ключи командлета Get-ADComputer
Что вам еще может пригодиться у команды Get-ADComputer, это больше для себя подсказка. Напоминаю, чтобы им воспользоваться, нужно загрузить модуль Active Directory, через команду
Теперь можно получить справку по команду Get-ADComputer, через команду:
Как видите, у команды очень много ключей и богатые возможности.
Я очень часто ее использую, когда мне нужно получить о компьютерной учетной записи максимальное количество данных, вот пример.
В данном выводе команды вы увидите основные значения:
- DistinguishedName
- SID > кто не вкурсе что такое SID, то смотрите по ссылке.
- DNSHostName
Если вам вдруг не хватает данных, то вы можете вывести все доступные поля.
Если хотите вывести конкретные поля, то выполните вот такую конструкцию, через | перечисляются нужные поля
Выше я писал уже, о том как сделать вывод всех компьютеров по параметрам, но тут то же продублирую в более простом виде. В качестве значений, так же можете указывать, все что вам нужно.
Выберем все компьютеры с операционной системой Windows 10
На выходе получаем файл со списком компьютеров.
Надеюсь вы поняли принцип поиска неактивных компьютеров в вашей локальной сети, и уверен, что вы сможете сами подобрать дополнительные сценарии использования powershell для себя.
Это всё для Windows Server 2012. Как такое провернуть на Server 2008 R2? В ADUC нет вкладки объект чтобы посмотреть LastLogonDate и PowerShell сыплет ошибками не понимая что такое Get-ADComputer.
Get-ADComputer. это команда получения компьютеров, а в ADUC должно быть, вы его открываете локально или же удаленно?
В 2008R2 нет LastLogonDate. Есть LastLogon и дату он выводит в формате Windows NT (количество интервалов по 100 наносекунд с 1601 года). Как бы вывести в нормальном формате?
Как то вот так — @{n=’LastLogon’;e={[DateTime]::FromFileTime($_.LastLogon)}}
Так вы выбираете в графическом интерфейсе вкладку «пользователи» — как это может отработать для компьютеров?
Дарья, вы же предварительно должны указать OU, в котором у вас находятся только рабочие станции. Если выбрать весь контроллер целиком, то он будет показывать и пользователей и ПК.