ShS's Blog

Just another sysadmin's weblog

Поиск устаревших учетных записей в AD

Posted by shs на 2010/03/11

 Очень часто на компьютерных форумах возникает вопрос: каким образом можно выполнить поиск «устаревших» учетных записей пользователей и компьютеров в AD? Постараюсь дать развернутый ответ в этой заметке. И так, давайте сначала определимся, что под устаревшими учетными записями мы будем понимать учетные записи, которые давно не использовались. Каким образом можно  определить, как давно не использовалась та или иная учетная запись? Вполне логично было бы вы полнить поиск учетных записей, которые давно не выполняли вход в систему. Казалось, нет ничего проще: мы знаем, что у каждой учетной записи, будь то компьютер или пользователь, имеется атрибут lastLogon, в котором содержится дата/время последнего входа в систему. Делаем запрос к LDAP-каталогу (DC) и, если у вас более одного DC в домене, … получаем ошибочные данные. Все дело в том, что атрибут lastLogon не является реплицируемым, поэтому на разных DC значения этого атрибута для одной и той же учетной записи будут разными. Каждый DC сохраняет в этом атрибуте свою отметку времени о  «логоне» (процессе входа в систему), который был обслужен  данным конкретным DC. Сделано это, надо полагать, намерено, иначе любой вход в систему должен был бы приводить к репликации. Как же нам быть в этой ситуации? По всей видимости, необходимо опросить все DC в домене, и выбрать из всех имеющихся значений атрибута lastLogon тот, который наиболее близок к настоящему моменту времени. Именно так и приходилось поступать для доменов, которые работают в Режиме Windows 2000 (Windows 2000 Domain Functional Level). Для доменов, которые работают в Режиме Windows 2003 (Windows 2003 Domain Functional Level) и выше, можно поступать по-другому. Дело в том, что в Windows 2003 у каждой учетной записи появился еще один атрибут: lastLogontimeStamp. Этот атрибут был введен, как компромисс между желанием получить оценку последнего времени входа на основании опроса только одного DC и  нежеланием проводить слишком частую репликацию из-за изменения этого атрибута. Компромисс заключается в том, что значение этого атрибута обновляется не при каждом входе в систему (по умолчанию, значение атрибута будет обновлено не раньше, чем через 9 дней (и не позже, чем через 14 дней) относительно прошлого времени обновления этого атрибута). Подробно и очень хорошо об этом  написано здесь:  “The LastLogonTimeStamp Attribute” – “What it was designed for and how it works”

 И так, если Режим работы домена не ниже, чем Windows 2003, то мы будем пользоваться атрибутом lastLogontimeStamp. Делать это можно при помощи любых доступных нам  инструментов. Например, можно получить перечень давно неиспользовавшихся «учеток» компьютеров или пользователей при помощи хорошо известной команды dsquery:

 dsquery user -inactive 8

 эта команда выдаст на экран список пользователей, которые не выполняли вход в систему в течении 8 недель.

На PoSh аналогичного результата можно добиться  таким образом:

$InactiveDays = New-TimeSpan -days 56
$LastLogonTimeMark= (get-date) - $InactiveDays
#
Get-QADComputer -IncludedProperties lastLogonTimestamp| ?{$_.lastLogonTimestamp -lt $LastLogonTimeMark}

PowerShell хорош своей гибкостью и можно легко модифицировать вышеприведенный скрипт, сделав его более полезным:

$InactiveDays = New-TimeSpan -days 56
$LastLogonTimeMark= (get-date) - $InactiveDays
Get-QADComputer -IncludedProperties lastLogontimeStamp|
?{$_.lastLogontimeStamp -lt $LastLogonTimeMark}| sort lastLogontimeStamp| ft Name,lastLogontimeStamp, whenCreated –AutoSize

Результат работы этого скрипта:

Name            lastlogontimestamp  whencreated
----            ------------------  -----------
tmptest                             10.03.2010 15:50:19
org-20080513-1N 11.07.2008 14:26:36 13.05.2008 20:39:41
org-20070717-2  10.10.2008 11:32:00 10.10.2008 15:31:59
org-20080521-1N 17.10.2008 8:24:15  21.05.2008 16:15:25
org-20070516-01 19.12.2008 12:08:58 30.04.2008 13:22:44
org-SRV-TEST    20.05.2009 8:24:01  15.10.2008 10:06:44
org-20070528-1  04.08.2009 12:27:40 14.10.2008 17:45:56
org-20070724-1  10.08.2009 5:54:00  13.07.2009 9:33:35
org-20070726-1T 07.09.2009 12:59:59 05.06.2008 12:22:29
org-20071024-1T 29.09.2009 8:39:32  05.06.2008 16:12:50
org-20070801-1T 07.10.2009 13:36:24 06.10.2008 16:05:06
org-20070906-1T 15.10.2009 13:03:34 03.06.2008 13:13:18
org-20070715-1N 18.11.2009 12:43:42 29.05.2008 10:39:38

Теперь мы видим на экране список имен учетных записей компьютеров, отсортированных по времени последнего входа в систему, и время создания оных «учеток».

Кстати, вышеприведенный скрипт позволит вам обнаружить такие учетные записи, которые, возможно, ни разу не выполняли вход в систему. Для таких учетных записей атрибут lastLogonTimestamp не определен, и  в результатах работы скрипта для таких «учеток» мы вместо даты увидим пустое поле в соответствующем столбце. В этом случае нам пригодится информация из соседнего столбца (whenCreated), в котором указана дата создания учетной записи. Благодаря этой информации, мы можем сделать вывод о том, была ли «учетка» создана давным-давно и позабыта-позаброшена или, наоборот, она настолько молода, что ей еще никто не успел воспользоваться.

Ну, и наконец, было бы неплохо убрать из результатов вывода отключенные учетные записи (disabled accounts). И, если в случае с учетными записями пользователя сделать это не трудно, благодаря тому, что у объектов типа Quest.ActiveRoles.ArsPowerShellSnapIn.Data.ArsUserObject имеется свойство AccountIsDisabled, то для объектов типа Quest.ActiveRoles.ArsPowerShellSnapIn.Data.ArsComputerObject такого свойства не определено и придется немного повозиться. В AD информация о том, отключена учетная запись или нет, хранится во втором бите многобитового атрибута UserAccountControl. Для своего удобства мы можем добавить к результирующему объекту нашего скрипта поле, значение которого будет сформировано на основе содержимого вышеназванного бита. Добавление нового поля объекта можно выполнить при помощи оператора select-object:

…| select …,  @{Name=»Disabled»; Exp={$_.useraccountcontrol -band 2}}

В конечном счете, получим такой скрипт:

$InactiveDays = New-TimeSpan -days 56
$LastLogonTimeMark= (get-date) - $InactiveDays
#
Get-QADComputer -IncludedProperties lastLogontimeStamp, useraccountcontrol|
?{$_.lastLogontimeStamp -lt $LastLogonTimeMark}|
select name, lastLogontimeStamp, whenCreated, @{Name="Disabled"; Exp={$_.useraccountcontrol -band 2}}|
?{$_.Disabled -eq 0}|
sort lastLogontimeStamp| ft Name,lastLogonTimeStamp, whenCreated, Disabled -AutoSize

Скрипт вышел универсальным, если мы заменим Get-QADComputer на Get-QADUser, то получим такой же отчет, но не по компьютерам, а по пользователям.

Будут вопросы – пишите письма, искренне ваш и «все такое» ;).

Реклама

комментариев 5 to “Поиск устаревших учетных записей в AD”

  1. Caspe_r said

    А откуда береться команда Get-QADComputer, Get-ADComputer есть а той нету. у меня ругаеться на данный скрипт

  2. Caspe_r said

    Прошу прощения а вы вывод не делали в csv фаил, для того чтоп в дальнейшем проанализировать

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

 
%d такие блоггеры, как: