Назад | Перейти на главную страницу

Функция автоматического сопоставления почтовых ящиков Exchange 2010 не работает, когда группы предоставляют разрешения

У меня есть общий почтовый ящик, который мне нужно развернуть в одном из наших отделов в среде Exchange 2010 SP2 с клиентами Outlook 2010. Я пытаюсь положиться на функция автоматического сопоставления, представленная в Exchange 2010 SP1, по понятным причинам, но не работает.

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

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

Кто-нибудь знает, как заставить эту функцию работать, когда группы используются для предоставления пользователям разрешений на полный доступ к почтовому ящику? (Или есть какие-то идеи о том, как подойти к проблеме? Прямо сейчас я думаю о сценарии Powershell, который регулярно обновляет соответствующие атрибуты AD, но ... должен быть способ получше.)

Я создал этот сценарий, когда мы столкнулись с той же проблемой. Возможно, это не самая красивая вещь в мире, но она выполняет свою работу. У меня есть отдельный OU для групп доступа, а затем еще для почтовых ящиков ресурсов. Почтовые ящики групп и ресурсов используют одно и то же имя, за исключением A- впереди для группы.

например A-RESMBX1 для названия группы и REXMBX1 для почтового ящика ресурса.

Скрипт перечисляет группы в группах. OU а затем почтовые ящики ресурсов в этом OU. Затем он перебирает каждую группу и находит соответствующий почтовый ящик ресурса. Когда совпадение найдено, оно перечисляет пользователей групп, а затем добавляет их в список msExchDelegateListLink атрибут почтового ящика ресурса.

Это также удалит пользователей из msExchDelegateListLink атрибут, которые больше не являются членами связанной группы доступа. У меня это работает в запланированной задаче на DC.

Наша потребность была связана с высокой текучестью стажеров, которым требовался доступ к большому количеству почтовых ящиков ресурсов.

Вам нужно будет обновить пути LDAP к подразделениям для $Groups & $ResMBXs а также ваше имя DC для $DomainController

Import-Module ActiveDirectory
$DomainController = "MYDOMAINCONTROLLER"
$Groups = Get-ADGroup -Filter * -SearchBase 'OU=Groups,OU=Resource Mailboxes,DC=mydomain,DC=com' -Server $DomainController | Sort-Object Name
$ResMBXs = Get-ADUser -Filter * -SearchBase 'OU=Resource Mailboxes,DC=mydomain,DC=com' -Server $DomainController -properties msExchDelegateListLink  | Sort-Object Name

Write-Host "Enumerating Groups and Resource Mailboxes..."
Write-Host ""

# IsMember function is borrowed from : http://gallery.technet.microsoft.com/scriptcenter/5adf9ad0-1abf-4557-85cd-657da1cc7df4
# Hash table of security principals and their security group memberships. 
$GroupList = @{}    

Function IsMember ($ADObject, $GroupName) 
{ 
    # Function to check if $ADObject is a member of security group $GroupName. 

    # Check if security group memberships for this principal have been determined. 
    If ($GroupList.ContainsKey($ADObject.sAMAccountName.ToString() + "\") -eq $False) 
    { 
        # Memberships need to be determined for this principal. Add "pre-Windows 2000" 
        # name to the hash table. 
        $GroupList.Add($ADObject.sAMAccountName.ToString() + "\", $True) 
        # Retrieve tokenGroups attribute of principal, which is operational. 
        $ADObject.psbase.RefreshCache("tokenGroups") 
        $SIDs = $ADObject.psbase.Properties.Item("tokenGroups") 
        # Populate hash table with security group memberships. 
        ForEach ($Value In $SIDs) 
        { 
            $SID = New-Object System.Security.Principal.SecurityIdentifier $Value, 0 
            # Translate into "pre-Windows 2000" name. 
            $Group = $SID.Translate([System.Security.Principal.NTAccount]) 
            $GroupList.Add($ADObject.sAMAccountName.ToString() + "\" + $Group.Value.Split("\")[1], $True) 
        } 
    } 
    # Check if $ADObject is a member of $GroupName. 
    If ($GroupList.ContainsKey($ADObject.sAMAccountName.ToString() + "\" + $GroupName)) 
    { 
        Return $True 
    } 
    Else 
    { 
        Return $False 
    } 
} 

Foreach ($gr in $Groups) {

         Foreach ($mbx in $ResMBXs) {
             $MBXName = "A-" + $mbx.Name
             $LDAPUser=[ADSI]"LDAP://$($DomainController)/$($mbx.distinguishedName)"

             if ($gr.Name -eq $MBXName) 
             {
              #Build an Array of DNs from each Group
              $Members = Get-ADGroupMember $gr -Server $DomainController
              if ($Members -ne $Null)
              {
                  Foreach ($mbr in $Members){


                     if($mbr.distinguishedName -ne $Null)
                     {
                        $LDAPUser.msExchDelegateListLink.Add($mbr.distinguishedName)
                        $LDAPUser.SetInfo()
                     }
                    $AddedUsers += $mbr.Name
                  }
              }
              Else {Write-Host -foregroundcolor darkyellow "Group contains no members..."; Write-Host ""}

              if($mbx.msExchDelegateListLink -ne $Null) {
                  $ACLUsers = $mbx.msExchDelegateListLink
                  Foreach ($ACLUser in $ACLUsers)
                  {
                    #Check if user is a member of the current group
                    #If not, remove from attribute
                    $user = [ADSI]"LDAP://$($DomainController)/$($ACLUser)"
                    $userDN = Get-ADUser $ACLUser -Server $DomainController
                    $mem = IsMember $user $gr.Name
                    If ($mem -eq $False)
                        {
                            $LDAPUser.msExchDelegateListLink.Remove($userDN.distinguishedName)
                            $LDAPUser.SetInfo()
                            Write-Host "The Following User was removed from: " -nonewline; Write-Host -foregroundcolor yellow $mbx.Name
                            Write-Host -nonewline -foregroundcolor darkyellow " " $UserDN.Name
                            Write-Host ""
                        }
                  }
                 }
              $Members = ""
              Write-Host "The Following Users were added to: " -nonewline; Write-Host -foregroundcolor yellow $mbx.Name
              Write-Host ""
              Write-Host -foregroundcolor darkyellow $AddedUsers
              Write-Host ""
              $AddedUsers = ""
             }
         }

      }