Определяем местонахождение заблокированного пользователя при помощи PowerShell – Hey, Scripting Guy! Blog

Резюме: Приглашенный блогер Microsoft PFE Jason Walker рассказывает об использовании Windows PowerShell для определения местонахождения заблокированного пользователя.

Microsoft Scripting Guy, Ed Wilson на связи. Сегодня у нас приглашенный блогер Microsoft Premier Field Engineer (PFE) Jason Walker. Jason написал несколько сверхпопулярных постов и сегодняшняя статья не исключение.

Определяем местонахождение заблокированного пользователя

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

Существует два основных подхода для решения проблем с заблокированными учетными записями. Вы можете отслеживать записи событий неудачных попыток входа в систему. Журналируемые события могут различаться в зависимости от того, как настроен аудит в вашей среде. Однако, более простой способ – это дождаться, пока учетная запись будет заблокирована.

Неудачные попытки входа регистрируются на контроллере домена с ролью PDC Emulator. Как я сказал ранее, регистрируемые события могут различаться в зависимости от настроек аудита. Что не зависит от имеющихся настроек, так это номер события, регистрируемого при блокировке учетной записи. В среде с контроллерами домена, работающими на Windows Server 2008 и выше, при блокировке учетной записи в журнале Security эмулятора PDC регистрируется событие в кодом 4740. В этом событии указывается источник неудачной попытки входа. Ниже приведен пример из моей лабораторной сети:

01

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

1. Определять контроллер домена с ролью PDC

2. Получать события с кодом 4740 из журнала Security

3. Фильтровать полученные события для получения только тех, которые касаются указанного пользователя

Не так уж и страшно.

Ниже приведен рисунок, показывающий скрипт в действии.

02

Скрипт подключается ко всем контроллерам домена и отображает атрибут LastBadPasswordAttempt учетной записи пользователя. Если на всех контроллерах домена зарегистрированы неудачные попытки входа в систему это может означать наличие вирусной активности или чего-то подобного. Эта информация не является необходимой для определения местонахождения заблокированного пользователя. Кроме того, эти запросы увеличивают время выполнения скрипта и, поскольку атрибут LastBadPasswordAttempt не реплицируется, необходимо опросить каждый контроллер домена. Однако, эта информация может быть полезна при траблшутинге. Второй блок информации содержит события с кодом 4740, полученные с PDC-эмулятора и касающиеся указанного пользователя. Эти события отсортированы в убывающем порядке по времени их создания.

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

$DomainControllers = Get-ADDomainController -Filter *

Foreach($DC in $DomainControllers)

{

   Get-ADUser -Identity brwilliams -Server $DC.Hostname `

   -Properties AccountLockoutTime,LastBadPasswordAttempt,BadPwdCount,LockedOut

}

Как вы можете заметить, я использовал параметр –Properties и указал только те свойства, которые мне нужны. Я видел как администраторы используют параметр –Properties *, и это меня несколько раздражает. Когда вы используете этот символ подстановки, передаются все 140 с лишним атрибутов пользователя. Это совершенно впустую увеличивает время выполнения скрипта. В небольшой сети с 3 контроллерами домена это может и не так заметно, до в большем домене с 15 контроллерами я гарантирую, что вы столкнетесь с падением производительности.

Теперь давайте посмотрим, как получить события с кодом 4740 с эмулятора PDC.

Используя командлет Get-WinEvent я могу с легкостью создать фильтр, возвращающий все события с кодом 4740.

03

Давайте более тесно обзнакомимся с одним из событий, передав его командлету Format-List.

04

Свойство Message содержит всю необходимую нам информацию, но оно является строкой, поэтому для получения этой информации нам потребуется дописать еще немного кода в наш скрипт. К счастью существует свойство Properties. Давайте на него взглянем.

05

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

Получив все события с кодом 4740, мы отфильтруем их таким образом, чтобы получить только те, которые касаются указанного пользователя и выведем второй элемент массива Properties. Это и есть имя компьютера, на котором произошла неудачная попытка входа пользователя.

Еще несколько вещей, о которых стоит упомянуть:

1. После того, как вы определите местонахождение заблокированного пользователя, вам нужно будет сделать еще кое-что. Вам потребуется определить, что именно выполняет эти попытки входа. Это может быть учетная запись службы, пароль которой был изменен и должен быть обновлен в конфигурации службы. Или это назначенное задание. Я думаю, что с большей вероятностью это может быть пользователь, который вошел под своей учетной записью и больше из под нее не выходил, изменив свой пароль после того как в последний раз залогинился.

2. В промышленной среде логи PDC-эмулятора перезаписываются каждые 24-48 часов. Поэтому чем быстрее вы начнете искать корни проблемы, тем лучше.

3. Этот скрипт требует наличия эмулятора PDC на компьютере с Windows Server 2008 и выше. Командлет Get-WinEvent не совместим с Windows Server 2003 и кроме того, контроллеры домена с этой операционной системой при блокировке аккаунта регистрируют событие с кодом 644, а не 4740.

4. В скрипте используется модуль ActiveDirectory, что требует наличия на контроллере домена Active Directory Web Services.

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

Счастливого траблшутинга!

Вы можете загрузить этот скрипт из репозитория скриптов.

Автор:

Ed Wilson, Microsoft Scripting Guy

Оригинал:

http://blogs.technet.com/b/heyscriptingguy/archive/2012/12/27/use-powershell-to-find-the-location-of-a-locked-out-user.aspx


Страницы в социальных сетях:

Twitter: https://twitter.com/vsseth
Facebook: https://fb.com/inpowershell
VKontakte: https://vk.com/inpowershell


Реклама

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

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

Логотип WordPress.com

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

Google+ photo

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

Фотография Twitter

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

Фотография Facebook

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

Connecting to %s