Периодически приходится писать крипты, автоматизирующие те или иные действия администратора. Иногда это бывает обычный сбор информации. Иногда это внесение изменений в конфигурацию/учётные записи, связанные с наступлением тех или иных событий. Тонкость возникает там, где необходимо работать с объектами 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
Точку с пробелом в начале ставить обязательно.