Поиск неактивных компьютеров в Active Directory

Поиск неактивных компьютеров в Active Directory

Добрый день уважаемые читатели и гости блога, я очень часто пишу вам про доменную структуру Active Directory, так как считаю ее очень удобной и дружелюбной к системному администратору, так как позволяет в рамках одной учетной записи, предоставлять доступ к огромному количеству сервисов. По мимо учетных записей пользователей в Active Directory есть записи компьютеров, которые так же как и пользователи имеют свои пароли и проходят авторизацию при входе в сеть, контроллеры домена заставляют их даже менять свои пароли каждый месяц, что очень хорошо сказывается на безопасности, но бывают и обратные случаи, когда из за устаревшего пароля компьютер не проходит проверку подлинности на контроллере и приходится сбрасывать пароль компьютера, восстанавливая доверительные отношения. Так как компьютер проходит авторизацию, то он создает событие, которое можно отследить и тем самым найти неактивные компьютеры. У меня как раз и встала в очередной раз такая задача, и я решил себе написать подсказку, чтобы всегда можно было к ней обратиться, и сегодня мы получаем список неактивных компьютеров в Active Directory, для последующей чистки.

Как найти устаревшие учетные записи компьютеров

В решении нашей задачи мы будем использовать разные средства, как графические, так и консольные, в виде скриптов на Powershell, но обо всем по порядку.

Через оснастку active directory пользователи и компьютеры

Через ADUC можно получить список компьютер, по такому значению как последнее время изменения, которое по дате совпадает с параметром последнего логирования компьютера в Active Directory. Открываем active directory пользователи и компьютеры. Выбираем пункт сохраненные запросы и нажимаем создать запрос.

Поиск неактивных компьютеров в Active Directory-1

У вас откроется поле с созданием нового запроса к Active Directory. Задаем ему название, далее через кнопку обзор выбираем организационное подразделение, на которое следует натравить запрос, можете оставить и корень. Далее нажимаете кнопку запрос.

Поиск неактивных компьютеров в Active Directory-2

На вкладке пользователи выбираем пункт "Число дней со времени последнего входа в систему", я ставлю 60 дней, так как считаю, что таких командировок нет и компьютер уже точно не присутствует в локальной сети, и нет смысла хранения его учетной записи в базе контроллера домена.

Поиск неактивных компьютеров в Active Directory-3

Все, все параметры заданы и можно строить запрос к базе данных AD.

Поиск неактивных компьютеров в Active Directory-4

На выходе я получил список неактивных компьютеров в своей локальной сети, я называю их призраками. Они появляются, либо с поломкой техники, либо из-за халатности администратора. Простой пример системный администратор взял компьютер pyatilistnik01, для переустановки системы, в итоге при попытке ввода его в домен, он получает ошибку, о том, что такой компьютер уже есть и забивает на это, вводя другое имя, либо оставляет имя с генерируемое при установке системы, вида DESKTOP-4BA9AP5. В таких случаях помогает корпоративный стандарт именования компьютеров и автоматическое переименование на основании этих политик.

Поиск неактивных компьютеров в Active Directory-5

Зайдя в свойства любого компьютера, перейдите на вкладку объект, и посмотрите поле, изменен, оно будет совпадать по дате с полем LastLogonDate. В итоге я вижу, что данный компьютер не появлялся в сети с 14 ноября 2016 года, что дает мне мысли, о его удалении из базы NTDS.dit.

Поиск неактивных компьютеров в Active Directory-6

Как видите, хоть этот метод и графический, но не совсем удобный в плане автоматизации, так как подразумевает кучу ручной работы. К сожалению, выделив все компьютеры вы не сможете их отключить за один клик, вывод делаем все то же самое на powershell.

Через Powershell

За, что я люблю Poweshell, так это за его огромные возможности, у него для Active Directory отдельный модуль с командлетами, позволяющими производить большое количество манипуляций. Сразу приведу готовый код, который ищет компьютеры, от которых не было вестей 120 дней и выводит все это дело в тестовый файл с датой последнего обращения.

$date_with_offset= (Get-Date).AddDays(-120)
Get-ADComputer -Properties LastLogonDate -Filter {LastLogonDate -lt $date_with_offset } | Sort LastLogonDate | FT Name, LastLogonDate -AutoSize | Out-File c:\Script\services.txt

находим устаревшие учетные записи компьютеров-1

Замечательно список мы с вами научились получать, и вы можете посмотреть время последнего обращения компьютера к контроллеру домена. Идем дальше, теперь я хочу, чтобы данные компьютеры были выключены в 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 файл, чтобы видеть, какие именно учетные записи были отключены.

находим устаревшие учетные записи компьютеров-2

Далее вы этот скрипт можете повесить на контроллеры домена, через групповую политику и выполнять хотя бы раз в месяц. Я лично такие компьютеры через неделю удаляю.

Полезные ключи командлета Get-ADComputer

Что вам еще может пригодиться у команды Get-ADComputer, это больше для себя подсказка. Напоминаю, чтобы им воспользоваться, нужно загрузить модуль Active Directory, через команду

Import-Module activedirectory

Теперь можно получить справку по команду Get-ADComputer, через команду:

Get-Help Get-ADComputer

Как видите, у команды очень много ключей и богатые возможности.

находим устаревшие учетные записи компьютеров-3

Я очень часто ее использую, когда мне нужно получить о компьютерной учетной записи максимальное количество данных, вот пример.

Get-ADComputer -Identity DESKTOP-2C4R0V6

В данном выводе команды вы увидите основные значения:

находим устаревшие учетные записи компьютеров-4

Если вам вдруг не хватает данных, то вы можете вывести все доступные поля.

Get-ADComputer -Identity DESKTOP-2C4R0V6 -Properties *

находим устаревшие учетные записи компьютеров-5

Если хотите вывести конкретные поля, то выполните вот такую конструкцию, через | перечисляются нужные поля

Get-ADComputer -identity DESKTOP-2C4R0V6 -Properties * | FT Name, LastLogonDate -Autosize

находим устаревшие учетные записи компьютеров-6

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

Get-ADComputer -Filter * -Properties * | FT Name, LastLogonDate -Autosize

находим устаревшие учетные записи компьютеров-7

Выберем все компьютеры с операционной системой Windows 10

Get-ADComputer -Filter { OperatingSystem -Like '*Windows 10*' } -Properties OperatingSystem | Select Name, OperatingSystem | Format-Table -AutoSize | Out-File C:\Script\server_system.txt

На выходе получаем файл со списком компьютеров.

находим устаревшие учетные записи компьютеров-8

Надеюсь вы поняли принцип поиска неактивных компьютеров в вашей локальной сети, и уверен, что вы сможете сами подобрать дополнительные сценарии использования powershell для себя.

Оцените статью
Настройка серверов windows и linux
Добавить комментарий

  1. vintik

    Это всё для Windows Server 2012. Как такое провернуть на Server 2008 R2? В ADUC нет вкладки объект чтобы посмотреть LastLogonDate и PowerShell сыплет ошибками не понимая что такое Get-ADComputer.

  2. Иван Семин автор

    Get-ADComputer. это команда получения компьютеров, а в ADUC должно быть, вы его открываете локально или же удаленно?

  3. Владимир

    В 2008R2 нет LastLogonDate. Есть LastLogon и дату он выводит в формате Windows NT (количество интервалов по 100 наносекунд с 1601 года). Как бы вывести в нормальном формате?

  4. Иван Семин автор

    Как то вот так — @{n=’LastLogon’;e={[DateTime]::FromFileTime($_.LastLogon)}}

  5. Дарья

    Так вы выбираете в графическом интерфейсе вкладку «пользователи» — как это может отработать для компьютеров?

  6. Равиль Ринатович

    Дарья, вы же предварительно должны указать OU, в котором у вас находятся только рабочие станции. Если выбрать весь контроллер целиком, то он будет показывать и пользователей и ПК.