Microsoft Teams (管理者) でユーザーのビューから外部チャットを削除する
テナント管理者は、新しい RemoveAllAccessForUser Graph APIを使用して、外部から開始されたチャットをユーザーのビューから削除できます。
Microsoft Teams管理者は、organization外のユーザーによって作成されたユーザー チャットを削除する必要がある場合があります。 たとえば、あるユーザーが社外のユーザーからチャット要求を受け取ったとします。 そのチャットには不適切または悪意のあるコンテンツが含まれている可能性があり、管理者は、そのチャットを削除してユーザーを保護できます。
RemoveAllAccessForUser Graph APIを使用するには、tenantId、userId、chatsId/threadId の 3 つのパラメーターを指定する必要があります。 tenantId は、Teams テナントの一意の識別子です。 userId は、チャットを削除するユーザーの一意の識別子です。 chatsId/threadId は、ユーザーを削除する Teams チャット スレッドの一意の識別子です。
外部ユーザーがテナント内のユーザーと通信するときに生成される新しい統合監査ログ (UAL) イベントから、これらの 3 つのパラメーターを取得できます。 UAL イベントには、送信者、受信者、チャット スレッド、メッセージに関する情報が含まれます。 UAL イベントを使用して、アクセスを取り消すチャット スレッドを特定し、イベントの詳細から tenantId、 userId、 chatsId/threadId を 抽出できます。
RemoveAllAccessForUser Graph APIを使用する手順
- 手順 1: 条件に一致する UAL イベント を検索します。 ユーザーがチャットに追加されたすべてのイベントを検索する場合は、検索クエリで "MemberAdded" イベントを使用できます。
- 手順 2: UAL イベントの詳細から tenantId、 userId、 chatsId/threadId を 抽出する
- 手順 3: 必要なパラメーターを使用して RemoveAllAccessForUser Graph APIを呼び出す
手順 1: UAL イベントを検索する
特定の UAL イベントを検索するには、Search-UnifiedAuditLog graph API を使用するか、Microsoft Purview コンプライアンス ポータルの監査ログ検索機能を使用できます。 次の手順では、Microsoft Purview コンプライアンス ポータルを使用します。 次の手順を実行します。
監査ログ管理者として https://compliance.microsoft.com にサインインします。
左側のナビゲーションで、[監査] を選択 します。
[監査ログ検索] ページで、次の条件を指定します。
- [監査] ページで、[検索] を選択します。
- アクティビティ: [ アクティビティ - 操作名 ] フィールドから [メンバー][追加] (および必要に応じて MessageReceived) を選択し、[ワークロード] に [MicrosoftTeams ] を選択 します。
- 日付範囲: 外部ユーザーがテナント内のユーザーと通信した期間をカバーする日付範囲を選択します。 (省略可能)[ユーザー]: 関心のあるテナント内のユーザーの UPN を入力します。
[検索] を選択します。 このコマンドは、バックグラウンドで実行する検索をキューに入れます。
完了したら、検索結果を確認し、関心のあるチャットとユーザーを含む UAL イベントを特定します (以下の手順 3)。
手順 2: UAL イベントの詳細から tenantId、userId、chatsId/threadId を抽出する
UAL イベントの詳細から tenantId、 userId、 chatsId、および chatsId/threadId を 抽出するには、イベントの OrganizationId、 UserKey、 ChatThreadId フィールドを使用できます。 MemberAdded イベントを検索した場合、ユーザーが外部チャットに追加されたイベントと、ユーザーが外部ユーザーをチャットに追加したイベントが表示される場合があります。 テナント内のユーザーが存在するイベントを [ メンバー の詳細] セクションで見つけます (これが追加されたユーザーであることを示します(下の図 2 を参照)。 これを行うには、次の手順を実行します。
アクセスを取り消す外部ユーザーを含む UAL イベントのいずれかを選択します。
[イベントの詳細] ウィンドウで、次の操作を行います。
- OrganizationId フィールドの値をコピーします。 この値は、Teams テナントの tenantId です 。
- [UserKey] フィールドの値をコピーします。 この値は、チャットに追加されたテナント内のユーザーの userId です。
- ChatThreatId フィールドの値をコピーします。 この値は、メッセージが属する Teams チャット スレッドの chatsId/threadId です。
Purview 検索結果の詳細の例を示す次のスクリーンショットを参照してください。
図 1 (UAL MemberAdded イベントの詳細)
図 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