Convertir buzones de Exchange 2007 en usuarios habilitados para correo en Exchange Online

Después de completar una migración almacenada provisionalmente, convierta los buzones locales en usuarios habilitados para correo para que los usuarios locales puedan conectarse automáticamente a sus buzones de correo en la nube.

¿Por qué convertir los buzones en usuarios habilitados para correo?

Debe convertir los buzones locales migrados en usuarios habilitados para correo (MEU) para poder administrar usuarios basados en la nube desde la organización local mediante Active Directory.

Después de que un buzón se migre a la nube en una migración preconfigurada de Exchange suceden dos cosas:

  • Un usuario tiene un buzón local y un buzón en la nube.
  • El correo enviado al buzón local del usuario se reenvía al buzón en la nube. Esto sucede porque durante el proceso de migración, la propiedad TargetAddress del buzón local contiene la dirección de enrutamiento remoto del buzón de correo en la nube. Los usuarios deben conectarse a sus buzones de correo en la nube para acceder a su correo electrónico.

Este comportamiento provoca los siguientes problemas:

  • El usuario no podrá conectarse a su buzón de correo en la nube en Microsoft Outlook. El servicio de detección automática de la organización local sigue intentando conectarse a su buzón local. No puede apuntar el registro CNAME de detección automática local a la nube hasta que se hayan migrado todos los usuarios.

  • La información de usuario relacionada con la mensajería en los buzones de correo en la nube se pierde si retira Exchange después de que todos los buzones se hayan migrado a la nube. La sincronización de directorios quita los datos del objeto de buzón de correo en la nube (por ejemplo, direcciones proxy), porque el buzón local ya no existe. la sincronización de directorios no puede hacer coincidir los datos con el buzón de correo en la nube correspondiente.

La solución consiste en convertir el buzón local del usuario en un usuario habilitado para correo (MEU) después de migrar el buzón a la nube. Al convertir un buzón local en un MEU, se producen las siguientes acciones:

  • Las direcciones proxy del buzón basado en la nube se copian en el nuevo MEU. Si retira Exchange, estas direcciones proxy se conservan en Active Directory.
  • Las propiedades del MEU permiten que la sincronización de directorios coincida con el MEU con su buzón de correo en la nube correspondiente.
  • El servicio Detección automática usa el MEU para conectar Outlook al buzón en la nube después de que el usuario crea un nuevo perfil de Outlook.

Scripts de PowerShell para crear MEU

Use los scripts de esta sección para recopilar información sobre los buzones basados en la nube y convertir los buzones de Exchange 2007 en MEU.

El script de PowerShell recopila información de los buzones de correo en la nube y la guarda en un archivo CSV. Ejecute este script primero.

Copie el script en el Bloc de notas y guarde el archivo como ExportO365UserInfo.ps1.

Nota:

  • Antes de ejecutar el script de PowerShell, debe instalar el módulo de PowerShell Exchange Online. Para obtener instrucciones, consulte Instalación y mantenimiento del módulo de PowerShell Exchange Online. El módulo usa la autenticación moderna.

  • Por lo general, puede usar el script tal como está si su organización es Microsoft 365 o Microsoft 365 GCC. Si su organización es Office 365 Germany, Microsoft 365 GCC High o Microsoft 365 DoD, tiene que modificar la línea Connect-ExchangeOnline en el script. En concreto, debe usar el parámetro ExchangeEnvironmentName y el valor adecuado para su tipo de organización. Para obtener más información, vea los ejemplos en Conexión a 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

El script de Visual Basic convierte buzones de Exchange 2003 locales en MEU. Ejecute este script después de ejecutar el script de PowerShell para recopilar información de los buzones de correo en la nube.

Copie el script en el Bloc de notas y guarde el archivo como 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

Pasos de configuración para convertir los buzones locales en MEU

Siga estos pasos para completar el proceso.

  1. Copie ExportO365UserInfo.ps1, Exchange2007MBtoMEU.ps1 y el archivo CSV que se ha usado para ejecutar el lote de migración en el mismo directorio de su servidor local.

  2. Cambie el nombre del archivo CSV de migración a migration.csv.

  3. En el Shell de administración de Exchange, ejecute el comando siguiente. El script presupone que el archivo CSV esté en el mismo directorio y se denomine migration.csv.

    .\ExportO365UserInfo.ps1
    

    Se le pedirá que use la sesión existente o abra una sesión nueva.

  4. Escriba n y presione Entrar para abrir una sesión nueva.

    El script se ejecuta y, después, guarda el archivo Cloud.csv en el directorio de trabajo actual.

  5. Escriba las credenciales del administrador para su organización basada en la nube y, después, haga clic en Aceptar.

  6. Ejecute el comando siguiente en una nueva sesión del Shell de administración de Exchange. Este comando presupone que ExportO365UserInfo.ps1 y Cloud.csv se encuentran en el mismo directorio.

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

    Por ejemplo:

    .\Exchange2007MBtoMEU.ps1 DC1.contoso.com
    

    El script convierte buzones locales en MEU para todos los usuarios incluidos en el archivo Cloud.csv.

  7. Compruebe que los nuevos MEU se hayan creado. En Usuarios y equipos de Active Directory, siga estos pasos:

    1. Haga clic en Búsqueda de acciones>.

    2. Haga clic en la pestaña Exchange .

    3. Seleccione Mostrar solo destinatarios de Exchange y, después, seleccione Usuarios con una dirección de correo electrónico externa.

    4. Haga clic en Buscar ahora.

      Los buzones que se han convertido a MEU aparecen en Resultados de la búsqueda.

  8. Use Usuarios y equipos de Active Directory, ADSI Edit o Ldp.exe para comprobar que las siguientes propiedades MEU se rellenan con la información correcta.

    • Legacyexchangedn
    • mail
    • msExchMailboxGuid
    • proxyAddresses
    • targetAddress