次の方法で共有


Microsoft Teams サービスとExchange Server間の統合と OAuth の構成

適用対象: 2015 2019 サブスクリプション エディション

Microsoft Teams サービスとオンプレミスのExchange Serverを統合すると、Exchange Server (オンプレミス) でホストされているメールボックスの Teams 予定表機能とクラウド ボイスメール統合が可能になります。 詳細については、 Exchange とMicrosoft Teamsの対話方法に関する ドキュメントを参照してください。

このトピックは、サポートされているバージョンのExchange Serverとの統合に適用されます。 サポートExchange Serverマトリックスを確認して、サポートされている状態のExchange Serverのバージョンを確認します。

事前に必要な知識

Exchange Serverと O365 の統合を構成する

手順 1: Exchange ServerとExchange Onlineの間で OAuth 認証を構成する

Exchange ServerとExchange Onlineの間の OAuth 認証の構成に関するドキュメントに記載されている手順を実行します。

手順 2: パートナー アプリケーションで使用される新しいメール ユーザー アカウントを作成する

この手順は、Exchange サーバーで実行する必要があります。 メール ユーザーを作成し、必要な管理ロールのアクセス許可を割り当てます。 このアカウントは、次の手順で、パートナー アプリケーションに必要なアクセス許可を付与するために使用されます。

Exchange organizationの検証済みドメインを指定します。 このドメインは、オンプレミスの Exchange アカウントに使用されるプライマリ簡易メール転送プロトコル (SMTP) ドメインと同じドメインである必要があります。 このドメインは、次の手順で <your Verified Domain> と呼ばれます。

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

UserApplication ロールに基づいて新しい管理ロールを作成します。

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

GetDelegateFindItemGetUserOofSettingsDeleteItemUpdateItemGetAttachmentConvertIdを除くすべてのロール エントリを新しい管理ロールから削除します。

$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 }

新しく作成したアカウントに TeamsIntegrationRole ロールを割り当てます。

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

手順 3: Teams 予定表スケジューラ サービス統合のパートナー アプリケーションを作成して有効にする

Exchange Server (オンプレミス環境) のユーザーに対して予定表の委任を有効にするには、Teams Calendar Scheduler Service専用のパートナー アプリケーションを構成する必要があります。

これを行うには、オンプレミスの Exchange サーバーの Exchange 管理シェル (EMS) で次のコマンドを実行して、 Teams Calendar Scheduler Service の新しいパートナー アプリケーションを作成します。

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

手順 4: クラウド ボイスメール統合のためにパートナー アプリケーションを作成して有効にする

オンプレミス環境のユーザーに対してクラウド ボイスメールを有効にするには、Cloud Voicemail専用のパートナー アプリケーションを構成する必要があります。

これを行うには、オンプレミスの Exchange サーバーの Exchange 管理シェル (EMS) で次のコマンドを実行して、 Cloud Voicemail 用の新しいパートナー アプリケーションを作成します。

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

手順 5: Exchange Server認証証明書をエクスポートする

PowerShell スクリプトを実行して、Exchange Server認証証明書の公開キーをエクスポートします。この公開キーは、次の手順でMicrosoft Teams organizationにインポートします。

次のテキストを、 ExportAuthCert.ps1 などの名前の PowerShell スクリプト ファイルに保存します。

$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)

オンプレミスの Exchange organizationの Exchange 管理シェルで、作成した PowerShell スクリプトを実行します。 例: .\ExportAuthCert.ps1

手順 6: Exchange Server認証証明書をアップロードする

次に、Microsoft Graph PowerShell モジュールを使用して、前の手順でエクスポートしたオンプレミス認証証明書を Microsoft Entra Access Control Services (ACS) にアップロードします。 モジュールがインストールされていない場合は、管理者としてWindows PowerShell ウィンドウを開き、次のコマンドを実行します。

Install-Module -Name Microsoft.Graph.Applications
  1. Microsoft Graph コマンドレットがインストールされているWindows PowerShell ワークスペースを開きます。 この手順のすべてのコマンドは、Microsoft Graph コンソールに接続されているWindows PowerShellを使用して実行する必要があります。

  2. 次のテキストを、 UploadAuthCert.ps1 などの名前の PowerShell スクリプト ファイルに保存します。

    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. 先の手順で作成した PowerShell スクリプトを実行します。 例: .\UploadAuthCert.ps1

  4. スクリプトの開始後、[資格情報] ダイアログ ボックスが表示されます。 Microsoft Online Microsoft Entra organizationでテナント管理者アカウントの資格情報を入力します。 スクリプトを実行した後、Windows PowerShellを Microsoft Graph セッションに接続したままにします。 セッションを使用して、次の手順で PowerShell スクリプトを実行します。

手順 7: 証明書がファースト パーティのサービス プリンシパルにアップロードされたことを確認する

  1. Microsoft Graph セッションに接続されている PowerShell で、次のコマンドを実行します。

    (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. Exchange OAuth 証明書の開始日と終了日に一致する開始日と終了日のデータが一覧表示されているキーが表示されることを確認します

手順 8: 成功を確認する

一部の機能が正常に動作していることを確認して、構成が正しいことを確認します。

  1. Exchange ハイブリッド構成クラウド ボイスメール機能を確認する

    • Outlook on the Web (OWA) または Outlook Desktop を使用して、Exchange Server (オンプレミス) でホストされているメールボックス内のAutomatic repliesをアクティブ化する
    • Teamsを開き、[Settings>Calls>Manage out-of-office voicemail] に移動してチェック When Outlook automatic replies are on
    • Your custom greetingボックスにカスタムのあいさつメッセージを入力する
    • このユーザーに Teams 呼び出しを行う
    • ボイスメール メッセージを残す
    • 通話中にあいさつを聞きます。
    • 通話後、ボイスメール メッセージがユーザーのメールボックスに正常に配信されたかどうかをチェックします
  2. モバイル クライアントの会話履歴が Outlook Conversation History フォルダーに表示されていることを確認します。

  3. EWSEditor を使用して、アーカイブされたチャット メッセージが Purges フォルダー内のユーザーのオンプレミス メールボックスに保存されていることを確認します。

    または、OAuth ハンドシェイク中にトラフィックを検査します。 OAuth トラフィックは異なり、基本認証とは似ていません。 重要なインジケーターは、トークン交換での発行者識別子の存在です。次のようになります。

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

    これらの識別子は、先頭のスラッシュ (例: /7557eb47-c689-4224-abcf-aef9bd7573df@<realm>) と共に表示される場合もあります。 これらのトークンにはユーザー名やパスワードは含まれていません。これは、OAuth の基本原則である資格情報交換なしの認証を強調しています。

    OAuth を正常に使用していることを確認する場合は、何を期待し、トラフィックの外観を把握するかを確認してください。 そこで、 期待する内容を次に示します。

    設定 の例を次に示しますが、このプロセスを実行する任意のネットワーク トレース ツールを使用できます。

手順 9: 従来の Skype for Business Online アプリケーションを無効または削除する

アプリケーション ID が00000004-0000-0ff1-ce00-000000000000された従来のファースト パーティ Skype for Business Online アプリケーションは、2025 年 10 月 13 日から段階的に無効になります。 この取り組みの一環として、Teams カレンダー スケジューラ サービスクラウド ボイスメール専用のファースト パーティ アプリケーションが導入されました。

このセクションの手順に従って、従来のファーストパーティ Skype for Business Online アプリケーションを使用するすべてのパートナー アプリケーションを無効にします。

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

レガシ Skype for Business Online パートナー アプリケーションを削除する場合は、次のコマンドを実行できます。

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

Exchange とExchange Online組織の間で OAuth 認証を構成する