Отчет об активности пользователей Exchange.
У некоторых администраторов и их руководителей иногда возникают грустные мысли. У администратора: “А нужна вообще моя работа, может никто и не пользуется этой несчастной почтой…”, у руководителя: “А нужна ли нам вообще электронная почта? Может ей и не пользуется никто… Может все-таки уволить Ваську нафиг?” И как же получить быстрый ответ на эти вопросы? Я предлагаю самый скромный вариант.
Так как это бюджетный вариант – мы поступим примитивно – проверим время последнего доступа в ящик. Для этого мы можем использовать вывод командлета Get-MailboxStatistics, а именно нас интересует LastLogonTime. Да-да, это опять PowerShell, а как же?
Итак, нас интересуют не все значения LastLogonTime, а только лишь, например, за последний месяц. Для этого мы используем оператор Where, в котором отберем только удовлетворяющие условиям значения.
Для начала нам нужно получить текущую дату, и загнать ее в переменную (я тупой повершелловец, может можно и по другому, но у меня не получилось):
$t = Get-Date
Теперь проверим:
[PS] C:\Windows\System32>$t
28 августа 2009 г. 12:28:06
Оно! То, что нужно.
Дальше нам нужно “убавить” дату на 30 дней. Это мы сделаем при помощи .addDays(-30). Например так
[PS] C:\Windows\System32>$t.addDays(-30)
29 июля 2009 г. 12:28:06
Отлично!
Далее получаем статистику ящиков и берем из вывода только DisplayName и LastLogonTime.
[PS] C:\Windows\System32>Get-MailboxStatistics | Select DisplayName, LastLogonTime
DisplayName LastLogonTime
———– ————-
Ольга Ракчеева 28.08.2009 8:55:31
Михаил Буслаев 28.08.2009 15:02:06
Вячеслав Селихов 28.08.2009 9:54:14
Роман Баловнев 07.08.2009 17:11:23
Олег Крылов 28.08.2009 14:05:50
Глеб Якунин 28.08.2009 13:15:07
Борис Анипченко 28.08.2009 10:59:49
Нонна Мочарашвили 28.08.2009 14:03:07
Алексей Ляс 28.08.2009 15:05:09
Александр Новиков 28.08.2009 15:35:41
Олеся Зиновьева 26.08.2009 9:10:44
Сергей Прокофьев 28.08.2009 15:02:50
Артём Синицын 28.08.2009 15:46:28
Анна Соболь 27.08.2009 9:38:19
Александр Голанов 19.08.2009 11:40:40
Александр Кутненко 28.08.2009 9:43:54
Антон Еремеев 22.06.2009 17:04:15
Александр Семенов 21.08.2009 0:37:32
Вадим Куринский 28.08.2009 15:26:53
Елена Дельцова 28.08.2009 12:35:24
Олег Крылов 29.07.2009 13:49:27
IVRAdmin 22.06.2009 14:51:41
Ольга Ильясова 28.08.2009 15:18:20
Александр Ефимов 28.08.2009 12:37:54
Людмила Полякова 28.08.2009 9:30:30
Сергей Филин 28.08.2009 14:58:27
Дарья Дударева 28.08.2009 12:24:03
Татьяна Швалева 28.08.2009 9:34:44
SystemMailbox{9452849A-87D4-454F-BAD… 26.08.2009 23:55:40
Степан Голосунов 28.08.2009 15:51:56
Илгиз Мамышев 28.08.2009 11:04:15
Денис Дягилев 26.08.2009 15:49:32
Надежда Бусыгина 28.08.2009 15:50:21
Мы получили вывод ВСЕХ ящиков, в том числе и системных. Нам этого не надо.
Фильтруем по LastLogonTime:
Get-MailboxStatistics | Select DisplayName, LastLogonTime | Where { $_.LastlogonTime -ge ($($t.addDays(-30)))}
Вывод очень даже ничего. Но присутствуют ящики вида SystemMailbox{GUID} и Microsoft System Attendant. Мы и так знаем, что это самые постоянные пользователи почты, поэтому о них нам сведения не нужны. Фильтруем:
Get-MailboxStatistics | Select DisplayName, LastLogonTime | Where { $_.LastlogonTime -ge ($($t.addDays(-30)))} | Where { $_.DisplayName -notmatch "System*"}
Отлично. То что надо. Вот в принципе и отчет. Но делать его каждый день лениво, надо бы сунуть его в шедулер и получать на почту. Для отправки нам неплохо бы сконвертировать вывод в HTML. Для этого используем ConvertTo-HTML, без аргументов. И итоговый вид получения отчета будет такой:
Get-MailboxStatistics | Select DisplayName, LastLogonTime | Where { $_.LastlogonTime -ge ($($t.addDays(-30)))} | Where { $_.DisplayName
-notmatch "System*"} | ConvertTo-HTML
Теперь отправка в почту. К сожалению PowerShell v 1.0 не умеет отправлять почту сам. Надо научить
Самый великий учитель PoSH’a у нас кто? Правильно, Вася
Стучим к Васе в мессенджер. Вася дает ссылку на свой блог. Забираем его скрипт. Сохраняем в папке C:\Program Files\Microsoft\Exchange\Scripts под именем Send-SMTPMessage.ps1.
!!! Сразу оговорюсь об одной очень важной вещи:
Если использовать Васин скрипт без изменений, получим в случае простого вывода пустое письмо, в случае вывода в HTML – письмо с HTML-кодом. Т.е. со всеми тэгами и абсолютно нечитабельное. Поэтому правим Васин скрипт. Добавляем свойство сообщения $Message.IsBodyHtml = $true. Сразу после комментария “Устанавливаем свойства объектов”.
В качестве аргумента оператора –body – подставим наш отчет в виде HTML. Для этого загоним его в переменную $report
$report = Get-MailboxStatistics | Select DisplayName, LastLogonTime | Where { $_.LastlogonTime -ge ($($t.addDays(-30)))} | Where { $_.DisplayName -notmatch "System*"} | ConvertTo-HTML
И запускаем Васин скрипт, подставляя необходимые параметры (которые тоже можно определить в виде переменных, но я не стал заморачиваться)
Send-SMTPMail -Server wz-exch1.ad.webzavod.ru -From "Oleg Kryov<krylov@webzavod.ru>" -To krylov@webzavod.ru -Subject "Отчет об использовании системы" -body "$report"
Получаем письмо:
То, что должно быть. Ура!
Сохраняем наш скрипт в файл (я не знаю, как правильно форматировать скрипты в красивый набор строчек, поэтому я сделал три строчки в блокноте. В конце каждой строчки нажал Enter)
$t = Get-Date [Enter]
$report = Get-MailboxStatistics | Select DisplayName, LastLogonTime | Where { $_.LastlogonTime -ge ($($t.addDays(-30)))} | Where { $_.DisplayName -notmatch "System*"} | ConvertTo-HTML [Enter]
Send-SMTPMail -Server wz-exch1.ad.webzavod.ru -From "Oleg Kryov<krylov@webzavod.ru>" -To krylov@webzavod.ru -Subject "Отчет об использовании системы" -body "$report"
Вот и все. Сохраняем в виде файла в папке C:\Program Files\Microsoft\Exchange\Scripts под именем Send-UsageReport.ps1. И вешаем его в качестве задания шедулеру.
P.S. Возможно это все слишком по детски. Я потратил на это каких-то 4 часа. Можно добавить оператор Count для подсчета общего количества объектов, можно исключить различные предупреждения, которые появляются при попытке получить данные о ящиках, в которые не было ни одного логона (-WarningAction SilentlyContinue), можно, можно, можно… Буду рад критике и замечаниям, впрочем как и всегда
P.P.S. Васька, над увольнением которого раздумывает наш гипотетический руководитель и Вася – абсолютно разные люди. Любые совпадения случайны.
Олег, у тебя ошибка в регулярном выражении
PS C:\Users\Xaegr> «Usystemeev» -match «System*»
True
Такое выражение означает примерно следующее:
Встречающаяся в любом месте строки последовательность («Syste» и 0 или более символов «s»)
Тебе же нужно либо:
Where { $_.DisplayName -notmatch «^System»}
либо использовать простые символы подстановки (кстати будет производительнее):
Where { $_.DisplayName -notlike «System*»}
Хотя конечно работать будет и так, это я придираюсь =)
Да, но для большого количества объектов – производительность критична. Спасибо Вась, попробую с -notlike
Олег, ну и кто же после этого купит MAPILabReports? =)
По теме: очень хорошо.
Очень полезная статья. Надо будет скрипт маленько под себя расширить и автоматизировать и будет просто супер. Олег, как всегда, на высоте