Compartir a través de


Configurar la integración y OAuth entre los servicios y Exchange Server de Microsoft Teams

SE APLICA A: Edición de suscripción 2015 2019

La integración de los servicios de Microsoft Teams con las Exchange Server locales permite la característica del calendario de Teams y la integración de Correo de voz en la nube para los buzones hospedados en Exchange Server (local). Encontrará más información en la documentación Cómo interactúan Exchange y Microsoft Teams .

Este tema se aplica a la integración con cualquier versión compatible de Exchange Server. Compruebe la matriz de compatibilidad de Exchange Server para averiguar qué versiones de Exchange Server están en un estado compatible.

¿Qué necesita saber antes de empezar?

Configurar la integración entre Exchange Server y O365

Paso 1: Configurar la autenticación OAuth entre Exchange Server y Exchange Online

Realice los pasos descritos en la documentación Configurar autenticación de OAuth entre Exchange Server y Exchange Online.

Paso 2: Crear una nueva cuenta de usuario de correo usada por las aplicaciones asociadas

Este paso debe realizarse en el servidor de Exchange. Crea un usuario de correo y asigna los permisos de rol de administración necesarios. Esta cuenta se usará en el paso siguiente para conceder a la aplicación de partner los permisos necesarios.

Especifique un dominio comprobado para su organización de Exchange. Este dominio debe ser el mismo que el dominio principal de Protocolo simple de transferencia de correo (SMTP) usado para las cuentas locales de Exchange. Este dominio se conoce como <your Verified Domain> en el procedimiento siguiente.

$user = New-MailUser -Name "TeamsIntegration-ApplicationAccount" -ExternalEmailAddress "TeamsIntegration-ApplicationAccount@<your Verified Domain>"
Set-MailUser -Identity $user.UserPrincipalName -HiddenFromAddressListsEnabled $true

Cree un nuevo rol de administración basado en el UserApplication rol:

New-ManagementRole -Name "TeamsIntegrationRole" -Parent "UserApplication"

Quite todas las entradas de rol del nuevo rol de administración excepto GetDelegate, FindItem, GetUserOofSettings, DeleteItem, UpdateItemy ConvertIdGetAttachment :

$roleEntries = @("GetDelegate", "FindItem", "GetUserOofSettings", "DeleteItem", "UpdateItem", "GetAttachment", "ConvertId")
Get-ManagementRoleEntry "TeamsIntegrationRole\*" | Where-Object { $roleEntries -notcontains $_.Name } | ForEach-Object { Remove-ManagementRoleEntry -Identity "TeamsIntegrationRole\$($_.Name)" -Confirm:$false }

Asigne el TeamsIntegrationRole rol a la cuenta recién creada:

New-ManagementRoleAssignment -Role "TeamsIntegrationRole" -User $user.UserPrincipalName

Paso 3: Crear y habilitar una aplicación de partner para la integración del servicio Programador de calendarios de Teams

Para habilitar la delegación de calendario para los usuarios de su Exchange Server (entorno local) debe configurar una aplicación de partner dedicada para el Teams Calendar Scheduler Service.

Para ello, cree una nueva aplicación asociada para el mediante la Teams Calendar Scheduler Service ejecución del comando siguiente en el Shell de administración de Exchange (EMS) en su servidor exchange local:

New-PartnerApplication -Name "TeamsScheduler" -ApplicationIdentifier "7557eb47-c689-4224-abcf-aef9bd7573df" -Enabled $true -LinkedAccount $user.UserPrincipalName

Paso 4: Crear y habilitar una aplicación de partner para la integración Correo de voz en la nube

Para habilitar Correo de voz en la nube para los usuarios de su entorno local, debe configurar una aplicación de partner dedicada para Cloud Voicemail.

Para ello, cree una nueva aplicación asociada para Cloud Voicemail la que ejecute el comando siguiente en el Shell de administración de Exchange (EMS) en su servidor exchange local:

New-PartnerApplication -Name "CloudVoicemail" -ApplicationIdentifier "db7de2b5-2149-435e-8043-e080dd50afae" -Enabled $true -LinkedAccount $user.UserPrincipalName

Paso 5: Exportar el certificado de autenticación de Exchange Server

Ejecute un script de PowerShell para exportar la clave pública del certificado de autenticación de Exchange Server, que importará a su organización de Microsoft Teams en el siguiente paso.

Guarde el siguiente texto en un archivo de script de PowerShell denominado, por ejemplo, ExportAuthCert.ps1.

$thumbprint = (Get-AuthConfig).CurrentCertificateThumbprint
if((Test-Path $env:SYSTEMDRIVE\OAuthConfig) -eq $false)
{
   New-Item -Path $env:SYSTEMDRIVE\OAuthConfig -Type Directory
}
Set-Location -Path $env:SYSTEMDRIVE\OAuthConfig
$oAuthCert = Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object {$_.Thumbprint -match $thumbprint}
$certType = [System.Security.Cryptography.X509Certificates.X509ContentType]::Cert
$certBytes = $oAuthCert.Export($certType)
$certFile = "$env:SYSTEMDRIVE\OAuthConfig\OAuthCert.cer"
[System.IO.File]::WriteAllBytes($certFile, $certBytes)

En el Shell de administración de Exchange de su organización local de Exchange, ejecute el script de PowerShell que ha creado. Por ejemplo: .\ExportAuthCert.ps1

Paso 6: Cargar el certificado de autenticación de Exchange Server

A continuación, use el módulo De PowerShell de Microsoft Graph para cargar el certificado de autenticación local que exportó en el paso anterior a Microsoft Entra Access Control Services (ACS). Si no tiene instalado el módulo, abra una ventana de Windows PowerShell como administrador y ejecute el siguiente comando:

Install-Module -Name Microsoft.Graph.Applications
  1. Abra un área de trabajo de Windows PowerShell que tenga instalados los cmdlets de Microsoft Graph. Todos los comandos de este paso deben ejecutarse con la Windows PowerShell conectada a la consola de Microsoft Graph.

  2. Guarde el siguiente texto en un archivo de script de PowerShell denominado, por ejemplo, UploadAuthCert.ps1.

    Connect-MgGraph -Scopes Application.ReadWrite.All
    
    $certFile = "$env:SYSTEMDRIVE\OAuthConfig\OAuthCert.cer"
    $objFSO = New-Object -ComObject Scripting.FileSystemObject
    $certFile = $objFSO.GetAbsolutePathName($certFile)
    $cer = [System.Security.Cryptography.X509Certificates.X509Certificate2]::new($certFile)
    $binCert = $cer.GetRawCertData()
    $credValue = [System.Convert]::ToBase64String($binCert)
    $serviceNames = @("db7de2b5-2149-435e-8043-e080dd50afae", "7557eb47-c689-4224-abcf-aef9bd7573df")
    foreach ($serviceName in $serviceNames) {
       Write-Host "[+] Trying to query the service principals for service: $serviceName" -ForegroundColor Cyan
       $p = Get-MgServicePrincipal -Filter "AppId eq '$serviceName'"
       Write-Host "[+] Trying to query the keyCredentials for service: $serviceName" -ForegroundColor Cyan
       $servicePrincipalKeyInformation = Get-MgServicePrincipal -Filter "AppId eq '$serviceName'" -Select "keyCredentials"
    
       $keyCredentialsLength = $servicePrincipalKeyInformation.KeyCredentials.Length
       if ($keyCredentialsLength -gt 0) {
          Write-Host "[+] $keyCredentialsLength existing key(s) found - we keep them if they have not expired" -ForegroundColor Cyan
    
          $newCertAlreadyExists = $false
          $servicePrincipalObj = New-Object -TypeName Microsoft.Graph.PowerShell.Models.MicrosoftGraphServicePrincipal
          $keyCredentialsArray = @()
    
          foreach ($cred in $servicePrincipalKeyInformation.KeyCredentials) {
             $thumbprint = [System.Convert]::ToBase64String($cred.CustomKeyIdentifier)
    
             Write-Host "[+] Processing existing key: $($cred.DisplayName) thumbprint: $thumbprint" -ForegroundColor Cyan
    
             if ($newCertAlreadyExists -ne $true) {
                $newCertAlreadyExists = ($cer.Thumbprint).Equals($thumbprint, [System.StringComparison]::OrdinalIgnoreCase)
             }
    
             if ($cred.EndDateTime -lt (Get-Date)) {
                Write-Host "[+] This key has expired on $($cred.EndDateTime) and will not be retained" -ForegroundColor Yellow
                continue
             }
    
             $keyCredential = New-Object -TypeName Microsoft.Graph.PowerShell.Models.MicrosoftGraphKeyCredential
             $keyCredential.Type = "AsymmetricX509Cert"
             $keyCredential.Usage = "Verify"
             $keyCredential.Key = $cred.Key
    
             $keyCredentialsArray += $keyCredential
          }
    
          if ($newCertAlreadyExists -eq $false) {
             Write-Host "[+] New key: $($cer.Subject) thumbprint: $($cer.Thumbprint) will be added" -ForegroundColor Cyan
             $keyCredential = New-Object -TypeName Microsoft.Graph.PowerShell.Models.MicrosoftGraphKeyCredential
             $keyCredential.Type = "AsymmetricX509Cert"
             $keyCredential.Usage = "Verify"
             $keyCredential.Key = [System.Text.Encoding]::ASCII.GetBytes($credValue)
    
             $keyCredentialsArray += $keyCredential
    
             $servicePrincipalObj.KeyCredentials = $keyCredentialsArray
             Update-MgServicePrincipal -ServicePrincipalId $p.Id -BodyParameter $servicePrincipalObj
          } else {
             Write-Host "[+] New key: $($cer.Subject) thumbprint: $($cer.Thumbprint) already exists and will not be uploaded again" -ForegroundColor Yellow
          }
       } else {
          $params = @{
             type = "AsymmetricX509Cert"
             usage = "Verify"
             key = [System.Text.Encoding]::ASCII.GetBytes($credValue)
          }
    
          Write-Host "[+] This is the first key which will be added to this service principal" -ForegroundColor Cyan
          Update-MgServicePrincipal -ServicePrincipalId $p.Id -KeyCredentials $params
       }
    }
    
  3. Ejecute el script de PowerShell que creó en el paso anterior. Por ejemplo: .\UploadAuthCert.ps1

  4. Después de iniciar el script, se mostrará un cuadro de diálogo de credenciales. Escriba las credenciales de la cuenta de administrador de inquilinos en su organización de microsoft online Microsoft Entra. Después de ejecutar el script, deje abierto el Windows PowerShell conectado a la sesión de Microsoft Graph. Usará la sesión para ejecutar un script de PowerShell en el paso siguiente.

Paso 7: Comprobar que el certificado se cargó en las entidades de servicio de origen

  1. En la sesión de PowerShell conectada a Microsoft Graph, ejecute lo siguiente

    (Get-MgServicePrincipal -Filter "AppId eq '7557eb47-c689-4224-abcf-aef9bd7573df'" -Select "keyCredentials").KeyCredentials | Format-List *
    (Get-MgServicePrincipal -Filter "AppId eq 'db7de2b5-2149-435e-8043-e080dd50afae'" -Select "keyCredentials").KeyCredentials | Format-List *
    
  2. Confirme que ve una clave con los datos de fecha de inicio y finalización que coincidan con las fechas de inicio y finalización del certificado OAuth de Exchange.

Paso 8: Comprobar el éxito

Compruebe que la configuración es correcta verificando que algunas de las características funcionen correctamente.

  1. Confirmar Correo de voz en la nube funcionalidad en una configuración híbrida de Exchange

    • Activar Automatic replies en el buzón hospedado en Exchange Server (local) con Outlook en la Web (OWA) o Outlook de escritorio
    • Abre Teams, ve a Settings>>CallsManage out-of-office voicemail y compruebaWhen Outlook automatic replies are on
    • Escriba un mensaje de saludo personalizado en el Your custom greeting cuadro
    • Realizar una llamada de Teams a este usuario
    • Dejar un mensaje de correo de voz
    • Escuche el saludo durante la llamada:
    • Después de la llamada, compruebe si el mensaje de correo de voz se ha entregado correctamente en el buzón del usuario.
  2. Confirme que el historial de conversaciones de clientes móviles está visible en la carpeta de Outlook Conversation History .

  3. Confirme que los mensajes de chat archivados se depositan en el buzón local del usuario en la Purges carpeta con EWSEditor.

    Como alternativa, inspeccione el tráfico durante el apretón de manos de OAuth. El tráfico de OAuth es distinto y no se parece a la autenticación básica. Un indicador clave es la presencia de identificadores de emisor en el intercambio de tokens, como:

    • 7557eb47-c689-4224-abcf-aef9bd7573df@<realm>
    • db7de2b5-2149-435e-8043-e080dd50afae@<realm>

    Estos identificadores también pueden aparecer con una barra diagonal, por ejemplo: /7557eb47-c689-4224-abcf-aef9bd7573df@<realm>. Estos tokens no incluyen un nombre de usuario o contraseña, lo que resalta un principio principal de OAuth: autenticación sin intercambio de credenciales.

    Si desea asegurarse de que está usando OAuth correctamente, asegúrese de que sabe qué esperar y saber cómo debe ser el tráfico. Esto es lo que puede esperar.

    He aquí un ejemplo de configuración de uno, pero puede usar cualquier herramienta de seguimiento de red que le guste para llevar a cabo este proceso.

Paso 9: Deshabilitar o quitar la aplicación heredada Skype Empresarial Online

La aplicación de Skype for Business Online origen heredada, que tiene el id 00000004-0000-0ff1-ce00-000000000000. de aplicación , se deshabilitará progresivamente a partir del 13 de octubre de 2025. Como parte de este esfuerzo, se introdujo la aplicación de origen dedicada para el servicio programador de calendarios de Teams y Correo de voz en la nube.

Siga los pasos de esta sección para deshabilitar cualquier aplicación de partner que use aplicaciones heredadas de origen Skype for Business Online :

Get-PartnerApplication | Where-Object { $_.ApplicationIdentifier -eq "00000004-0000-0ff1-ce00-000000000000" -and $_.Enabled -eq $true } | Set-PartnerApplication -Enabled $false

Si desea quitar la aplicación partner heredada Skype for Business Online , puede ejecutar el siguiente comando:

Get-PartnerApplication | Where-Object { $_.ApplicationIdentifier -eq "00000004-0000-0ff1-ce00-000000000000" -and $_.Enabled -eq $true } | Remove-PartnerApplication

Configurar la autenticación de OAuth entre Exchange y Exchange Online organizaciones