e2010Как я написал в предыдущей заметке, для решения проблемы с невозможностью выдачи права Send-As необходимо менять владельца объекта общей папки в Active Directory. Эта задача скучная и нудная, особенно, если у нас имеется несколько сотен/тысяч таких объектов. Нам в её решении поможет PowerShell. Для начала, имеет смысл выгрузить существующих владельцев:

Set-Location ad:
Get-ADObject -LDAPFilter "(ObjectClass=publicFolder)" -SearchBase 'CN=Microsoft Exchange System Objects,DC=o365lab,DC=pro' |
select Name, DistinguishedName, @{Name="Owner";expression={(Get-Acl "$_").Owner}} |
Export-Csv -Delimiter ";" -Path c:tmppfOwners.txt -Encoding UTF8

Теперь приступаем к написанию скрипта, который всех этих владельцев будет исправлять. Командлет Get-Acl имеет метод SetOwner(), который может помочь поменять владельца объекта. Правда, для замены нам понадобится использовать командлет Set-Acl, чтобы это изменение применить к объекту. Подробнее процедура расписана здесь. В нашем случае процедура замены будет выглядеть примерно следующим образом:

$NewOwner = New-Object System.Security.Principal.NTAccount("O365LABNEWMAILSERVER$")
$PF = Get-ADObject -LDAPFilter "(ObjectClass=publicFolder)" -SearchBase 'CN=test6,CN=Microsoft Exchange System Objects,DC=o365lab,DC=pro'
$Acl = Get-Acl $PF
$Acl.SetOwner($NewOwner)
Set-Acl -AclObject $Acl -Path $PF.DistinguishedName

Осталось эту процедуру запустить в цикл, в котором она будет применена ко всем общим папкам в контейнере Microsoft Exchange System Objects:

Import-Module ActiveDirectory
Set-Location ad:

$PFs = Get-ADObject -LDAPFilter "(ObjectClass=publicFolder)" -SearchBase 'CN=Microsoft Exchange System Objects,DC=o365lab,DC=pro'
$NewOwner = New-Object System.Security.Principal.NTAccount("O365LABNEWMAILSERVER$")

ForEach ($PF in $PFs) {
$Acl = Get-Acl $PF
$Acl.SetOwner($NewOwner)
Set-Acl -AclObject $Acl -Path $PF.DistinguishedName   }

Полезные ссылки:
How Can I Use Windows PowerShell to Determine the Owner of a File?
Can I Determine a Folder’s Access Rights and Who Has Them?
Cannot add send as permission for public folder on Exchange 2010

Я ранее уже писал, как можно назначать права на отправку от имени конкретного отправителя. Отправитель может быть не только пользователем с почтовым ящиком, но так же и группой рассылки и общей папкой.

Пробуем назначить право на отправку для некоторой общей папки:

[PS] C:Windowssystem32>Add-ADPermission -Identity test6 -ExtendedRights Send-As -User o365labbuldakov
Active Directory operation failed on dc.o365lab.pro. This error is not retriable. Additional information: Access is den
ied.
Active directory response: 00000005: SecErr: DSID-031521D0, problem 4003 (INSUFF_ACCESS_RIGHTS), data 0
+ CategoryInfo          : WriteError: (0:Int32) [Add-ADPermission], ADOperationException
+ FullyQualifiedErrorId : 9EE76DAE,Microsoft.Exchange.Management.RecipientTasks.AddADPermission

Учётная запись входит в группу Organization Management, поэтому необходимые права у неё имеются. Дальнейшее прояснение ситуации показывает, что проблемная папка была мигрирована с Exchange 2007. Более того, на новые общие папки выдача прав происходит без ошибок. Попробуем посмотреть владельцев соответствующих объектов в AD. Для test6:

[PS] C:Windowssystem32> Set-Location ad:
[PS] AD:> (Get-Acl "CN=test6,CN=Microsoft Exchange System Objects,DC=o365lab,DC=pro").Owner
O365LABOLDSERVER$

Для новой папки:

[PS] AD:> (Get-Acl "CN=test7,CN=Microsoft Exchange System Objects,DC=o365lab,DC=pro").Owner
O365LABNEWSERVER$

Итого. По факту имеем, что при миграции общих папок по непонятной причине не сменился владелец общей папки. Владельцем остался старый сервер, который был выведен из использования после завершения миграции. Поэтому при запуске командлета, который должен был поменять разрешения на общую папку и выскочила ошибка о том, что недостаточно прав. Осталось только исправить владельца папки и проблема будет решена.

Проблема следующая:

Запускаем командлет Get-PublicFolder для получения доступа к нужной общей папке от имени некоторой учётки, у которой есть право (RBAC) на запуск этого командлета. Области действия – без ограничений. В итоге получаем:

[PS] C:>Get-PublicFolder -Identity "Public Folder"
No existing 'PublicFolder' matches the following Identity: 'Public Folder'. Make sure that y
ou specified the correct 'PublicFolder' Identity and that you have the necessary permissions to view 'PublicFolder'.
+ CategoryInfo          : NotSpecified: (0:Int32) [Get-PublicFolder], MapiObjectNotFoundException
+ FullyQualifiedErrorId : 3ECC965C,Microsoft.Exchange.Management.MapiTasks.GetPublicFolder

Непонятно. При этом:

[PS] C:>Get-PublicFolder -Identity "Public Folder1"
Name                                                        Parent Path
----                                                        -----------
Public Folder1                                              Public Fodler1

Очевидно, что проблема с некорректной настройкой RBAC не связана (иначе бы командлет Get-PublicFolder был вообще недоступен).

Нам известно, что у нас проблема возникла при работе с общими папками, которые имеют два типа прав доступа – административные и клиентские. Первым делом я стал смотреть административные права доступа. Добавление AllExtendedRights для учётки на папку Public Folder ситуацию не изменило. Случайно заметили, что добавление в клиентские права учётки с правами Owner позволяют таки получить Public Folder через командлет Get-PublicFolder. Далее методом исключения оказалось, что для получения объекта общей папки через Get-PublicFolder необходимо, чтобы учётка, которая запускает командлет имела право Folder Visible в клиентских правах доступа.