次の方法で共有


Exchange Onlineで Exchange 2007 メールボックスをメールが有効なユーザーに変換する

段階的な移行が完了したら、オンプレミスのメールボックスをメールが有効なユーザーに変換して、オンプレミスのユーザーがクラウド メールボックスに自動的に接続できるようにします。

メールボックスをメールが有効なユーザーに変換する理由

移行されたオンプレミスメールボックスをメール対応ユーザー (MEU) に変換して、Active Directory を使用してオンプレミス組織のクラウドベースのユーザーを管理できるようにする必要があります。

Exchange の段階的な移行でメールボックスをクラウドに移行すると、2 つのことが起こります。

  • ユーザーは、オンプレミス メールボックスとクラウド メールボックスを持ちます。
  • ユーザーのオンプレミス メールボックスに送信されたメールは、そのユーザーのクラウド メールボックスに転送されます。 これは、移行プロセス中に、オンプレミス メールボックスの TargetAddress プロパティにクラウド メールボックスのリモート ルーティング アドレスが含まれているために発生します。 ユーザーが電子メールにアクセスするには、クラウド メールボックスに接続する必要があります。

この動作により、次の問題が発生します。

  • ユーザーは、Microsoft Outlook でクラウド メールボックスに接続できません。 オンプレミス組織の自動検出サービスは、引き続きオンプレミスのメールボックスへの接続を試みます。 すべてのユーザーが移行されるまで、オンプレミスの自動検出 CNAME レコードをクラウドにポイントすることはできません。

  • すべてのメールボックスがクラウドに移行された後に Exchange を使用停止すると、クラウド メールボックスのメッセージング関連のユーザー情報が失われます。 オンプレミスのメールボックスが存在しなくなったため、ディレクトリ同期によってクラウド メールボックス オブジェクト (プロキシ アドレスなど) からデータが削除されます。 ディレクトリ同期は、対応するクラウド メールボックスにデータを一致させるできません。

解決策は、メールボックスがクラウドに移行された後、ユーザーのオンプレミス メールボックスをメールが有効なユーザー (MEU) に変換することです。 オンプレミスのメールボックスを MEU に変換すると、次のアクションが実行されます。

  • クラウドベースのメールボックスのプロキシ アドレスは、新しい MEU にコピーされます。 Exchange を使用停止した場合でも、これらのプロキシ アドレスは Active Directory に保持されます。
  • MEU のプロパティを使用すると、ディレクトリ同期を MEU と対応するクラウド メールボックスと一致させることができます。
  • ユーザーが新しい Outlook プロファイルを作成すると、自動検出サービスは、MEU を使用して Outlook をクラウド メールボックスに接続します。

MEU を作成する PowerShell スクリプト

このセクションのスクリプトを使用して、クラウドベースのメールボックスに関する情報を収集し、Exchange 2007 メールボックスを MEU に変換します。

PowerShell スクリプトは、クラウド メールボックスから情報を収集し、CSV ファイルに保存します。 このスクリプトを最初に実行します。

スクリプトをメモ帳にコピーし、ファイルをExportO365UserInfo.ps1として保存します。

注:

  • PowerShell スクリプトを実行する前に、Exchange Online PowerShell モジュールをインストールする必要があります。 手順については、「Exchange Online PowerShell モジュールのインストールと保守」を参照してください。 モジュールでは、先進認証が使用されます。

  • Microsoft 365 または Microsoft 365 GCC 組織の場合は、通常、スクリプト as-is を使用できます。 Office 365 Germany、Microsoft 365 GCC High、または Microsoft 365 DoD 組織の場合、スクリプトの Connect-ExchangeOnline 行を編集する必要があります。 具体的には、ExchangeEnvironmentName パラメーターと、所属組織の種類に適した値を使用する必要があります。 詳細については、「Exchange Online PowerShell に接続する」を参照してください。

Param($migrationCSVFileName = "migration.csv")
function O365Logon
{
    #Check for current open O365 sessions and allow the admin to either use the existing session or create a new one
    $session = Get-PSSession | ?{$_.ConfigurationName -eq 'Microsoft.Exchange'}
    if($session -ne $null)
    {
        $a = Read-Host "An open session to Exchange Online PowerShell already exists. Do you want to use this session?  Enter y to use the open session, anything else to close and open a fresh session."
        if($a.ToLower() -eq 'y')
        {
            Write-Host "Using existing Exchange Online Powershell session." -ForeGroundColor Green
            return
        }
        Disconnect-ExchangeOnline -Confirm:$false
    }
    Import-Module ExchangeOnlineManagement
    Connect-ExchangeOnline -Prefix "Cloud"
}
function Main
{
    #Verify the migration CSV file exists
    if(!(Test-Path $migrationCSVFileName))
    {
        Write-Host "File $migrationCSVFileName does not exist." -ForegroundColor Red
        Exit
    }
    #Import user list from migration.csv file
    $MigrationCSV = Import-Csv $migrationCSVFileName

    #Get mailbox list based on email addresses from CSV file
    $MailBoxList = $MigrationCSV | %{$_.EmailAddress} | Get-CloudMailbox
    $Users = @()

    #Get LegacyDN, Tenant, and On-Premises Email addresses for the users
    foreach($user in $MailBoxList)
    {
        $UserInfo = New-Object System.Object

        $CloudEmailAddress = $user.EmailAddresses | ?{($_ -match 'onmicrosoft') -and ($_ -match 'smtp:')}
        if ($CloudEmailAddress.Count -gt 1)
        {
            $CloudEmailAddress = $CloudEmailAddress[0].ToString().ToLower().Replace('smtp:', '')
            Write-Host "$user returned more than one cloud email address. Using $CloudEmailAddress" -ForegroundColor Yellow
        }
        else
        {
            $CloudEmailAddress = $CloudEmailAddress.ToString().ToLower().Replace('smtp:', '')
        }

        $UserInfo | Add-Member -Type NoteProperty -Name LegacyExchangeDN -Value $user.LegacyExchangeDN
        $UserInfo | Add-Member -Type NoteProperty -Name CloudEmailAddress -Value $CloudEmailAddress
        $UserInfo | Add-Member -Type NoteProperty -Name OnPremiseEmailAddress -Value $user.PrimarySMTPAddress.ToString()
        $UserInfo | Add-Member -Type NoteProperty -Name MailboxGUID -Value $user.ExchangeGUID
        $Users += $UserInfo
    }
    #Check for existing csv file and overwrite if needed
    if(Test-Path ".\cloud.csv")
    {
        $delete = Read-Host "The file cloud.csv already exists in the current directory. Do you want to delete it?  Enter y to delete, anything else to exit this script."
        if($delete.ToString().ToLower() -eq 'y')
        {
            Write-Host "Deleting existing cloud.csv file" -ForeGroundColor Red
            Remove-Item ".\cloud.csv"
        }
        else
        {
            Write-Host "Will NOT delete current cloud.csv file. Exiting script." -ForeGroundColor Green
            Exit
        }
    }
    $Users | Export-CSV -Path ".\cloud.csv" -notype
    (Get-Content ".\cloud.csv") | %{$_ -replace '"', ''} | Set-Content ".\cloud.csv" -Encoding Unicode
    Write-Host "CSV File Successfully Exported to cloud.csv" -ForeGroundColor Green
}
O365Logon
Main

Visual Basic スクリプトは、オンプレミスの Exchange 2003 メールボックスを MEU に変換します。 PowerShell スクリプトを実行してクラウド メールボックスから情報を収集した後、このスクリプトを実行します。

スクリプトをメモ帳にコピーし、ファイルをExchange2007MBtoMEU.vbsとして保存します。

param($DomainController = [String]::Empty)
function Main
{
    #Script Logic flow
    #1. Pull User Info from cloud.csv file in the current directory
    #2. Lookup AD Info (DN, mail, proxyAddresses, and legacyExchangeDN) using the SMTP address from the CSV file
    #3. Save existing proxyAddresses
    #4. Add existing legacyExchangeDN's to proxyAddresses
    #5. Delete Mailbox
    #6. Mail-Enable the user using the cloud email address as the targetAddress
    #7. Disable RUS processing
    #8. Add proxyAddresses and mail attribute back to the object
    #9. Add msExchMailboxGUID from cloud.csv to the user object (for offboarding support)

    if($DomainController -eq [String]::Empty)
    {
        Write-Host "You must supply a value for the -DomainController switch" -ForegroundColor Red
        Exit
    }

    $CSVInfo = Import-Csv ".\cloud.csv"
    foreach($User in $CSVInfo)
    {
        Write-Host "Processing user" $User.OnPremiseEmailAddress -ForegroundColor Green
        Write-Host "Calling LookupADInformationFromSMTPAddress" -ForegroundColor Green
        $UserInfo = LookupADInformationFromSMTPAddress($User)

        #Check existing proxies for On-Premises and Cloud Legacy DN's as x500 proxies. If not present add them.
        if($UserInfo.ProxyAddresses -notcontains ("X500:"+$UserInfo.CloudLegacyDN))
        {
            $X500Proxy = "x500:" + $UserInfo.CloudLegacyDN
            Write-Host "Adding $X500Proxy to EmailAddresses" -ForegroundColor Green
            $UserInfo.ProxyAddresses.Add($X500Proxy)
        }
        if($UserInfo.ProxyAddresses -notcontains ("X500:"+$UserInfo.LegacyDN))
        {
            $X500Proxy = "x500:" + $UserInfo.LegacyDN
            Write-Host "Adding $X500Proxy to EmailAddresses" -ForegroundColor Green
            $UserInfo.ProxyAddresses.Add($X500Proxy)
        }

        #Disable Mailbox
        Write-Host "Disabling Mailbox" -ForegroundColor Green
        Disable-Mailbox -Identity $UserInfo.OnPremiseEmailAddress -DomainController $DomainController -Confirm:$false

        #Mail Enable
        Write-Host "Enabling Mailbox" -ForegroundColor Green
        Enable-MailUser  -Identity $UserInfo.Identity -ExternalEmailAddress $UserInfo.CloudEmailAddress -DomainController $DomainController

        #Disable RUS
        Write-Host "Disabling RUS" -ForegroundColor Green
        Set-MailUser -Identity $UserInfo.Identity -EmailAddressPolicyEnabled $false -DomainController $DomainController

        #Add Proxies and Mail
        Write-Host "Adding EmailAddresses and WindowsEmailAddress" -ForegroundColor Green
        Set-MailUser -Identity $UserInfo.Identity -EmailAddresses $UserInfo.ProxyAddresses -WindowsEmailAddress $UserInfo.Mail -DomainController $DomainController

        #Set Mailbox GUID. Need to do this via S.DS as Set-MailUser doesn't expose this property.
        $ADPath = "LDAP://" + $DomainController + "/" + $UserInfo.DistinguishedName
        $ADUser = New-Object -TypeName System.DirectoryServices.DirectoryEntry -ArgumentList $ADPath
        $MailboxGUID = New-Object -TypeName System.Guid -ArgumentList $UserInfo.MailboxGUID
        [Void]$ADUser.psbase.invokeset('msExchMailboxGUID',$MailboxGUID.ToByteArray())
        Write-Host "Setting Mailbox GUID" $UserInfo.MailboxGUID -ForegroundColor Green
        $ADUser.psbase.CommitChanges()

        Write-Host "Migration Complete for" $UserInfo.OnPremiseEmailAddress -ForegroundColor Green
        Write-Host ""
        Write-Host ""
    }
}

function LookupADInformationFromSMTPAddress($CSV)
{
    $Mailbox = Get-Mailbox $CSV.OnPremiseEmailAddress -ErrorAction SilentlyContinue

    if($Mailbox -eq $null)
    {
        Write-Host "Get-Mailbox failed for" $CSV.OnPremiseEmailAddress -ForegroundColor Red
        continue
    }

    $UserInfo = New-Object System.Object

    $UserInfo | Add-Member -Type NoteProperty -Name OnPremiseEmailAddress -Value $CSV.OnPremiseEmailAddress
    $UserInfo | Add-Member -Type NoteProperty -Name CloudEmailAddress -Value $CSV.CloudEmailAddress
    $UserInfo | Add-Member -Type NoteProperty -Name CloudLegacyDN -Value $CSV.LegacyExchangeDN
    $UserInfo | Add-Member -Type NoteProperty -Name LegacyDN -Value $Mailbox.LegacyExchangeDN
    $ProxyAddresses = New-Object Microsoft.Exchange.Data.ProxyAddressCollection
    $ProxyAddresses = $Mailbox.EmailAddresses
    $UserInfo | Add-Member -Type NoteProperty -Name ProxyAddresses -Value $ProxyAddresses
    $UserInfo | Add-Member -Type NoteProperty -Name Mail -Value $Mailbox.WindowsEmailAddress
    $UserInfo | Add-Member -Type NoteProperty -Name MailboxGUID -Value $CSV.MailboxGUID
    $UserInfo | Add-Member -Type NoteProperty -Name Identity -Value $Mailbox.Identity
    $UserInfo | Add-Member -Type NoteProperty -Name DistinguishedName -Value (Get-User $Mailbox.Identity).DistinguishedName

    $UserInfo
}
Main

オンプレミス メールボックスを MEU に変換するセットアップ手順

次の手順でプロセスを完了します。

  1. ExportO365UserInfo.ps1、Exchange2007MBtoMEU.ps1、移行バッチの実行に使用した CSV ファイルを、オンプレミス サーバーの同じディレクトリにコピーします。

  2. 移行の CSV ファイル名を migration.csv に変更します。

  3. Exchange 管理シェル で次のコマンドを実行します。 スクリプトは、CSV ファイルが同じディレクトリ内にあり、migration.csvという名前であることを前提としています。

    .\ExportO365UserInfo.ps1
    

    既存のセッションを使用するか、新しいセッションを開くかを確認するメッセージが表示されます。

  4. 「n」と入力し、 Enter キーを押して新しいセッションを開きます。

    スクリプトを実行すると、現在の作業ディレクトリに Cloud.csv ファイルが保存されます。

  5. クラウドベースの組織の管理者の資格情報を入力し、[ OK] をクリックします。

  6. 新しい Exchange 管理シェル セッションで次のコマンドを実行します。 このコマンドは、ExportO365UserInfo.ps1 と Cloud.csv が同じディレクトリにあることを前提としています。

    .\Exchange2007MBtoMEU.ps1 <FQDN of on-premises domain controller>
    

    次に例を示します。

    .\Exchange2007MBtoMEU.ps1 DC1.contoso.com
    

    スクリプトによって、Cloud.csv に含まれているすべてのユーザーのオンプレミス メールボックスが MEU に変換されます。

  7. 新しい MEU が作成されたことを確認します。 Active Directory ユーザーとコンピューターで、次の手順を実行します。

    1. [アクション検索] をクリックします>。

    2. [ Exchange ] タブをクリックします。

    3. [ Exchange 受信者のみを表示する] を選び、[ 外部メール アドレスを持つユーザー] を選びます。

    4. [ 検索開始] をクリックします。

      MEU に変換されたメールボックスの一覧が [ 検索結果] に表示されます。

  8. Active Directory ユーザーとコンピューターADSI Edit、または Ldp.exe を使用して、次の MEU プロパティに正しい情報が入力されていることを確認します。

    • Legacyexchangedn
    • mail
    • msExchMailboxGuid
    • proxyAddresses
    • targetAddress