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. "이제 다신 UI를 사용하지 않을거야. 사용할 수도 없고 사용하지도 않을거야! 누가 뭐라고 해도 UI를 다시 사용하진 않을거야!"

좋습니다. 세 번째 단계에 대한 표현이 약간 과도한 것 같지만 핵심은 잘 나타나 있습니다. 2007년 1월에 발간된 기술 문서 Exchange 관리 셸 안내서를 참조하면 처음 두 단계를 쉽게 배울 수 있습니다. 아래의 내용을 통해 적어도 받는 사람 관리에 관해 세 번째 단계에 쉽게 도달하길 바랍니다.

더 흥미롭게 배우기 위해 받는 사람 관리자인 Amy가 Exchange 관리 셸을 사용하여 월요일에 자신에게 할당된 작업을 처리하는 방법을 따라봅니다.

사서함 만들기

매주 월요일마다 Amy가 첫 번째로 하는 작업은 그 주에 새로 고용한 모든 사람에 대한 사서함을 만드는 것입니다. 매주 월요일 아침에 인사과에서는 새로 고용한 사람의 이름과 사용자 이름이 포함된 CSV(쉼표로 구분된 값) 파일을 Amy에게 보냅니다. 인사과에서 보내는 CSV 파일은 일반적으로 다음과 같습니다.

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

새 사서함을 만들 때 Amy는 다음 작업을 모두 수행해야 합니다.

  • UPN(User Principal Name) 확장명 contoso.com을 각 사용자 이름에 추가합니다.

  • pass@word1을 초기 암호로 지정합니다.

  • 사용자가 처음 로그온할 때 암호를 변경하도록 구성합니다.

  • 새 사서함을 저장할 사서함 데이터베이스 및 OU(조직 구성 단위)를 지정합니다.

이 되풀이 작업이 처음 Amy에게 할당되었을 때 그녀는 Exchange 관리 셸을 사용하여 신속하게 작업을 처리하기로 결정했습니다. Amy는 다음의 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 cmdlet는 password 매개 변수에 대해 보안 문자열만 받아들이므로 명령에 일반 텍스트로 된 기본 암호 값을 사용할 수 없었습니다. 이 문제를 해결하기 위해 Amy는 ConvertTo-SecureString cmdlet를 사용하여 기본 암호에서 보안 문자열을 만들고 이를 사용자 정의 변수 $Temp에 저장했습니다. 그런 다음 이 변수를 New-Mailbox cmdlet의 password 매개 변수에 전달했습니다.

$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 받는 사람 관리 한 줄 명령(Exchange Server 2007 recipient management one-liners)에 설명된 일괄 관리 예제를 살펴본 후 스트립트를 수정하여 이 작업을 완료했습니다.

참고

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}

Amy는 블로그 문서의 예제에서 구문을 복사하여 이 스크립트를 설정할 수 있었습니다. 그러나 그녀는 $_ 구문의 역할을 정확히 알지 못했습니다. 잠시 조사하여 그녀는 셸 변수 항목을 찾았습니다. 이 문서에서 $_은 현재 파이프라인 개체가 포함된 Exchange 관리 셸 변수라고 설명합니다. 그러므로 스크립트에서 Process 매개 변수로 지정된 스크립트 블록이 실행될 때마다 $_ 변수에는 CSV 파일의 다음 행에 있는 데이터가 포함됩니다.

Amy는 UPN을 설정할 때 사용된 구문에 대해서도 잘 이해가 되지 않았습니다. 변수 값이 New-Mailbox cmdlet의 매개 변수에 직접 지정되지 않았고 오히려 매개 변수에 지정된 문자열을 수정하는 데 사용되었기 때문에 달랐습니다. Amy는 Exchange 관리 셸에 대한 명령 구문이 설명된 구문 항목을 검토하여 $() 구문은 스크립트에서 명령 출력을 인수로 대신 사용하기 위한 것임을 알았습니다. Exchange 관리 셸에서 변수만 입력할 경우 출력은 이 변수 값입니다. 그러므로 $() 블록 안에 변수를 넣으면 이 블록이 변수의 값으로 대체됩니다. 스크립트에서 변수 $_.UserName에는 사용자 이름이 포함됩니다. $() 구문 안에 이 변수를 넣음으로써 Amy는 UserPrincipalName 매개 변수에 지정된 문자열에 변수 값을 삽입할 수 있었습니다.

Exchange 관리 셸의 명령 구문에 대해 자세히 알아본 후 Amy는 한 단계 더 나아가 스크립트의 첫 줄을 ForEach-Object cmdlet의 Begin 매개 변수로 이동하고 이를 자신의 받는 사람 일괄 관리 한 줄 명령으로 바꿨습니다. 매주 월요일마다 그녀는 인사과에서 받은 최신 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

직함 및 부서 필드는 Set-User cmdlet를 사용해야만 업데이트할 수 있기 때문에 Amy의 스크립트는 새 CSV 파일과 맞지 않습니다. 처음에 그녀는 또 다른 스크립트를 작성하여 같은 파일을 읽어온 후 Get-User cmdlet를 사용하여 출력을 Set-User cmdlet에 전달하려고 했습니다. 그러나 New-Mailbox cmdlet 출력을 Set-User cmdlet에 전달할 수도 있기 때문에 기존 한 줄 명령을 간단히 수정하기로 했습니다.

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}

Amy는 구문이 올바른지 확인하기 위해 Microsoft Exchange Server 2007Exchange 관리 셸 사용사서함 및 받는 사람 cmdlet 항목을 참조했습니다. 새 한 줄 명령을 실행한 후 그녀는 Microsoft 셸을 사용한 스크립팅: 스크립트 센터에서 Microsoft Windows PowerShell의 스크립팅에 대해 자세히 알아봤습니다.

받는 사람 작업에 필터 사용

Amy는 점심 식사를 위해 나가기 직전에 상관인 Joe로부터 긴급 전자 메일 메시지를 받습니다. Joe는 마케팅 부서로부터 불편 사항을 접수받았습니다. 마케팅 직원은 정기적으로 용량이 큰 파일을 첨부하여 메시지를 보내기 때문에 현재 회사 저장소 할당량이 마케팅 부서에게는 너무 작다는 것이었습니다. Joe는 Amy에게 마케팅 부서의 모든 직원에 대한 보내기 금지 할당량을 500MB로 늘리고 받기 금지 할당량을 없애도록 지시했습니다. 또한 회사의 모든 관리자에 대해서도 같은 작업을 하도록 지시했습니다.

Amy는 Get-User cmdlet를 사용하여 마케팅 부서에서 근무하는 모든 직원 또는 특정 직함을 가진 모든 직원의 목록을 얻을 수 있음을 알고 있습니다. 그러나 그녀는 이 작업을 위해 필터를 올바르게 설정하는 방법을 정확히 알지 못합니다. 다시 한 번 Amy는 제품 설명서를 참조합니다. 사용자 지정 받는 사람 필터 설정 방법에 대한 자세한 내용을 보려면 받는 사람 명령에서 필터 만들기를 읽습니다. 필터에 사용할 수 있는 연산자 목록을 확인하기 위해 비교 연산자를 읽습니다. 그런 다음 Amy는 다음 명령이 마케팅 부서의 모든 사용자 사서함을 반환하는지 확인합니다.

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

회사의 일관된 사서함 준비 과정 표준 덕분에 Amy는 조직에서 모든 관리자의 직함에, 또한 관리자의 직함에만 Manager, VP 또는 Officer가 포함된다는 점을 알고 있습니다. 조직의 모든 관리자의 사서함을 반환하도록 그녀는 다음 필터를 설정합니다.

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

그런 다음 Amy는 두 필터를 결합하고 출력을 다음 한 줄 명령의 Set-Mailbox 명령에 제공합니다. 그녀는 회사 정책에 사용자 사서함이 용량의 90%에 도달하면 경고 메시지를 보내도록 지정되어 있으므로 경고 할당량을 450MB로 설정합니다.

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 

Amy는 Joe에게 마케팅 부서 및 관리자에 대한 사서함 할당량을 모두 처리했다는 메모를 보냅니다. 또한 사서함 서버에 대한 저장소 요구 사항을 다시 검토하기 위해 Joe와의 회의 일정을 마음 속으로 세웁니다. 이제 여유 있게 점심 식사를 즐길 수 있습니다.

받는 사람 구성

Amy는 점심 식사에서 돌아온 후 Joe로부터 저장소 할당량을 이렇게 빨리 처리한 점에 대해 고맙다는 메시지를 받습니다. Joe는 해당 직원들에게 변경 내용에 대한 메시지를 보낼 수 있도록 저장소 할당량이 업데이트된 직원 명단을 보내달라고 요청합니다. Amy는 Joe가 더 쉽게 메시지를 보낼 수 있도록 메일 그룹을 만들기로 결정합니다. 먼저, 그녀는 Quota Exceptions라는 메일 그룹을 만듭니다. 새 메일 그룹의 구성원 목록을 채우기 위해 그녀는 ForEach-Object cmdlet 및 사서함을 구성할 때 사용한 필터를 사용합니다.

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}

Amy는 이 메일 그룹이 잘못 사용되지 않도록 다음 명령을 실행하여 Joe가 보낸 메시지만 받도록 구성하고 Exchange 주소 목록에서 숨깁니다.

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

Amy는 Joe에게 이 메일 그룹을 사용하라고 알리기 직전에 앞으로 이 사서함 사용자에 대한 할당량을 다시 구성해야 할 경우가 있을 수 있다는 생각이 듭니다. 이 사용자에 대한 최신 메일 그룹이 있다면 유용할 것입니다. 그러므로 그녀는 항상 최신 상태를 유지하도록 대신 동적 메일 그룹을 사용하기로 결정합니다. 그녀는 방금 만든 메일 그룹을 제거하고 대신 Managers and Marketing Department Users라는 동적 메일 그룹을 만듭니다. 그녀는 Get-User cmdlet에 사용한 필터를 새 동적 메일 그룹의 받는 사람 필터로 사용합니다.

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

Amy는 동적 메일 그룹의 구성원을 보는 방법에 설명된 단계를 따라 동적 메일 그룹이 올바르게 설정되었는지 확인합니다. 그녀는 Joe에게 전자 메일 주소 MgrsMktgUsers@contoso.com으로 메시지를 보내기만 하면 된다는 메시지를 보내고 동적 메일 그룹이 어떻게 구성되어 있는지 설명합니다.

사서함 연결

그런 다음 Amy는 회사의 문제 관리 도구에 로그온하고 지원 센터에서 자신에게 올라온 서비스 티켓을 검토합니다. 2주 전에 비활성화된 사서함 Don Hall에 다시 연결해 달라는 요청이 있습니다. Amy는 지난 달에 또 다른 사서함을 연결해야 했었습니다. 당시에는 연결이 끊어졌을 때 사용자 사서함이 어느 데이터베이스에 있는지 몰랐습니다. 그녀는 Exchange 관리 콘솔을 사용하여 모든 사서함 서버에 연결하여 연결이 끊긴 사서함이 저장되어 있는지 확인해야 했습니다.

Amy는 같은 검색 과정을 다시 수행하고 싶지 않습니다. 그러므로 그녀는 연결이 끊긴 사서함이 포함된 서버를 더 쉽게 확인하는 방법을 찾아내기로 결정합니다. Amy는 Get-MailboxStatistics cmdlet에서 반환된 데이터에 연결이 끊긴 사서함에 대한 정보가 포함되어 있다는 것을 알아냅니다. 그러나 그녀는 이 cmdlet의 출력 범위를 찾고 있는 사서함으로 좁히고 싶습니다. 명령 출력 작업 항목을 읽은 후 Where cmdlet를 사용하여 이 작업을 수행할 수 있음을 알게 됩니다. 이를 테스트하기 위해 Server03의 사서함 데이터베이스 MBX4에 Test User 1이라는 테스트 사서함을 만들어 비활성화합니다. 그런 후 다음 명령을 실행합니다.

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

cmdlet는 다음 결과를 반환합니다.

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

필터가 예상대로 작동하지만 현재 형식으로는 cmdlet 출력이 실제로 유용하지 않습니다. 이 cmdlet를 사용하여 조직에서 연결이 끊긴 사서함이 있는 서버를 찾을 계획이므로 출력에 표시 이름, 서버 이름 및 데이터베이스 이름이 표시되어야 합니다. 그러므로 이러한 내용이 표시되도록 그녀는 cmdlet 출력 서식을 변경합니다.

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

이제 Amy는 원하는 명령 구문을 알기 때문에 특정 사서함 데이터베이스만이 아니라 조직의 모든 사서함 데이터베이스를 검색하는 명령이 필요합니다. 그러므로 그녀는 Get-MailboxDatabase cmdlet 출력을 방금 작성한 명령 구문으로 파이프라이닝하고 다음 한 줄 명령을 실행합니다.

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

cmdlet가 예상대로 작동하여 연결이 끊어졌을 때 Don Hall의 사서함이 있었던 사서함 데이터베이스를 찾았습니다. 그녀는 한 단계 더 나아가 사서함을 연결하는 방법에 설명된 단계를 자신의 한 줄 명령에 적용하고 다음 명령을 사용하여 사서함에 연결합니다.

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

Amy는 나머지 근무 시간을 Microsoft Exchange Server TechCenterMicrosoft Exchange 팀 블로그(Microsoft Exchange Team Blog)에서 새 정보를 찾는 데 보냅니다.

참고

UNRESOLVED_TOKEN_VAL(exBlog)

자세한 내용

앞의 예에서 볼 수 있듯이 여러 cmdlet 및 다양한 Exchange 관리 셸 기능을 결합하여 복잡한 받는 사람 관리 작업을 빠르고 완벽하게 수행할 수 있습니다.

Exchange 2007 및 Exchange 관리 셸의 받는 사람 관리에 대한 자세한 내용을 보려면 다음 리소스를 참조하십시오.

Serdar Soysal Serdar Soysal - Microsoft Exchange Server 선임 테크니컬 라이터