Заметки IT Менеджера

12.03.2013

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


Обновлено 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)}

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

Реклама

27 комментариев »

  1. Круто!
    Но если администраторов 2 и более было бы не плохо видеть в отчетах кто создал/добавил того или иного юзера/ПК!

    комментарий от odarchuk — 12.03.2013 @ 11:50 | Ответить

    • Вы скрипт пробовали? Там есть поле оператор — это и есть тот, кто внес изменения. :-)

      комментарий от itpadla — 12.03.2013 @ 11:58 | Ответить

      • Точно :)
        Недосмотрел! еще вопрос — если КД несколько — нужно на каждом запускать или достаточно на одном?

        комментарий от odarchuk — 12.03.2013 @ 12:07

      • Если домен один — по идее, на одном достаточно. По крайней мере на эмуляторе PDC.

        комментарий от itpadla — 12.03.2013 @ 12:10

  2. PS D:\PowerShell> D:\PowerShell\ADD_pc_to_AD-2.ps1
    Get-WinEvent: Could not retrieve information about the Security log. Error: Attempted to perform an unauthorized operation…
    At D:\PowerShell\ADD_pc_to_AD-2.ps1:13 char:19
    + $Body=Get-WinEvent <<<< -FilterHashtable @{LogName=”Security”;ID=4743} | Select TimeCreated,@{n=”Оператор”;e={([xml]$_.ToXml()).Event.EventData.Data |? {$_.Name -eq “Subject
    UserName”} |%{$_.’#text’}}},@{n=”Имя компьютера”;e={([xml]$_.ToXml()).Event.EventData.Data |? {$_.Name -eq “SamAccountName”}| %{$_.’#text’}}} | select-object -first 1
    + CategoryInfo: NotSpecified: (:) [Get-WinEvent], Exception
    + FullyQualifiedErrorId: LogInfoUnavailable,Microsoft.PowerShell.Commands.GetWinEventCommand

    Get-WinEvent: There is not an event log on the localhost computer that matches «Security».
    At D:\PowerShell\ADD_pc_to_AD-2.ps1:13 char:19
    + $Body=Get-WinEvent <<<< -FilterHashtable @{LogName=”Security”;ID=4743} | Select TimeCreated,@{n=”Оператор”;e={([xml]$_.ToXml()).Event.EventData.Data |? {$_.Name -eq “Subject
    UserName”} |%{$_.’#text’}}},@{n=”Имя компьютера”;e={([xml]$_.ToXml()).Event.EventData.Data |? {$_.Name -eq “SamAccountName”}| %{$_.’#text’}}} | select-object -first 1
    + CategoryInfo: ObjectNotFound: (Security:String) [Get-WinEvent], Exception
    + FullyQualifiedErrorId: NoMatchingLogsFound,Microsoft.PowerShell.Commands.GetWinEventCommand

    Get-WinEvent: The parameter is incorrect
    At D:\PowerShell\ADD_pc_to_AD-2.ps1:13 char:19
    + $Body=Get-WinEvent <<<< -FilterHashtable @{LogName=”Security”;ID=4743} | Select TimeCreated,@{n=”Оператор”;e={([xml]$_.ToXml()).Event.EventData.Data |? {$_.Name -eq “Subject
    UserName”} |%{$_.’#text’}}},@{n=”Имя компьютера”;e={([xml]$_.ToXml()).Event.EventData.Data |? {$_.Name -eq “SamAccountName”}| %{$_.’#text’}}} | select-object -first 1
    + CategoryInfo: NotSpecified: (:) [Get-WinEvent], EventLogException
    + FullyQualifiedErrorId: System.Diagnostics.Eventing.Reader.EventLogException,Microsoft.PowerShell.Commands.GetWinEventCommand

    ЧЯДНТ?

    комментарий от odarchuk — 12.03.2013 @ 16:51 | Ответить

    • Get-WinEvent: Could not retrieve information about the Security log. Error: Attempted to perform an unauthorized operation
      There is not an event log on the localhost computer that matches «Security».

      Вот там и копать. Опять же, смотреть какой powershell установлен, какая версия сервера, какие права и т.д.

      Начать с простой операции, типа Get-WinEvent -FilterHashtable @{LogName=”Security”;ID=4726}

      Посмотреть глазами, а есть ли такие события в принципе. Опять же, может быть винда русская и там лог по другому назван.

      комментарий от itpadla — 12.03.2013 @ 16:55 | Ответить

      • если запускать скрипт не с отладчика то все ОК … кроме того что имя ПК указывается в виде «System.Object[]» :(

        комментарий от odarchuk — 12.03.2013 @ 17:00

      • Если под отладчиком имеется в виду ISE, то и его нужно в админ режиме запускать.

        комментарий от itpadla — 12.03.2013 @ 17:09

      • Все таки. Posh какой? Отладчик — какой? Винда на сервере какая? Скрипт на сервере пускается? Для проверки получения событий можно и с локальной машины пускать, просто использовать Get-WinEvent -ComputerName

        комментарий от itpadla — 13.03.2013 @ 08:56

  3. Помогите, пожалуйста, откорректировать скрипт под Windows 2003 Server.
    заменил в нем запрос на:
    $Body=$Event=Get-EventLog -LogName Security -InstanceId 644 -ErrorAction SilentlyContinue -Before (Get-Date).date -After (Get-Date).AddMinutes(-6)
    поскольку в Windows 2003 нет Get-WinEvent и нет событий с кодом 4740.
    Однако, теперь обнаружились недостатки:
    1. Письма приходят КАЖДЫЙ раз при запуске скрипта вне зависимости от новых блокировок аккаунтов. Это и понятно — в отличие от 2008 и поздних ОС, скрипт запускается не по триггеру события, а по времени. Поэтому для 2003 необходимо сделать какое-то условие для отправки письма, например, если событие 644 найдено в журнале, то отправлять…
    2. Само тело письма абсолютно не информативно. Если закомментировать строку $body = $body -replace…, то получим, похоже, только заголовки полей:
    Только что был заблокирован аккаунт
    System.Diagnostics.EventLogEntry System.Diagnostics.EventLogEntry
    Видимо, в 2003 надо как-то по-другому запрос сформулировать… но как?????

    комментарий от unclefather — 11.10.2013 @ 06:08 | Ответить

    • Ну тогда где-то так:

      $Body=Get-EventLog -LogName Security -InstanceId 4740 -ErrorAction SilentlyContinue -Before (Get-Date).date -After (Get-Date).AddMinutes(-6)
      If ($Body.Count -ge 0)
      {
      $Body = $Body | Select TimeGenerated, @{n=»Аккаунт»;e={($_.Message -split «`n» | Select-String «Account Name:»)[1]}},@{n=»Имя компьютера»;e={($_.Message -split «`n» | Select-String «Caller Computer Name:»)[0]}}
      $body = $Body -replace «@{» -replace «}» -replace «=», «: » -replace «;»,»`n» -replace «TimeGenerated»,»Время события» -replace «^»,»`n» -replace «Account Name:»,»» -replace «Caller Computer Name:»,»» -replace «`t»,»»
      Send-MailMessage -From $From -To $To -SmtpServer $server -Body “$Theme `n$Body” -Subject $Subject -Encoding $encoding
      }

      У меня нет 2003 DC c событиями 644, потому не на чем тренироваться :-( Нужен тест, для примера

      комментарий от itpadla — 11.10.2013 @ 12:38 | Ответить

      • Короче, концепция поменялась))) нашел у себя же на форуме http://manaeff.ru/forum/viewtopic.php?p=1195#p1195
        оказывается, в в стандартной поставке операционной системы Windows XP/2003 есть консольная утилита eventtriggers, которая позволяет создавать триггеры. Поэтому для 2003 можно просто создать триггер:
        eventtriggers /create /TR «Lock Account» /TK «C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe c:\Soft\Bat\LckAccount.ps1» /L Security /EID 644
        который будет запускать скрипт power shell.
        Спасибо за помощь, применил Ваш запрос и практика показала, что в Вашем запросе [1] и [0] лишние. С ними результат запроса приходит пустой.
        Позволил себе слегка адаптировать скрипт под MS Windows 2003 Rus и вписать себя в заголовок:

        #Отправка уведомлений по наступлению события 644 – блокирование учетной записи пользователя
        #Автор оригинального скрипта: http://habrahabr.ru/post/147750/
        #Изменения (itpadla.wordpress.com)
        #Дата создания 22.08.2012
        #Дата изменения: 20.03.2013
        #Описание: скрипт отправляет уведомление о определенном событии в Security Log в письме в человекочитаемом виде
        #Скрипт адаптирован под MS Windows 2003 Server Rus: http://manaeff.ru/forum
        #Для создания триггера на сервере запускаем:
        #eventtriggers /create /TR «Lock Account» /TK «C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe c:\Soft\Bat\LckAccount.ps1″ /L Security /EID 644
        #####################################################################################
        $Subject = “Заблокирован аккаунт»
        $Theme = “Только что был заблокирован аккаунт”
        $Server = “smtp.domain.ua”
        $From = “noreplay@domain.ua”
        $To = “it@domain.ua”
        $encoding = [System.Text.Encoding]::UTF8

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

        $Body=Get-EventLog -Newest 1 -LogName Security -InstanceId 644 -ErrorAction SilentlyContinue

        $Body = $Body | Select TimeGenerated, @{n=”Аккаунт”;e={ $_.Message -split “`n” | Select-String “Имя конечной учетной записи:”}} ,@{n=”Имя компьютера”;e={ $_.Message -split “`n” | Select-String “Имя вызывающего компьютера:”}}
        $body = $Body -replace “@{” -replace “}” -replace “=”, “: ” -replace “;”,”`n” -replace “TimeGenerated”,”Время события” -replace “^”,”`n” -replace “Имя конечной учетной записи:”,”» -replace “Имя вызывающего компьютера:”,”» -replace “`t”,”»
        Send-MailMessage -From $From -To $To -SmtpServer $server -Body “$Theme $Body” -Subject $Subject -Encoding $encoding

        PS. Посоветуйте, пожалуйста, что почитать начинающему в PowerShell. А то пол-дня тыкался с Вашим запросом, не зная с чего начать))

        комментарий от unclefather — 14.10.2013 @ 10:32

      • >Спасибо за помощь, применил Ваш запрос и практика показала, что в Вашем запросе [1] и [0] лишние
        Странно, у меня как раз наоборот было :-) Дело в том, что в событии фраза «Account Name:» встречается два раза, причем первый — не при чем. Ну а [0] — на всякий случай, чтобы в выборке гарантированно было одно значение для каждого сообщения.
        Но все дело в том, что у меня нет «правильных» событий 2003 сервера, так что вам виднее. С вашего разрешения, я добавлю это в обновленную версию заметки.

        комментарий от itpadla — 14.10.2013 @ 11:05

      • >Странно, у меня как раз наоборот было :-) Дело в том, что в событии фраза “Account Name:” встречается два раза, причем первый – не при чем

        У меня же сервак русский. Там вообще «Account Name» не встречается)))

        комментарий от unclefather — 14.10.2013 @ 11:18

      • Что касается
        >PS. Посоветуйте, пожалуйста, что почитать начинающему в PowerShell. А то пол-дня тыкался с Вашим запросом, не зная с чего начать))
        То сильно грамотных советов дать не смогу и сам считаю себя начинающим в этом деле, но, по моему мнению, стоит ознакомиться с:

        М10961 Автоматизация администрирования с Windows PowerShell 3.0. Automating Administration with Windows PowerShell 3.0 (http://nt.com.ua/education/microsoft/Pages/M10961.aspx)

        Книги:
        Введение в Windows PowerShell — Попов Андрей http://www.bookzone.com.ua/Netshop/catalogue/catalogue_27529.html
        Windows PowerShell 2.0. Справочник администратора — Уильям Р. Станек http://www.bookzone.com.ua/Netshop/catalogue/catalogue_29823.html

        Есть еще вагончик в электронном виде

        http://www.windowsfaq.ru/content/view/707/94/
        http://itband.ru/2011/10/powershell-resources/
        http://social.technet.microsoft.com/wiki/contents/articles/4307.powershell-for-beginners.aspx
        http://ramblingcookiemonster.wordpress.com/2012/11/17/powershell-resources/
        http://mcpmag.com/Articles/List/Prof-Powershell.aspx
        http://social.technet.microsoft.com/wiki/contents/articles/183.windows-powershell-survival-guide.aspx
        http://msdn.microsoft.com/ru-ru/library/cc281945(v=sql.105).aspx
        http://xaegr.wordpress.com/poshlinks/
        http://ru.wordpress.com/tag/powershell/

        http://xaegr.wordpress.com/category/scripting/powershell/ — очень рекомендую почитать

        http://dmitrysotnikov.wordpress.com/2007/03/15/scratching-your-itch/

        http://social.technet.microsoft.com/wiki/contents/articles/4308.popular-powershell-modules.aspx
        http://poshcode.org/

        http://social.technet.microsoft.com/wiki/ru-ru/contents/articles/16582.powershell-ru-ru.aspx

        комментарий от itpadla — 14.10.2013 @ 11:24

  4. Скрипт вызывается при генерации события с id 4740 и потом ищет в логе последнее событие с этим id . Теоретически может возникнуть ситуация, когда в логе за это время появится еще одно событие 4740, тогда наш скрипт обработает его, а не то событие по которому он был вызван.
    В общем возник вопрос, а при вызове таска по event триггеру нельзя ли передать скрипту в качестве параметра атрибуты выызвавшего его события?
    Это было бы надежнее

    комментарий от Mike — 04.02.2014 @ 08:15 | Ответить

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

      комментарий от itpadla — 04.02.2014 @ 09:20 | Ответить

    • Ситуация, когда во время скрипта возникает еще одно событие 4740 интересна вот чем еще:
      допустим, во время выполнения скрипта возникает еще одно событие 4740. При этом старый скрипт продолжает выполняться, а новый не запускается (до тех пор, пока старый не выполнится). Более того, может быть и так, что старый скрипт все еще выполняется а событие 4740 возникает еще пару-тройку раз.
      Поэтому, в приведенной выше версии скрипта в письме мы получим данные о последнем (на момент выполнения запроса) событии, а если каким-то образом модифицировать скрипт, чтобы он получал атрибуты вызвавшего его события, то в письме мы получим данные о том событии, которое вызвало выполнение скрипта.
      В связи с чем, может быть нужно делать выборку событий 4740 из журнала до тех пор, пока не встретится разблокированная учетная запись? Но как это сделать?
      Может быть можно лучше пойти другим путем — сделать задержку выполнения скрипта на пару минту, потом запросить последнее событие 4740 из журнала безопасности, а потом, до кучи, запросить AD на предмет заблокированных учеток — и результат уже отправлять письмом.
      Только как это реализовать на практике — я не знаю(((

      комментарий от unclefather — 04.02.2014 @ 10:41 | Ответить

      • Это все — «сферический конь в вакууме» :-)

        Гораздо проще вам добавить в скрипт пару переменных и посчитать время его выполнения, и время выполнения выборки и если они больше чем сколько-то выводить алерт или еще что-то, например перечитывать заново.

        комментарий от itpadla — 04.02.2014 @ 11:42

      • все же я модифицировал скрипт для win 2003:
        #Отправка уведомлений по наступлению события 4740 – блокирование учетной записи пользователя
        #Автор оригинального скрипта: http://habrahabr.ru/post/147750/
        #Изменения (itpadla.wordpress.com)
        #Дата создания 22.08.2012
        #Дата изменения: 20.03.2013
        #Описание: скрипт отправляет уведомление о определенном событии в Security Log в письме в человекочитаемом виде
        #Скрипт адаптирован под MS Windows 2003 Server Rus: http://manaeff.ru/forum
        #Для создания триггера на сервере запускаем:
        #eventtriggers /create /TR «Lock Account» /TK «C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe c:\Soft\Bat\LckAccount.ps1″ /L Security /EID 644
        #####################################################################################
        $Subject = “Заблокирован аккаунт»
        $Theme = “Только что был заблокирован аккаунт”
        $Theme1 = «Прочие заблокированные аккаунты:»
        $Server = “smtp.domain.ua”
        $From = “noreplay@domain.ua”
        $To = “it@domain.ua”
        $encoding = [System.Text.Encoding]::UTF8

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

        $Body=Get-EventLog -Newest 1 -LogName Security -InstanceId 644 -ErrorAction SilentlyContinue

        $Body = $Body | Select TimeGenerated, @{n=”Аккаунт”;e={ $_.Message -split “`n” | Select-String “Имя конечной учетной записи:”}} ,@{n=”Имя компьютера”;e={ $_.Message -split “`n” | Select-String “Имя вызывающего компьютера:”}}
        $Body = $Body -replace “@{” -replace “}” -replace “=”, “: ” -replace “;”,”`n” -replace “TimeGenerated”,”Время события” -replace “^”,”`n” -replace “Имя конечной учетной записи:”,”» -replace “Имя вызывающего компьютера:”,”» -replace “`t”,”»
        add-pssnapin «Quest.ActiveRoles.ADManagement»
        $Body1 = Get-QADUser -locked
        $Body1 = $Body1 -replace “;”,”`n” -replace “^”,”`n”
        Send-MailMessage -From $From -To $To -SmtpServer $server -Body “$Theme $Body $Theme1 $Body1” -Subject $Subject -Encoding $encoding

        Только для него понадобится еще ActiveRoles Management Shell for Active Directory (http://www.quest.com/powershell/activeroles-server.aspx)

        комментарий от unclefather — 04.02.2014 @ 13:52

  5. Я попробовал прикрутить скрипт к win2003 r2, но там PS ругается на параметр InstanceId. Я так и не понял, что надо поменять, чтобы он появился: то ли .NET не тот, то ли PS, то ли ещё что то.

    комментарий от Макс Бакуленко — 14.11.2014 @ 10:11 | Ответить

    • Мне вам сложно помочь, т.к. у меня нет в досягаемости серверов с 2003 сервером. Посмотрите на версию PoSh или глубже разберитесь с конкретной ошибкой

      комментарий от itpadla — 14.11.2014 @ 10:48 | Ответить

      • Да, собственно, вопрос больше в том, где именно зарыто это свойство «InstanceId». Нутром чую, что в дотнете, но вдруг в powershell?
        У меня под рукой есть 2008 r2, в нём help это свойство показывает как часть Get-Eventlog’a. В 2003-ем не показывает. Версии PS при этом показываются 1.0. Всё идёт к тому, что дело в .NET. Но меня сбивает с толку адаптация скрипта в комменте выше «все же я модифицировал скрипт для win 2003». Вроде .NET 4.5 на 2003 не поднимается, неужели дело в версии PS?

        комментарий от Макс Бакуленко — 14.11.2014 @ 11:43

      • У меня, насколько я помню, там стоял PoSh не ниже второго. Просто с тех пор я поменял работу и парк серверов :-)

        комментарий от itpadla — 14.11.2014 @ 11:50

    • Дело было в версии PoSh. Накатил вторую — и всё заработало. Здорово, что вы помните версию, на которой всё это дело работало. Спасибо, а то я уже начал угрожать кулаками монитору от бессилия и злобы. :)

      комментарий от Макс Бакуленко — 16.11.2014 @ 07:21 | Ответить


RSS feed for comments on this post. TrackBack URI

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

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

Логотип WordPress.com

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

Фотография Twitter

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

Фотография Facebook

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

Google+ photo

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

Connecting to %s

Создайте бесплатный сайт или блог на WordPress.com.

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