Оперативный контроль аккаунтов пользователей и компьютеров в Active Directory

image_pdfimage_print

Обновлено 20.03.2013. Внесен ряд исправлений
В скриптах, связанных с удалением компьютерных учетных записей не выводилось имя компьютера
Кроме того, как оказалось, при массовых операциях, например вводах в группу или удалении из группы, приходит только одно уведомление, что само по себе не очень правильно. В связи с этим скрипты несколько переделаны — вместо последнего, отбираются все такие события за последние 120 секунд

Недавно я публиковал заметку Автоматическое уведомление о заблокированных аккаунтах. Там было вполне рабочее решение, но у него был один недостаток – информация приходила в несколько “корявом” виде. В песочнице хабры я нашел нашел статью, в которой аналогичные вещи сделаны гораздо удобнее.

На ее основании я сделал  десяток скриптов, которые будут информировать вас о:

— блокировании и разблокировании (lock/unlock) учетных записей пользователей
— добавлении или удалении кого-либо в/из группы
— включение или выключение (enable/disable) пользовательского аккаунта

— добавление или удаление компьютера в/из домена
— добавление или удаление пользователя в/из домена

Все нижеприведенные скрипты сохраняются в файлы, по одному в каждый из файлов, файлы кладутся на контроллер домена, там же запускается Task Scheduler и в нем создается задача с триггером на соответствующий EventID в Security Log, например 4740, и действием, содержащим запуск C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe с параметром в виде пути к скрипту и его именем, например, C:\cmd\event-notification-4740-account_lockout.ps1

В результате, вы оперативно получаете информацию по важным изменениям в AD и можете на нее оперативно реагировать

#Отправка уведомлений по наступлению события 4740 — блокирование учетной записи пользователя
#Автор оригинального скрипта:
http://habrahabr.ru/post/147750/
#Изменения (itpadla.wordpress.com)
#Дата создания 22.08.2012
#Дата изменения: 20.03.2013
#Описание: скрипт отправляет уведомление о определенном событии в Security Log в письме в человекочитаемом виде
#####################################################################################
$Subject = “Заблокирован аккаунт»
$Theme = “Только что был заблокирован аккаунт”
$Server = “smtp.domain.ua
$From = “noreplay@domain.ua
$To = “it@domain.ua
$encoding = [System.Text.Encoding]::UTF8

#Выбирается последнее произошедшее событие с таким ID.

$Body=Get-WinEvent -maxevents 1 -FilterHashtable @{LogName=”Security”;ID=4740;StartTime=(Get-Date)..AddSeconds(-120)} | Select TimeCreated,@{n=”Аккаунт”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “TargetUserName”} |%{$_.’#text’}}},@{n=”Имя компьютера”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “TargetDomainName”}| %{$_.’#text’}}}
$body = $body -replace «@{» -replace «}» -replace «=», «: » -replace «;»,»`n» -replace «TimeCreated»,»Время события» -replace «^»,»`n»
$BodyM = $Body

Send-MailMessage -From $From -To $To -SmtpServer $server -Body “$Theme `n$BodyM” -Subject $Subject -Encoding $encoding


#Отправка уведомлений по наступлению события 4767 — разблокирование учетной записи пользователя
#Автор оригинального скрипта:
http://habrahabr.ru/post/147750/
#Изменения (itpadla.wordpress.com)
#Дата создания 22.08.2012
#Дата изменения: 20.03.2013
#Описание: скрипт отправляет уведомление о определенном событии в Security Log в письме в человекочитаемом виде
#####################################################################################

$Subject = “Разблокирован аккаунт”
$Theme = “Только что был разблокирован аккаунт”
$Server = “smtp.domain.ua
$From = “noreplay@domain.ua
$To = “it@domain.ua
$encoding = [System.Text.Encoding]::UTF8

#Выбирается последнее произошедшее событие с таким ID.

$Body=Get-WinEvent -maxevents 1 -FilterHashtable @{LogName=”Security”;ID=4767;StartTime=(Get-Date)..AddSeconds(-120)} | Select TimeCreated,@{n=”Аккаунт”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “TargetUserName”} |%{$_.’#text’}}},@{n=”Имя компьютера”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “TargetDomainName”}| %{$_.’#text’}}}

$body = $body -replace «@{» -replace «}» -replace «=», «: » -replace «;»,»`n» -replace «TimeCreated»,»Время события» -replace «^»,»`n»
$BodyM = $Body

Send-MailMessage -From $From -To $To -SmtpServer $server -Body “$Theme `n$BodyM” -Subject $Subject -Encoding $encoding


#Отправка уведомлений по наступлению события 4728 — Добавление учетной записи в группу
#Автор оригинального скрипта:
http://habrahabr.ru/post/147750/
#Изменения (itpadla.wordpress.com)
#Дата создания 22.08.2012
#Дата изменения: 20.03.2013
#Описание: скрипт отправляет уведомление о определенном событии в Security Log в письме в человекочитаемом виде
#####################################################################################

$Subject = “Добавление учетной записи в группу”
$Theme = “Учетная запись добавлена в группу”
$Server = “smtp.domain.ua” # SMTP Сервер
$From = “noreplay@domain.ua” # Адрес отправителя
$To = “it@domain.ua” # Получатель

$encoding = [System.Text.Encoding]::UTF8

#Собственно сам запрос поиска события. Выбирается последнее произошедшее событие с таким ID.

$Body=Get-WinEvent -FilterHashtable @{LogName=”Security”;ID=4728;StartTime=(Get-Date)..AddSeconds(-120)} | Select TimeCreated,@{n=”Оператор”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “SubjectUserName”} |%{$_.’#text’}}},@{n=”Имя группы”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “TargetUserName”}| %{$_.’#text’}}}, @{n=”Имя пользователя”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “MemberName”}| %{$_.’#text’}}}

$body = $body -replace «@{» -replace «}» -replace «=», «: » -replace «;»,»`n» -replace «TimeCreated»,»Время» -replace «^»,»`n»
$BodyM = $Body

Send-MailMessage -From $From -To $To -SmtpServer $server -Body “$Theme `n$BodyM” -Subject $Subject -Encoding $encoding


#Отправка уведомлений по наступлению события 4729 — Удаление учетной записи из группы
#Автор оригинального скрипта:
http://habrahabr.ru/post/147750/
#Изменения (itpadla.wordpress.com)
#Дата создания 22.08.2012
#Дата изменения: 20.03.2013
#Описание: скрипт отправляет уведомление о определенном событии в Security Log в письме в человекочитаемом виде
#####################################################################################

$Subject = “Удаление учетной записи из группы”
$Theme = “Учетная запись удалена из группы”
$Server = “smtp.domain.ua” # SMTP Сервер
$From = “noreplay@domain.ua” # Адрес отправителя
$To = “it@domain.ua” # Получатель

$encoding = [System.Text.Encoding]::UTF8

#Собственно сам запрос поиска события. Выбирается последнее произошедшее событие с таким ID.

$Body=Get-WinEvent -FilterHashtable @{LogName=”Security”;ID=4729;StartTime=(Get-Date)..AddSeconds(-120)} | Select TimeCreated,@{n=”Оператор”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “SubjectUserName”} |%{$_.’#text’}}},@{n=”Имя группы”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “TargetUserName”}| %{$_.’#text’}}}, @{n=”Имя пользователя”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “MemberName”}| %{$_.’#text’}}}

$body = $body -replace «@{» -replace «}» -replace «=», «: » -replace «;»,»`n» -replace «TimeCreated»,»Время» -replace «^»,»`n»
$BodyM = $Body

Send-MailMessage -From $From -To $To -SmtpServer $server -Body “$Theme `n$BodyM” -Subject $Subject -Encoding $encoding


#Отправка уведомлений по наступлению события 4722 — включение учетной записи пользователя
#Автор оригинального скрипта:
http://habrahabr.ru/post/147750/
#Изменения (itpadla.wordpress.com)
#Дата создания 22.08.2012
#Дата изменения: 20.03.2013
#Описание: скрипт отправляет уведомление о определенном событии в Security Log в письме в человекочитаемом виде
#####################################################################################
$Subject = “Аккаунт включен»
$Theme = “Только что был включен аккаунт”
$Server = “smtp.domain.ua
$From = “noreplay@domain.ua
$To = “it@domain.ua
$encoding = [System.Text.Encoding]::UTF8

#Выбирается последнее произошедшее событие с таким ID.

$Body=Get-WinEvent -FilterHashtable @{LogName=”Security”;ID=4722;StartTime=(Get-Date)..AddSeconds(-120)} | Select TimeCreated,@{n=”Оператор”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “SubjectUserName”} |%{$_.’#text’}}},@{n=”Аккаунт”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “TargetUserName”}| %{$_.’#text’}}}
$body = $body -replace «@{» -replace «}» -replace «=», «: » -replace «;»,»`n» -replace «TimeCreated»,»Время события» -replace «^»,»`n»
$BodyM = $Body

Send-MailMessage -From $From -To $To -SmtpServer $server -Body “$Theme `n$BodyM” -Subject $Subject -Encoding $encoding


#Отправка уведомлений по наступлению события 4725 — отключение учетной записи пользователя
#Автор оригинального скрипта:
http://habrahabr.ru/post/147750/
#Изменения (itpadla.wordpress.com)
#Дата создания 22.08.2012
#Дата изменения: 20.03.2013
#Описание: скрипт отправляет уведомление о определенном событии в Security Log в письме в человекочитаемом виде
#####################################################################################
$Subject = “Аккаунт выключен»
$Theme = “Только что был выключен аккаунт”
$Server = “smtp.domain.ua
$From = “noreplay@domain.ua
$To = “it@domain.ua
$encoding = [System.Text.Encoding]::UTF8

#Выбирается последнее произошедшее событие с таким ID.

$Body=Get-WinEvent -FilterHashtable @{LogName=”Security”;ID=4725;StartTime=(Get-Date)..AddSeconds(-120)} | Select TimeCreated,@{n=”Оператор”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “SubjectUserName”} |%{$_.’#text’}}},@{n=”Аккаунт”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “TargetUserName”}| %{$_.’#text’}}}
$body = $body -replace «@{» -replace «}» -replace «=», «: » -replace «;»,»`n» -replace «TimeCreated»,»Время события» -replace «^»,»`n»
$BodyM = $Body

Send-MailMessage -From $From -To $To -SmtpServer $server -Body “$Theme `n$BodyM” -Subject $Subject -Encoding $encoding


#Отправка уведомлений по наступлению события 4741 — Создание учетной записи компьютера в домене
#Автор оригинального скрипта:
http://habrahabr.ru/post/147750/
#Изменения (itpadla.wordpress.com)
#Дата создания 22.08.2012
#Дата изменения: 20.03.2013
#Описание: скрипт отправляет уведомление о определенном событии в Security Log в письме в человекочитаемом виде
#####################################################################################

$Subject = “Создание учетной записи компьютера в домене”
$Theme = “Добавлен новый компьютер в домен”
$Server = “smtp.domain.ua” # SMTP Сервер
$From = “noreplay@domain.ua” # Адрес отправителя
$To = “it@domain.ua” # Получатель

$encoding = [System.Text.Encoding]::UTF8

#Собственно сам запрос поиска события. Выбирается последнее произошедшее событие с таким ID.

$Body=Get-WinEvent -FilterHashtable @{LogName=”Security”;ID=4741;StartTime=(Get-Date)..AddSeconds(-120)} | Select TimeCreated,@{n=”Оператор”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “SubjectUserName”} |%{$_.’#text’}}},@{n=”Имя компьютера”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “TargetUserName”}| %{$_.’#text’}}}

$body = $body -replace «@{» -replace «}» -replace «=», «: » -replace «;»,»`n» -replace «TimeCreated»,»Время» -replace «^»,»`n»
$BodyM = $Body

Send-MailMessage -From $From -To $To -SmtpServer $server -Body “$Theme `n$BodyM” -Subject $Subject -Encoding $encoding


#Отправка уведомлений по наступлению события 4743 — Удаление учетной записи компьютера в домене
#Автор оригинального скрипта:
http://habrahabr.ru/post/147750/
#Изменения (itpadla.wordpress.com)
#Дата создания 22.08.2012
#Дата изменения: 20.03.2013
#Описание: скрипт отправляет уведомление о определенном событии в Security Log в письме в человекочитаемом виде
#####################################################################################

$Subject = “Удаление учетной записи компьютера в домене”
$Theme = “Компьютер удален из домена”
$Server = “smtp.domain.ua” # SMTP Сервер
$From = “noreplay@domain.ua” # Адрес отправителя
$To = “john@domain.ua” # Получатель

$encoding = [System.Text.Encoding]::UTF8

#Собственно сам запрос поиска события. Выбирается последнее произошедшее событие с таким ID.

$Body=Get-WinEvent -FilterHashtable @{LogName=”Security”;ID=4743;StartTime=(Get-Date)..AddSeconds(-120)} | Select TimeCreated,@{n=”Оператор”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “SubjectUserName”} |%{$_.’#text’}}},@{n=”Имя компьютера”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “TargetUserName”}| %{$_.’#text’}}}

$body = $body -replace «@{» -replace «}» -replace «=», «: » -replace «;»,»`n» -replace «TimeCreated»,»Время» -replace «^»,»`n»
$BodyM = $Body

Send-MailMessage -From $From -To $To -SmtpServer $server -Body “$Theme `n$BodyM” -Subject $Subject -Encoding $encoding


#Отправка уведомлений по наступлению события 4720 — Создание учетной записи пользователя в домене
#Автор оригинального скрипта:
http://habrahabr.ru/post/147750/
#Изменения (itpadla.wordpress.com)
#Дата создания 22.08.2012
#Дата изменения: 20.03.2013
#Описание: скрипт отправляет уведомление о определенном событии в Security Log в письме в человекочитаемом виде
#####################################################################################

$Subject = “Создание учетной записи пользователя в домене”
$Theme = “Добавлен новый пользователь в домен”
$Server = “smtp.domain.ua” # SMTP Сервер
$From = “noreplay@domain.ua” # Адрес отправителя
$To = “it@domain.ua” # Получатель

$encoding = [System.Text.Encoding]::UTF8

#Собственно сам запрос поиска события. Выбирается последнее произошедшее событие с таким ID.

$Body=Get-WinEvent -FilterHashtable @{LogName=”Security”;ID=4720;StartTime=(Get-Date)..AddSeconds(-120)} | Select TimeCreated,@{n=”Оператор”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “SubjectUserName”} |%{$_.’#text’}}},@{n=”Имя пользователя”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “SamAccountName”}| %{$_.’#text’}}}

$body = $body -replace «@{» -replace «}» -replace «=», «: » -replace «;»,»`n» -replace «TimeCreated»,»Время» -replace «^»,»`n»
$BodyM = $Body

Send-MailMessage -From $From -To $To -SmtpServer $server -Body “$Theme `n$BodyM” -Subject $Subject -Encoding $encoding


#Отправка уведомлений по наступлению события 4726 — Удаление учетной записи пользователя из домена
#Автор оригинального скрипта:
http://habrahabr.ru/post/147750/
#Изменения (itpadla.wordpress.com)
#Дата создания 22.08.2012
#Дата изменения: 20.03.2013
#Описание: скрипт отправляет уведомление о определенном событии в Security Log в письме в человекочитаемом виде
#####################################################################################

$Subject = “Удаление учетной записи пользователя из домена”
$Theme = “Удален пользователь из домена”
$Server = “smtp.domain.ua” # SMTP Сервер
$From = “noreplay@domain.ua” # Адрес отправителя
$To = “it@domain.ua” # Получатель

$encoding = [System.Text.Encoding]::UTF8

#Собственно сам запрос поиска события. Выбирается последнее произошедшее событие с таким ID.

$Body=Get-WinEvent -FilterHashtable @{LogName=”Security”;ID=4726;StartTime=(Get-Date)..AddSeconds(-120)} | Select TimeCreated,@{n=”Оператор”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “SubjectUserName”} |%{$_.’#text’}}},@{n=”Имя пользователя”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “TargetUserName”}| %{$_.’#text’}}}

$body = $body -replace «@{» -replace «}» -replace «=», «: » -replace «;»,»`n» -replace «TimeCreated»,»Время» -replace «^»,»`n»
$BodyM = $Body

Send-MailMessage -From $From -To $To -SmtpServer $server -Body “$Theme `n$BodyM” -Subject $Subject -Encoding $encoding


Если у вас Windows Server 2003, то так красиво сделать не получился, т.к. ее Task Scheduler существенно хуже того, что есть сейчас. Но можно сделать по другому — сделать задачу, запускающую скрипт раз в 5 минут, а выборку в скриптах модифицировать следующим образом: отбирать события за последних 6 минут. Получится:

Get-WinEvent -FilterHashtable @{LogName=”Security”;ID=4740;StartTime=(Get-Date).AddMinutes(-6)}

Остальное — аналогично

Оставьте комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.