Оперативный контроль аккаунтов пользователей и компьютеров в 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)}

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




Управление правилами почтового ящика в Exchange Server 2010

Командлет, используемый для получения списка называется Get-InboxRule:

Get-InboxRule –Mailbox <MailboxUser>

Если вы хотите увидеть какое то определенное правило, используйте команду

Get-InboxRule –Mailbox <MailboxUser> -Identity “<Rule-Name>”

Для более удобного просмотра правил, используйте следующую конструкцию:

Get-InboxRule –Mailbox <MailboxUser> | Select Name, Description | fl

Теперь посмотрим на правило более детально с помощью командлета:

Get-InboxRule –Mailbox Anderson -Identity “Subject contains ‘Payroll’”

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

Set-InboxRule -Mailbox Anderson -Identity "Subject contains ‘Payroll’" -ApplyCategory {Red Category} -MarkImportance 2

Отключение или удаление правил

У нас также есть возможность отключать или удалять правила.  Предположим что наш руководитель опять изменил свое мнение (бывает у них такое, что поделать) и теперь он не хочет что с сообщениями содержащими слово Payroll просходили какие-либо изменения. Мы можем выполнить это просто отключив правило с помощью следующего командлета:

Disable-InboxRule -Mailbox Anderson -Identity "Subject contains ‘Payroll’"

Если вы хотите полностью удалить правило, процесс очень похож, отличает лишь командлет. Используйте:

Remove-Inboxrule –Mailbox <MailboxName> -Identity “<Inbox Rule name>”



Exchange 2010 Импорт/Экспорт почтовых ящиков

Импорт/экспорт почтовых ящиков в Exchange 2010 SP1

 

Экспорт почты в PST файл
New-MailboxExportRequest –Mailbox “sotrudnik@office.local” –Filepath “\\mail\F$\archive_pst\sotrudnik.pst”

Статус запроса
Get-MailboxExportRequest –Mailbox “sotrudnik@office.local"

Импорт PST файла
New-MailboxImportRequest -Mailbox sotrudnik -FilePath “\\mail\F$\archive_pst\sotrudnik.pst”

Статус запроса
Get-MailboxImportRequest -Mailbox sotrudnik

В некоторых случаях вы можете решить импортировать PST в подпапку почтового ящика. Для этого необходимо использовать параметр -TargetRootFolder.
New-MailboxImportRequest -FilePath “\\mail\F$\archive_pst\sotrudnik.pst” -Mailbox othersotrudnik -TargetRootFolder "Mailbox - SOTRUDNIK"

Вы можете посмотреть статус запроса импортирования с помощью командлета Get-MailboxImportRequest.

Перенаправив результат командлета Get-MailboxImportRequest в командлет Get-MailboxImportRequestStatistics вы можете просматривать прогресс выполнения запроса.
Get-MailboxImportRequest | Get-MailboxImportRequestStatistics

Когда запрос на импорт завершает работу он по прежнему остается на сервере до тех пор, пока администратор не удалит его с помощью командлета Remove-MailboxImportRequest.

Для просмотра всех завершенных запросов выполните следующую команду:
Get-MailboxImportRequest | where {$_.status -eq "Completed"}

Удалить все завершенные запросы можно следующей командой:
Get-MailboxImportRequest | where {$_.status -eq "Completed"} | Remove-MailboxImportRequest




Получение алиасов электронной почты по заданным критериям

http://www.sourica.ru/page/poluchenie-aliasov-elektronnoj-pochty-po-zadannym-kriterijam

Продолжаем писать полезные и не очень скрипты для получения данных с AD. Сейчас задача следующая.

  • Есть домен child1.example.com c почтовыми адресами на Exchange вида: @child1.com
  • Есть домен child2.example.com c почтовыми адресами на Exchange вида: @child2.com
  • У некоторых пользователей домена child2.example.com в качестве дополнительного адреса электронной почты присутствуют адреса @child1.com
  • Для определенных целей необходимо получить данные адреса.

Приступим к реализации. Как и раньше будем использовать ActiveRoles Management Shell от Quest Software. Для начала разберемся в терминах:

  • Primarysmtpaddress – адрес, используемый по умолчанию для отправки сообщений через Exchange. Он может быть только один.
  • ProxyAddresses – дополнительные адреса электронной почты, которых может быть МНОГО.

Наша задача получить список ProxyAddresses адресов @child1.com у пользователей домена child2.

Для этого используем такую конструкцию:

Gt-QADUser -SearchRoot 'dc=child2,dc=example,dc=com' -SizeLimit 0 -IncludedProperties ProxyAddresses | where {$_.ProxyAddresses -match 'child1.com'} | Select-Object @{n='CHILD1';e={$_.ProxyAddresses -match 'child1.com'}}

Разберем немного подробнее:

Get-QADUser -SearchRoot ‘dc=child2,dc=example,dc=com’ -SizeLimit 0 -IncludedProperties ProxyAddresses

  • Get-QADUser – получаем список пользователей
  • -SearchRoot ‘dc=child2,dc=example,dc=com’  — указываем нужный нам домен в качестве корня поиска пользователей
  • -SizeLimit 0  — ЕМПНИМ ограничение вывода 1000 пользователей. Убираем данный лимит если у нас очень много пользователей.
  • -IncludedProperties ProxyAddresses   —  по умолчанию в результирующий набор получаемых данных включаются не все доступные атрибуты пользователя. В частности ProxyAddresses  необходимо включать явным образом.
where {$_.ProxyAddresses -match 'child1.com'}

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

Select-Object @{n='CHILD1';e={$_.ProxyAddresses -match 'child1.com'}}

Также в конвейере получает отфильтрованный список пользователей и выводит только нужное по условиям задачи поле.

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