Microsoft Teams(관리자)의 사용자 보기에서 외부 채팅 제거
테넌트 관리자는 새 RemoveAllAccessForUser Graph API 사용하여 사용자 보기에서 외부에서 시작된 채팅을 제거할 수 있습니다.
Microsoft Teams 관리자는 organization 외부 사용자가 만든 사용자 채팅을 제거해야 할 수 있습니다. 예를 들어 사용자 중 한 명이 회사 외부의 사용자로부터 채팅 요청을 받았습니다. 해당 채팅에는 부적절하거나 악의적인 콘텐츠가 포함될 수 있으며, 관리자로서 해당 채팅을 제거하여 사용자를 보호할 수 있습니다.
RemoveAllAccessForUser Graph API 사용하려면 tenantId, userId 및 chatsId/threadId라는 세 가지 매개 변수를 제공해야 합니다. tenantId는 Teams 테넌트 고유 식별자입니다. userId는 채팅을 제거하려는 사용자의 고유 식별자입니다. chatsId/threadId는 사용자를 제거하려는 Teams 채팅 스레드의 고유 식별자입니다.
외부 사용자가 테넌트에서 사용자와 통신할 때 생성되는 새 UAL(통합 감사 로그) 이벤트에서 이러한 세 가지 매개 변수를 가져올 수 있습니다. 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 그래프 API를 사용하거나 Microsoft Purview 규정 준수 포털 감사 로그 검색 기능을 사용할 수 있습니다. 다음 지침에서는 Microsoft Purview 규정 준수 포털 사용합니다. 다음 단계를 수행합니다.
감사 로그 관리자로 로그인 https://compliance.microsoft.com 합니다.
왼쪽 탐색 영역에서 감사를 선택합니다.
감사 로그 검색 페이지에서 다음 조건을 지정합니다.
- 감사 페이지에서 검색을 선택합니다.
- 활동: 작업 – 작업 이름 필드에서 멤버추가됨(선택적으로 MessageReceived)을 선택하고 워크로드에 대해 MicrosoftTeams를 선택합니다.
- 날짜 범위: 외부 사용자가 테넌트에서 사용자와 통신한 기간을 포함하는 날짜 범위를 선택합니다. (선택 사항) 사용자: 관심 있는 테넌트에서 사용자의 UPN을 입력합니다.
검색을 선택합니다. 이 명령은 백그라운드에서 실행할 검색을 큐에 대기합니다.
완료되면 검색 결과를 검토하고 관심 있는 채팅 및 사용자와 관련된 UAL 이벤트를 식별합니다(아래 3단계).
2단계: UAL 이벤트 세부 정보에서 tenantId, userId 및 chatsId/threadId 추출
UAL 이벤트 세부 정보에서 tenantId, userId 및 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"
}
}
요청을 인증하려면 권한 부여 헤더에 유효한 액세스 토큰을 제공해야 합니다. 액세스 토큰에는 Chat.ReadWrite.All 권한이 있어야 합니다. 액세스 토큰을 가져오려면 Azure AD OAuth 2.0 엔드포인트를 사용할 수 있습니다. 자세한 내용은 Microsoft Graph - 사용자를 대신하여 액세스 가져오기를 참조하세요.
요청에 성공하면 응답에 "204 콘텐츠 없음"의 상태 코드와 빈 본문이 있습니다. 요청이 실패하면 응답에 오류 코드와 실패 이유를 설명하는 메시지가 표시됩니다.
Microsoft Graph API 호출하는 방법에는 여러 가지가 있습니다. 프로세스에 익숙하지 않은 경우 Graph Explorer 같은 대화형 도구로 시작합니다. 일부 관리자는 앱을 만들거나 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