Microsoft Teams (管理者) のユーザービューから外部チャットを削除する

テナント管理者は、新しい RemoveAllAccessForUser Graph APIを使用して、外部から開始されたチャットをユーザーのビューから削除できます。

Microsoft Teams 管理者は、organization外のユーザーによって作成されたユーザー チャットを削除する必要がある場合があります。 たとえば、あるユーザーが社外のユーザーからチャット要求を受け取った可能性があります。 そのチャットには不適切または悪意のあるコンテンツが含まれている可能性があり、管理者は、そのチャットを削除してユーザーを保護できます。

RemoveAllAccessForUser Graph APIを使用するには、tenantIduserIdchatsId/threadId の 3 つのパラメーターを指定する必要があります。 tenantId は、Teams テナントの一意の識別子です。 userId は、チャットを削除するユーザーの一意の識別子です。 chatsId/threadId は、ユーザーを削除する Teams チャット スレッドの一意の識別子です。

外部ユーザーがテナント内のユーザーと通信するときに生成される新しい統合監査ログ (UAL) イベントから、これらの 3 つのパラメーターを取得できます。 UAL イベントには、送信者、受信者、チャット スレッド、メッセージに関する情報が含まれます。 UAL イベントを使用して、アクセスを取り消すチャット スレッドを特定し、イベントの詳細から tenantIduserIdchatsId/threadId を 抽出できます。

RemoveAllAccessForUser Graph APIを使用する手順

  • 手順 1: 条件に一致する UAL イベント を検索します。 ユーザーがチャットに追加されたすべてのイベントを検索する場合は、検索クエリで "MemberAdded" イベントを使用できます。
  • 手順 2: UAL イベントの詳細から tenantIduserIdchatsId/threadId を 抽出する
  • 手順 3: 必要なパラメーターを使用して RemoveAllAccessForUser Graph APIを呼び出す

手順 1: 条件に一致する UAL イベントを検索する

条件に一致する UAL イベントを検索するには、Search-UnifiedAuditLog graph API を使用するか、Microsoft Purview コンプライアンス ポータルで監査ログ検索機能を使用できます。 このドキュメントの残りの部分では、Microsoft Purview コンプライアンス ポータルで対話型バージョンを使用していることを前提としています。 次の手順を使用します。

  1. https://compliance.microsoft.comグローバル管理者または監査ログ管理者としてサインインします。

  2. 左側のナビゲーションで、[監査] を選択 します

  3. [監査ログ検索] ページで、次の条件を指定します。

    • [監査] ページで、[検索] を選択します。
    • アクティビティ: [ アクティビティ - 操作名 ] フィールドから [メンバー][追加] (および必要に応じて MessageReceived) を選択し、[ワークロード] に [MicrosoftTeams ] を選択 します
    • 日付範囲: 外部ユーザーがテナント内のユーザーと通信した期間をカバーする日付範囲を選択します。 (省略可能)[ユーザー]: 関心のあるテナント内のユーザーの UPN を入力します。
  4. [検索] を選択します。 これにより、バックグラウンドで実行する検索がキューに格納されます。

完了したら、検索結果を確認し、関心のあるチャットとユーザーを含む UAL イベントを特定します (以下の手順 3)。

手順 2: UAL イベントの詳細から tenantId、userId、chatsId/threadId を抽出する

UAL イベントの詳細から tenantIduserIdchatsId、および chatsId/threadId を 抽出するには、イベントの OrganizationIdUserKeyChatThreadId フィールドを使用できます。 MemberAdded イベントを検索した場合、ユーザーが外部チャットに追加されたイベントと、ユーザーが外部ユーザーをチャットに追加したイベントが表示される場合があります。 テナント内のユーザーが [ メンバー の詳細] セクションにあるイベントを見つける必要があります (これは、これが追加されたユーザーであることを示しています(下の図 2 を参照)。 これを行うには、次の手順を実行します。

  1. アクセスを取り消す外部ユーザーを含む UAL イベントのいずれかを選択します。

  2. [イベントの詳細] ウィンドウで、次の操作を行います。

    • OrganizationId フィールドの値をコピーします。 これは Teams テナントの tenantId です
    • [UserKey] フィールドの値をコピーします。 これは、チャットに追加されたテナント内のユーザーの userId です。
    • ChatThreatId フィールドの値をコピーします。 これは、メッセージが属する Teams チャット スレッドの chatsId/threadId です。

Purview 検索結果の詳細の例を示す次のスクリーンショットを参照してください。

Microsoft Purview 検索の詳細
図 1 (UAL MemberAdded イベントの詳細)

Microsoft Purview メンバーの詳細
図 2 (MemberAdded UAL イベントのメンバーの詳細)

手順 3: 必要なパラメーターを使用して RemoveAllAccessForUser Graph APIを呼び出す

パラメーターを使用して RemoveAllAccessForUser Graph APIを呼び出すには、グラフ API に対する HTTP POST 要求を使用する必要があります。

POST https://graph.microsoft.com/beta/chats/{chatsId}/removeAllAccessForUser 

{chatsId} を、操作するチャットの ID に置き換えます。 要求本文には、次のプロパティを持つ JSON ユーザー オブジェクトが含まれている必要があります。

  • tenantId: Teams テナントの tenantID。
  • Id: チャットの移動元となるテナント内のユーザーの userID。

たとえば、要求は次のようになります。

POST https://graph.microsoft.com/beta/chats/19:7d8980.........f94061cf8c2@unq.gbl.spaces/removeAllAccessForUser 
Content-Type: application/json 

{ 
  "user": { 
    "id" : "d864e79f-……..-0eeb4d61fdc2", 
    "tenantId": "2a690434-………-13600199a" 
  } 
} 

要求を認証するには、Authorization ヘッダーに有効なアクセス トークンを指定する必要があります。 アクセス トークンには、Chat.ReadWrite.All アクセス許可が必要です。 アクセス トークンを取得するには、Azure AD OAuth 2.0 エンドポイントを使用します。 詳細については、「 Microsoft Graph - ユーザーの代わりにアクセスを取得する」を参照してください。

要求が成功した場合、応答の状態コードは "204 コンテンツなし" で、本文は空になります。 要求が失敗した場合、応答にはエラー コードとエラーの理由を説明するメッセージが含まれます。

Microsoft Graph APIを呼び出すには、さまざまな方法があります。これを行う方法に慣れていない場合は、Graph エクスプローラーなどの対話型ツールから始める必要があります。 一部の管理者は、アプリを作成するか、PowerShell を使用して Graph API と対話します。

サンプル コード

次の PowerShell コードを出発点として使用できます。 このコードでは、ユーザー トークンを取得する方法、必要なアクセス許可を持つクライアント アプリを作成する方法、そのクライアント アプリを使用してGraph APIを呼び出してメッセージを削除する方法を示します。

param(
    # Tenant id for the user whom the chat access is going to be removed
    [Parameter(Mandatory=$true)]
    [String]
    $TenantId,
 
    # User id for the user whom the chat access is going to be removed
    [Parameter(Mandatory=$true)]
    [String]
    $UserId,
 
    # Id of the chat that from which access will be removed
    [Parameter(Mandatory=$true)]
    [String]
    $ThreadId
)
 
 
# These may not all be necessary in your environment
# Install Microsoft.Graph.Authentication module for all users (requires admin rights)
if (Get-Module -ListAvailable -Name Microsoft.Graph.Authentication) {
    Write-Host "Microsoft.Graph.Authentication module found." -ForegroundColor "Green"
} 
else {
    Write-Host "Microsoft.Graph.Authentication module not found. Installing"
    Install-Module Microsoft.Graph.Authentication -Scope AllUsers -Force 
}
 
# Install Microsoft.Graph.Applications module for all users (requires admin rights)
if (Get-Module -ListAvailable -Name Microsoft.Graph.Applications) {
    Write-Host "Microsoft.Graph.Applications module found." -ForegroundColor "Green"
} 
else {
    Write-Host "Microsoft.Graph.Application module not found. Installing"
    Install-Module Microsoft.Graph.Applications -Scope AllUsers -Force 
}
 
# Install MSAL.PS module for all users (requires admin rights)
if (Get-Module -ListAvailable -Name MSAL.PS) {
    Write-Host "MSAL module found."  -ForegroundColor "Green"
} 
else {
    Write-Host "MSAL module not found. Installing"
    Install-Module MSAL.PS -Scope AllUsers -Force 
}
 
 
# Connect to graph and verify that a client application exists for this purpose - if not, create one
Connect-MgGraph -Scopes "Application.ReadWrite.All", "DelegatedPermissionGrant.ReadWrite.All"
 
# Get client app info
$App = Get-MgApplication -Filter "DisplayName eq 'RemoveAllAccessForUserApp'"
$createAppParams = @{
    publicClient = @{
		redirectUris = "https://login.microsoftonline.com/common/oauth2/nativeclient"
	}
}
 
# If client app is not found. Create it
if ($null -eq $App)
{
    Write-Host "Client app not found. Creating new one." -ForegroundColor "Yellow"
    $App = New-MgApplication -DisplayName 'RemoveAllAccessForUserApp' @createAppParams
    Write-Host "Client app created. Waiting for 5 seconds before continuing." -ForegroundColor "Yellow"
    Start-Sleep -Seconds 5
}
else 
{
    $AppId = $App.AppId
    Write-Host "Client app with id '$AppId' found'" -ForegroundColor "Green"
}

$ClientId = $App.AppId
 
# Now that we have the ID for our client application, we can call the RemoveAccessForUser API...
# Msal parameters required to get access token.
$MsalParams = @{
    ClientId = $ClientId
    TenantId = $TenantId
    Scopes   = 'Chat.ReadWrite.All'
}
 
 
# Get access token, it will prompt for interactive login   
$MsalResponse = Get-MsalToken @MsalParams
$AccessToken  = $MsalResponse.AccessToken
 
 
# Request authorization header containing the access token
$AuthHeader = @{
    Authorization = "Bearer $AccessToken"
}
 
# Request url
$apiUrl = "https://graph.microsoft.com/beta/chats/$ThreadId/removeAllAccessForUser"
 
# Prepare request body
$Body = @{
	user = @{
		id = "$UserId"
		tenantId = "$TenantId"
	}
}
 
$Body = $Body | ConvertTo-Json
 
# Execute request
Write-Host "Executing RemoveAllAccessForUser request."
 
try {
    Invoke-RestMethod  -Headers $AuthHeader -Uri $apiUrl -Method POST -ContentType 'application/json' -Body $Body 
    Write-Host "Rquest to RemoveAllAccessForUser api succeeded." -ForegroundColor "Green"
} catch {
    Write-Host "Request to RemoveAllAccessForUser api failed." -ForegroundColor "Red"
    Write-Host "StatusCode:" $_.Exception.Response.StatusCode.value__ 
    Write-Host "StatusDescription:" $_.Exception.Response.StatusDescription
    $receiveStream = $_.Exception.Response.GetResponseStream();
    Write-Host ([System.Text.Encoding]::ASCII).GetString($receiveStream.ToArray())
}
 
Write-Host "Disconnecting from Microsoft Graph!"
Disconnect-MgGraph