PowerShell LogoПериодически приходится писать крипты, автоматизирующие те или иные действия администратора. Иногда это бывает обычный сбор информации. Иногда это внесение изменений в конфигурацию/учётные записи, связанные с наступлением тех или иных событий. Тонкость возникает там, где необходимо работать с объектами Exchange. обычно, для этого достаточно в скрипте импортировать оснастку PS Microsoft.Exchange.Management.PowerShell.E2010 (Excahnge 2010):

Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010

Однако, в случае, когда нам в скрипте необходимо использовать командлет Get-MailboxStatistics получаем следующую ошибку:

PS C:> Get-Mailbox user | Get-MailboxStatistics
Get-MailboxStatistics : Failed to commit the change on object "MB-DATABASE" because access is denied.
At line:1 char:45
+ Get-Mailbox buldakov | Get-MailboxStatistics <<<<
+ CategoryInfo          : NotSpecified: (0:Int32) [Get-MailboxStatistics], MapiAccessDeniedException
+ FullyQualifiedErrorId : 46BEBAF0,Microsoft.Exchange.Management.MapiTasks.GetMailboxStatistics

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

PS C:>Get-ManagementRoleEntry "*Get-MailboxStatistics" | ? {$_.Role -like "Mail  Recipients"} | fl Name,Role
Name : Get-MailboxStatistics
Role : Mail Recipients

PS C:>Get-ManagementRoleAssignment -Role "Mail Recipients" -GetEffectiveUsers | ? {$_.EffectiveUserName -like "svc_Name"} | fl Role,EffectiveUserName
Role              : Mail Recipients
EffectiveUserName : svc_Name

Нашёлся следующий workaround. Для подключения к Exchange используем стандартный скрипт RemoteExchange.ps1:

. 'C:Program FilesMicrosoftExchange ServerV14binRemoteExchange.ps1'
Connect-ExchangeServer -auto

Точку с пробелом в начале ставить обязательно.