У меня есть общий почтовый ящик, который мне нужно развернуть в одном из наших отделов в среде 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 = ""
}
}
}