Поделиться через


Using the Exchange Management Shell for Bulk Recipient Management

 

Последнее изменение раздела: 2007-03-26

Автор: Serdar Soysal

В сервере Microsoft Exchange Server 2007 большинство задач управления получателями можно выполнять как в командной консоли Exchange, так и в консоли управления Exchange. Для задач, выполняемых для отдельных получателей, обычно проще использовать консоль управления Exchange (по крайней мере, тем, кто хотя бы иногда делает опечатки). Однако мощность и простота использования командной консоли Exchange делают ее незаменимым средством одновременной настройки нескольких получателей.

Процесс обучения использованию командной консоли Exchange можно условно разделить на три этапа:

  1. «Ух ты, это круто, но сложно!»

  2. «Ого, мне только что удалось создать почтовый ящик без помощи мыши!»

  3. «Я никогда не вернусь к использованию графического интерфейса. Не хочу! Не буду! И ничто не сможет меня заставить сделать это!»

Хорошо, возможно, описание третьего этапа выглядит излишне восторженным, но смысл понятен. Статья Знакомство с командной консолью Exchange (на английском языке), опубликованная в январе 2007 г., позволит пройти первые два этапа. Будем надеяться, что сведения из этой статьи помогут перейти к третьему этапу, по крайней мере, в области управления получателями.

Чтобы сделать обучение более увлекательным, давайте посмотрим, как администратор получателей Эми использует командную консоль Exchange для выполнения задач, запланированных на понедельник.

Создание почтовых ящиков

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

Name,User Name
David Hamilton,DHamilton
Ezio Alboni,EAlboni
Rajesh M. Patel,RPatel
Kevin Liu,KLiu

При создании почтовых ящиков Эми необходимо выполнить следующие задачи:

  • добавить к каждому имени пользователя расширение имени участника-пользователя «contoso.com»;

  • назначить в качестве исходного пароля слово pass@word1;

  • настроить учетную запись пользователя на изменение пароля при первом входе в систему;

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

Когда данная повторяющаяся задача была впервые поручена Эми, она решила воспользоваться командной консолью Exchange для быстрого выполнения задачи. Она начала работу с выполнения приведенной ниже команды New-Mailbox, которая создает тестового пользователя с именем Test User 1.

New-Mailbox -Name "Test User 1" -UserPrincipalName "TUser1@contoso.com" -OrganizationalUnit "contoso.com/Users" -Database "Server01\Mailbox Database" -ResetPasswordOnNextLogon $true

Команда сработала, но предложила Эми ввести пароль для нового пользователя. Командлет New-Mailbox принимает в качестве значения параметра password только защищенные строки, поэтому Эми не может указать в команде пароль по умолчанию в виде открытого текста. Для решения этой проблемы, Эми воспользовалась командлетом ConvertTo-SecureString для создания из пароля по умолчанию защищенной строки и сохранения ее в пользовательской переменной $Temp. После этого она может указать данную переменную в качестве значения параметра password командлета New-Mailbox.

$Temp = ConvertTo-SecureString "pass@word1" -asPlainText -force
New-Mailbox -Name "Test User 1" -UserPrincipalName "TUser1@contoso.com" -OrganizationalUnit "contoso.com/Users" -Database "Server01\Mailbox Database" -Password $Temp -ResetPasswordOnNextLogon $true

Следующий этап заключается в считывании сведений о пользователях из CSV-файла и автоматизации процесса подготовки к работе. После просмотра примеров группового управления получателями, приведенных в блоге команды разработчиков сервера Microsoft Exchange Exchange Server 2007 (на английском языке), Эми изменила созданный ею сценарий для выполнения этой задачи.

noteПримечание.
UNRESOLVED_TOKEN_VAL(exBlog)
$Temp = ConvertTo-SecureString "pass@word1" -asPlainText -Force
Import-CSV "C:\NewUsers.csv" | ForEach-Object -Process {New-Mailbox -Name $_.Name -UserPrincipalName "$($_.UserName)@contoso.com" -OrganizationalUnit "contoso.com/Users" -Database "Server01\Mailbox Database" -Password $Temp -ResetPasswordOnNextLogon $true}

Эми смогла создать этот сценарий, скопировав текст примера, приведенного в статье блога. Однако она не поняла, для чего используется синтаксис $_. После небольшого исследования она нашла раздел Переменные среды (на английском языке). В статье рассказывается, что $_ является переменной командной консоли Exchange, которая содержит текущий объект конвейера. Следовательно, каждый раз при выполнении блока сценария, указанного в параметре Process, переменная $_ содержит данные из следующей строки CSV-файла.

Еще Эми был непонятен синтаксис, используемый при задании имени участника-пользователя. Синтаксис отличался, поскольку значение переменной не присваивалось напрямую параметру командлета New-Mailbox, скорее всего, синтаксис использовался для изменения строки, присвоенной параметру. Эми просмотрела раздел Синтаксис (на английском языке), в котором описывается синтаксис команды для командной консоли Exchange, и выяснила, что синтаксис $() используется для подстановки выходных данных команды в качестве аргумента в сценарии. Если в командной консоли Exchange вводится только переменная, выходными данными является значение этой переменной. Следовательно, если в блок $() помещается переменная, вместо этого блока подставляется значение переменной. В ее сценарии переменная $_.UserName содержит имя пользователя. Поместив переменную в блок $(), Эми смогла вставить значение переменной в строку, используемую для присвоения значения параметру UserPrincipalName.

После получения дополнительных сведений о синтаксисе команды в командной консоли Exchange Эми продвинулась на шаг дальше и присвоила первую строку своего сценария параметру Begin командлета ForEach-Object, сократив свой сценарий группового управления получателями до одной строки. Каждый понедельник Эми просто подавала на вход приведенного ниже сценария последний CSV-файл, полученный из отдела кадров.

Import-CSV "C:\NewUsers.csv" | ForEach-Object -Begin {$Temp = ConvertTo-SecureString "pass@word1" -asPlainText -Force} -Process {New-Mailbox -Name $_.Name -UserPrincipalName "$($_.UserName)@contoso.com" -OrganizationalUnit "contoso.com/Users" -Database "Server01\Mailbox Database" -Password $Temp -ResetPasswordOnNextLogon $true}

Однако сегодняшний CSV-файл выглядит немного по-другому. Отдел кадров добавил в CSV-файл должности и отделы новых сотрудников.

Name,User Name,Title,Department
Deepak Kumar,DKumar,Marketing Analyst,Marketing
Ray Chow,RChow,Sales Associate,Sales
David Simpson,DSimpson,Sales Associate,Sales
Isabel Martins,IMartins,Administrative Assistant,Accounting

Старый сценарий Эми не будет работать с новым CSV-файлом, поскольку поля «Должность» и «Отдел» можно обновить только с помощью командлета Set-User. Сначала она решила написать другой сценарий для чтения этого же файла, а затем воспользоваться командлетом Get-User и перенаправить его выходные данные на вход командлета Set-User. Однако поскольку можно также направить выходные данные командлета New-Mailbox на вход командлета Set-User, Эми в конце концов изменила существующий сценарий.

Import-CSV "C:\NewUsers.csv" | ForEach-Object -Begin {$Temp = ConvertTo-SecureString "pass@word1" -asPlainText -force} -Process {New-Mailbox -Name $_.Name -UserPrincipalName "$($_.UserName)@contoso.com" -OrganizationalUnit "contoso.com/Users" -Database "Server01\Mailbox Database" -Password $Temp -ResetPasswordOnNextLogon $true | Set-User -Title $_.Title -Department $_.Department}

Чтобы убедиться в правильности синтаксиса, Эми изучила разделы Использование командной консоли Exchange (на английском языке) и Командлеты для работы с почтовыми ящиками и получателями (на английском языке) статьи Microsoft Exchange Server 2007 (на английском языке). После выполнения нового сценария Эми обратилась к статье Сценарии в Windows PowerShell: центр сценариев (на английском языке) для получения дополнительных сведений о создании сценариев в среде Microsoft Windows PowerShell.

Использование фильтров в задачах управления получателями

Как только Эми собралась уйти на обед, она получила по электронной почте срочное сообщение от своего начальника, Джо. Джо получил жалобу из отдела маркетинга. Сотрудники отдела маркетинга постоянно отправляют сообщения с вложениями большого размера, поэтому текущие установленные в организации квоты слишком малы для этого отдела. Джо попросил Эми увеличить квоту запрета на отправку для всех сотрудников отдела маркетинга до 500 мегабайт (МБ) и отменить квоту запрета на получение. Он также попросил ее сделать то же самое для всех руководителей в компании.

Эми знает, что для получения списка всех сотрудников, работающих в отделе маркетинга или занимающих определенные должности, используется командлет Get-User. Однако она не знает точно, как установить правильные фильтры для выполнения этой задачи. И снова Эми обращается к документации по продукту. Дополнительные сведения о создании настраиваемых фильтров получателей она получила в статье Создание фильтров в командах управления получателями (на английском языке). Для получения списка операторов, которые можно использовать в фильтрах она обратилась к статье Операторы сравнения (на английском языке). После этого Эми проверила, что приведенная ниже команда возвращает список всех почтовых ящиков в отделе маркетинга.

Get-User -Filter {Department -eq 'Marketing' -and RecipientTypeDetails -eq 'UserMailbox'}

Благодаря действующим в компании четким стандартам подготовки почтовых ящиков Эми знает, что в поле «Должность» у руководителей и только у руководителей присутствует слово Manager, VP или Officer. Для получения списка почтовых ящиков всех руководителей в организации Эми создала приведенный ниже фильтр.

Get-User -Filter {((Title -like '*Manager*') -or (Title -like '*VP*') -or (Title -like '*Officer*')) -and (RecipientTypeDetails -eq 'UserMailbox')}

После этого Эми объединила два фильтра и подала выходные данные на вход команды Set-Mailbox в приведенном ниже сценарии. Она установила квоту предупреждения равной 450 МБ, поскольку политика компании предусматривает отправку предупреждения, когда почтовый ящик пользователя заполняется на 90%.

Get-User -Filter {((Title -like '*Manager*') -or (Title -like '*VP*') -or (Title -like '*Officer*') -or (Department -eq 'Marketing')) -and (RecipientTypeDetails -eq 'UserMailbox')} | Set-Mailbox -IssueWarningQuota 450MB -ProhibitSendQuota 500MB -ProhibitSendReceiveQuota unlimited -UseDatabaseQuotaDefaults $false 

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

Настройка получателей

После обеда Эми видит сообщение от Джо с благодарностью за столь оперативное решение проблемы с квотами. В этом сообщение Джо также просит Эми отправить ему список сотрудников, для которых были изменены квоты хранилища, чтобы он мог отправить им сообщение о данном изменении. Эми приходит к выводу, что для решения этой задачи проще будет создать группу рассылки. Сначала она создает группу рассылки с именем Quota Exceptions (исключения по квотам). Чтобы заполнить список членов новой группы рассылки, она использует командлет ForEach-Object и фильтр, который она использовала для настройки почтовых ящиков.

New-DistributionGroup -Name "Quota Exceptions" -OrganizationalUnit "contoso.com/Users" -SamAccountName "QuotaExceptions" -Type Distribution
Get-User -Filter {((Title -like '*Manager*') -or (Title -like '*VP*') -or (Title -like '*Officer*') -or (Department -eq 'Marketing')) -and (RecipientTypeDetails -eq 'UserMailbox')} | ForEach-Object -Process {Add-DistributionGroupMember -Identity "Quota Exceptions" -Member $_.Name}

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

Set-DistributionGroup -Identity "Quota Exceptions" -AcceptMessagesOnlyFrom "Joe Healy" -HideFromAddressListsEnabled $true

Как только Эми собралась сообщить Джо об использовании этой группы рассылки, она поняла, что в дальнейшем ей может потребоваться снова настроить квоты для данных пользователей почтовых ящиков. Для этих пользователей было бы весьма полезно иметь постоянно обновляющуюся группу рассылки. Таким образом, Эми решает использовать динамическую группу рассылки, поскольку такая группа рассылки всегда находится в обновленном состоянии. Эми удаляет только что созданную группу рассылки и создает вместо нее динамическую группу рассылки с именем Managers and Marketing Department Users (руководство и сотрудники отдела маркетинга). Она использует фильтр, созданный для командлета Get-User, в качестве фильтра получателей для новой динамической группы рассылки.

New-DynamicDistributionGroup -Name "Managers and Marketing Department Users" -Alias "MgrsMktgUsers" -OrganizationalUnit Users -RecipientFilter {((Title -like '*Manager*') -or (Title -like '*VP*') -or (Title -like '*Officer*') -or (Department -eq 'Marketing')) -and (RecipientTypeDetails -eq 'UserMailbox')} | Set-DynamicDistributionGroup -AcceptMessagesOnlyFrom "Joe Healy" -HiddenFromAddressListsEnabled $true

Выполнив действия, описанные в статье Просмотр членов динамической группы рассылки (на английском языке), она проверяет, что динамическая группа рассылки настроена правильно. Она отправляет начальнику сообщение, в котором ему предлагается просто отправить необходимое сообщение на адрес MgrsMktgUsers@contoso.com и рассказывается о настройке динамической группы рассылки.

Подключение почтовых ящиков

После этого Эми делает запись в журнале обращений в службу технической поддержки компании и просматривает билеты службы, отправленные ей из службы технической поддержки. Среди них имеется запрос на повторное подключение почтового ящика Дона Холла (Don Hall), который был отключен две недели назад. Эми должна была подключить другой почтовый ящик в предыдущем месяце. На тот момент она не знала, в какой базе данных находился почтовый ящик пользователя при отключении. При использовании консоли управления Exchange ей потребовалось подключиться к каждому серверу почтовых ящиков, чтобы проверить, имеется ли на сервере отключенный почтовый ящик.

Эми не хочется снова выполнять такой поиск. Поэтому она решила найти более простой способ узнать, на каком сервере находится отключенный почтовый ящик. Она выяснила, что данные, возвращаемые командлетом Get-MailboxStatistics, содержат сведения об отключенных почтовых ящиках. Однако она хочет ограничить выходные данные этого командлета искомым почтовым ящиком. После изучения раздела Работа с возвращаемыми командой данными (на английском языке) она узнала, что для выполнения поставленной задачи необходимо использовать командлет Where. Чтобы проверить свое предположение, Эми создает почтовый ящик с именем Test User 1 в базе данных MBX4 на сервере Server03 и отключает его. Затем она выполняет приведенную ниже команду.

Get-MailboxStatistics -Database "Server03\MBX4" | Where {$_.DisplayName -eq 'Test User 1'}

Командлет возвращает следующий результат:

DisplayName         ItemCount    StorageLimitStatus    LastLogonTime
-----------         ---------    ------------------    -------------
Test User 1         434                  BelowLimit

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

Get-MailboxStatistics -Database "Server03\MBX4" | Where {$_.DisplayName -eq 'Test User 1'} | Format-Table DisplayName,ServerName,DatabaseName

После этого выводится следующий результат, более подходящий для задач Эми:

Display Name        ServerName          DatabaseName
------------        ----------          ------------
Test User 1         Server03            MBX4

Теперь, когда Эми получила желаемый синтаксис команды, ей необходимо выполнить команду для всех баз данных почтовых ящиков в организации (а не для одной). Она перенаправляет выходные данные командлета Get-MailboxDatabase на вход созданной ею команды и выполняет приведенный ниже сценарий.

Get-MailboxDatabase | Get-MailboxStatistics | Where {$_.DisplayName -eq 'Don Hall'} | Format-Table DisplayName,ServerName,DatabaseName

Командлет работает ожидаемым образом, и Эми находит базу данных почтовых ящиков, в которой находился почтовый ящик Дона Холла (Don Hall) на момент его отключения. Она делает следующий шаг и объединяет действия, описанные в статье Подключение почтового ящика (на английском языке) со своим сценарием и использует для подключения почтового ящика указанную ниже команду.

Get-MailboxDatabase | Get-MailboxStatistics | Where {$_.DisplayName -eq 'Don Hall'} | Connect-Mailbox -User DHall@contoso.com

Остаток рабочего для Эми посвящает просмотру веб-узлов Microsoft Exchange Server TechCenter (на английском языке) и Блог команды разработчиков Microsoft Exchange (на английском языке) для получения новых сведений.

noteПримечание.
UNRESOLVED_TOKEN_VAL(exBlog)

Дополнительные сведения

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

Для получения дополнительных сведений об управлении получателями в сервере Exchange 2007 и командной консоли Exchange воспользуйтесь указанными ниже ресурсами.

Сердар Сойсал (Serdar Soysal) Сердар Сойсал (Serdar Soysal) — старший технический писатель, сервер Microsoft Exchange Server