Сегодня пришел запрос на блокировку учетной записи сотрудника службы по персоналу, в служебные обязанности которого входило оповещение всех сотрудников компании о кадровых изменениях и проектах службы по персоналу. То есть потребовалось удалить этого сотрудника из списка разрешений на отсылку сообщений группам рассылки по компании и по филиалам. Помимо этого потребовалось дать право на использование групп двум коллегам ушедшего сотрудника.
Так как групп оказалось очень много, чтобы делать удаление-добавление через консоль, я написал следующий скрипт Powershell.
# Разрешение исполнения неподписанных скриптов Set-ExecutionPolicy Unrestricted # Создание сессии к почтовому серверу $Session = New-PSSession -ConfigurationName Microsoft.Exchange ` -ConnectionUri http://exchangeserver.domain.com/PowerShell/ -Authentication Kerberos Import-PSSession $Session # Подключение модуля работы с Active Directory Import-Module ActiveDirectory # Функция конвертации полного имени объекта (Distinguished Name) в каноническое имя (Canonical Name) Function Get-CanonicalName { Param( [string]$DN ) Process { # Разделение полного имени на составляющие $Parts = $DN.Split(",") # Определение количества уровней $NumParts = $Parts.Count # Определение количества составляющих имени домена $FQDNPieces = ($Parts -match 'DC').Count # Определение количества составляющих непосредственного имени объекта $Middle = $NumParts - $FQDNPieces # Построение имени домена (части имени домена соединяются точкой) ForEach ($x In ($Middle+1)..($NumParts)) { $CN += $Parts[$x-1].SubString(3)+'.' } # Удаление лишней точки в конце имени домена $CN = $CN.substring(0,($CN.length)-1) # Достроение канонического имени, читая части полного имени с конца вперед и разделяя их слешами ForEach ($x in ($Middle-1)..0) { #$Parts[$x].substring(3) $CN += "/"+$Parts[$x].SubString(3) } Return $CN } } # Функция удаления пользователя из разрешенных отправителей для группы рассылки Function Remove-DistributionGroupAcceptMessagesOnlyFrom { Param( [string]$GroupName, [string]$UserName) Process { # Получение текущего списка разрешенных отправителей Try { $Members = Get-DistributionGroup -Identity $GroupName | ` Select AcceptMessagesOnlyFromSendersOrMembers } Catch { Write-Host "Error: The group $GroupName is not found." -ForegroundColor Red } $NewMembers = @() # Поиск в полученном списке указанного пользователя и перестроение списка ForEach ($Member in $Members.AcceptMessagesOnlyFromSendersOrMembers) { If (!$Member.Contains($UserName)) { $NewMembers += $Member } } # Сохранение нового списка доступа к группе Try { Set-DistributionGroup -Identity $GroupName -AcceptMessagesOnlyFromSendersOrMembers $NewMembers ` -BypassSecurityGroupManagerCheck } Catch { Write-Host $Error -ForegroundColor Red } } } # Функция добавления пользователя в разрешенные отправители для группы рассылки Function Add-DistributionGroupAcceptMessagesOnlyFrom { Param( [string]$GroupName, [string]$UserName) Process { # Поиск полного имени пользователя и конвертация найденного имени в каноническое имя Try { $UserCanonicalName = Get-CanonicalName (Get-ADUser -Filter 'Name -like ` $UserName').DistinguishedName } Catch { Write-Host "Error: The user $UserName is not found." -ForegroundColor Red } # Получение текущего списка разрешенных отправителей Try { $Members = Get-DistributionGroup -Identity $GroupName | ` Select AcceptMessagesOnlyFromSendersOrMembers } Catch { Write-Host "Error: The group $GroupName is not found." -ForegroundColor Red } $NewMembers = @() # Поиск в полученном списке указанного пользователя и перестроение списка ForEach ($Member in $Members.AcceptMessagesOnlyFromSendersOrMembers) { $NewMembers += $Member If ($Member.Contains($UserName)) { $AlreadyExists = $True } } # Добавление пользователя в список, если его там нет If (!$AlreadyExists) { $NewMembers += $UserCanonicalName } Else { Write-Host "Error: The user $UserName is already in the list." -ForegroundColor Red } # Сохранение нового списка доступа к группе Try { Set-DistributionGroup -Identity $GroupName -AcceptMessagesOnlyFromSendersOrMembers $NewMembers ` -BypassSecurityGroupManagerCheck } Catch { Write-Host $Error -ForegroundColor Red } } } # Удаление пользователя из списка разрешенных пользователей на отправку группе рассылки Remove-DistributionGroupAcceptMessagesOnlyFrom "Company - Nizhniny Novgorod" "Marina Ivanova" # Добавление пользователя в список разрешенных пользователей на отправку группе рассылки Add-DistributionGroupAcceptMessagesOnlyFrom "Company - Nizhniny Novgorod" "Irina Petrova"
Аналогичным образом можно написать функции обработки списков доступа к отправке на почтовые ящики, заменив функции Get-DistributionGroup и Set-DistributionGroup на Get-Mailbox и Set-Mailbox соотвественно. Например:
$Members = Get-Mailbox -Identity $MailboxName | Select AcceptMessagesOnlyFromSendersOrMembers