Выгрузка данных для аудита почтовых ящиков

Задача — выгрузить список общих (с которыми работают несколько пользователей) ящиков Exchange 2010 с:

  • почтовыми адресами,
  • списком тех, у кого есть полный доступ на ящик,
  • менеджером,
  • размером ящика

Итоговый вывод примерно следующий будет:

"MailboxName1":"Email1":"FAUser1;FAUser2;":"Manager1":"MBSize1" "MailboxName2":"Email2":"FAUser3;FAUser4;":"Manager2":"MBSize2" ....

Первые два столбца получаются через

Get-Mailbox -Database "Database" -ResultSize unlimited | Select DisplayName, PrimarySmtpAddress

Мы предполагаем, что общие ящики находятся в одной базе, и кроме них в этой базе других ящиков (пользовательских) нет. Список пользователей, имеющих права доступа мы можем получить, используя командлет Get-MailboxPermission. Причём, нас интересуют только пользователи, которым Full Access дан непосредственно на сам общий ящик, а не на объект, находящийся выше по иерархии (то есть отфильтровываем наследуемые записи для которых параметр IsInherited принимает значение $true). Заодним убираем объект NT AUTHORITY\SELF.

$tmpUsersPermissions = Get-Mailbox $_ | Get-MailboxPermission | ?{($_.IsInherited -eq $false) -and ($_.user -notlike "NT AUTHORITY\SELF")} | Select User

Далее массив получённых учётных записей надо «склеить»:

$UserPermissionString = ""; foreach ($UserPermission in $tmpUsersPermissions) {      $UserPermissionString = $UserPermissionString + $UserPermission.User + "; "}

В итоге, в переменной $UserPermissionString окажется требуемый список пользователей с правами Full Access на ящик.

Следующий, интересующий нас объект — менеджер ящика (на самом деле, учётной записи, к которой прикреплён ящик). Так как сам почтовый ящик уже помещён в переменную $_, то можно её использовать для того, чтобы вытащить через Get-User из параметра Manager учётную запись менеджера почтового ящика

(Get-User $_).Manager.Name

Аналогично, через Get-MailboxStatistics и переменную $_ получаем размер ящика. Для уменьшения количества цифр конвертируем его в мегабайты

($_ | Get-MailboxStatistics).TotalItemSize.Value.ToMB()

Теперь осталось всё собрать в одну строку и вывести в csv-файл. В итоге получается примерно следующая конструкция

Get-Mailbox -Database "Database" -ResultSize unlimited | Select DisplayName, PrimarySmtpAddress, @{Name="FullAccess";expression={ $tmpUsersPermissions = Get-Mailbox $_ | Get-MailboxPermission | ?{($_.IsInherited -eq $false) -and ($_.user -notlike "NT AUTHORITY\SELF")} | Select User; $UserPermissionString = ""; foreach ($UserPermission in $tmpUsersPermissions) {      $UserPermissionString = $UserPermissionString + $UserPermission.User + "; "}; $UserPermissionString;}}, @{Name="Manager";expression={(Get-User $_).Manager.Name}}, @{Name="MailboxSize";expression={ ($_ | Get-MailboxStatistics).TotalItemSize.Value.ToMB()}} | Export-Csv c:\Temp\mailboxes.txt -Delimiter :

В качестве разделителя использую «:», так как стандартный разделитель «,» может встречаться в имени почтового ящика. Это может сильно испортить процесс дальнейшей обработки выходных данных.

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