O recurso de caixas de correio de mapeamento automático do Exchange 2010 não funciona quando os grupos concedem permissões

5

Eu tenho uma caixa de correio compartilhada que preciso implantar em um de nossos departamentos em um ambiente do Exchange 2010 SP2 com clientes do Outlook 2010. Eu estou tentando confiar no recurso de mapeamento automático introduzido pelo Exchange 2010 SP1 , por motivos óbvios, mas não está funcionando.

Em uma inspeção mais próxima, isso seria porque ele não funciona com grupos , habilmente evitando que se torne um recurso útil para qualquer pessoa com mais de um punhado de usuários de email administrar.

O link acima contém um script do PowerShell para ler a associação de um grupo e adicionar diretamente esses membros a permissões de acesso total, mas isso não fornece a funcionalidade de atualizar o mapeamento automático à medida que as pessoas ingressam ou saem do departamento. / p>

Alguém sabe de uma maneira de obter esse recurso funcional quando grupos são usados para conceder aos usuários permissões de acesso total a uma caixa de correio? (Ou tenho algum ides sobre como abordar o problema, mesmo? Agora, estou pensando em um script do Powershell que atualiza os atributos relevantes do AD regularmente, mas ... deve haver uma maneira melhor.)

    
por HopelessN00b 14.03.2013 / 22:20

1 resposta

8

Eu criei este script quando nos deparamos com o mesmo problema. Talvez não seja a coisa mais bonita do mundo, mas faz o trabalho. Eu tenho um OU separado para os grupos de acesso e outro para as caixas de correio de recursos. Os grupos e caixas de correio de recursos usam o mesmo nome, exceto por um A- na frente do grupo.

por exemplo. A-RESMBX1 para o nome do grupo e REXMBX1 para a caixa de correio do recurso.

O script enumera os grupos nos grupos OU e, em seguida, as caixas de correio de recursos nesse OU . Em seguida, ele percorre cada grupo e localiza a caixa de correio de recursos correspondente. Quando uma correspondência é encontrada, ele enumera os usuários dos grupos e os adiciona ao atributo msExchDelegateListLink da Caixa de Correio de Recursos.

Ele também removerá usuários do atributo msExchDelegateListLink que não são mais membros do grupo de acesso associado. Eu tenho isso em execução em uma tarefa agendada em um DC.

Nossa necessidade foi devido à alta rotatividade de estagiários que precisavam ter acesso a um grande número de caixas de correio de recursos.

Você precisaria atualizar os caminhos LDAP para as OUs por $Groups & $ResMBXs , bem como o seu nome DC para $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 = ""
             }
         }

      }
    
por 14.03.2013 / 22:46