Teams 用の Azure アプリケーションを設定する

Azure portal で Microsoft Azure アプリケーションを作成する手順は次のとおりです。高度なデータ インポート方法を使用して Microsoft Teams のデータを Google Workspace アカウントにコピーする場合は、安全なデータ インポートを確保するために Azure アプリケーションが必要です。次の 2 つの方法のいずれかを選択できます。

PowerShell スクリプトを使用して自動接続を設定する

これらの手順を完了するには、グローバル ロール管理者または特権ロール管理者である必要があります。

オプション 1: Azure Cloud Shell を使用する

  1. 管理者として Azure ポータルにログインします。
  2. [Cloud Shell] 次に [PowerShell] をクリックします。
  3. プロンプトが表示されたら、ストレージ アカウントを作成し、デフォルト設定をそのまま使用します。
  4. アプリケーションを作成するには、次のコマンドを入力して [Enter] をクリックします。

    Install-Module Microsoft.Graph -Scope CurrentUser

  5. [Untrusted Repository] からのインストールを求めるプロンプトが表示されたら、「Y」と入力して [Enter] をクリックします。
  6. 次のコードブロックをコピーして PowerShell に貼り付け、Enter キーを押します。
         <#    
    .SYNOPSIS    
    Automates the creation of a Single-Tenant Entra ID App for Workspace Migration.    
    Strictly forces account selection and verifies specific Admin roles.    
    #>
    
    # Check if the module is missing
    if (-not (Get-Module -ListAvailable -Name Microsoft.Graph.Authentication)) {
        Write-Host "Microsoft Graph module is NOT installed." -ForegroundColor Yellow
        $UserResponse = Read-Host "Would you like to try installing Microsoft Graph? (Y/N)"
    
        if ($UserResponse -ieq "Y") {
            try {
                # Use only native cmdlets, no .NET property setting
                Install-Module -Name Microsoft.Graph -Scope CurrentUser -Force -AllowClobber
                Write-Host "Installation complete!" -ForegroundColor Green
            }
            catch {
                Write-Error "Policy is blocking installation. Please contact IT to install Microsoft.Graph module."
                Read-Host "Press Enter to exit"; exit
            }
        }
        else {
            exit
        }
    } else {
        Write-Host "Microsoft Graph modules detected. Proceeding..." -ForegroundColor Green
    }
    
    # --- STEP 0: THE "DEEP" LOGOUT ---
    Write-Host "Forcing session cleanup..." -ForegroundColor Gray
    Disconnect-MgGraph -ErrorAction SilentlyContinue
    
    # Force clear the local token cache folder if it exists
    $CachePath = "$env:USERPROFILE\.mg"
    if (Test-Path $CachePath) {
        try { Remove-Item $CachePath -Recurse -Force -ErrorAction SilentlyContinue } catch {}
    }
    
    Write-Host "Opening Microsoft Login... (Please select the correct account)" -ForegroundColor Cyan
    
    $RequiredScopes = @(
        "Application.ReadWrite.All", 
        "AppRoleAssignment.ReadWrite.All", 
        "Directory.Read.All", 
        "RoleManagement.Read.Directory"
    )
    
    try {
        # In v2, -ContextScope Process is the most reliable way to force account selection
        # and prevent the session from saving to the machine permanently.
        Connect-MgGraph -Scopes $RequiredScopes -ContextScope Process
    
        $Context = Get-MgContext
        if ($null -eq $Context) { throw "Login was cancelled or failed." }
    
        $UserPrincipal = $Context.Account
        Write-Host "Logged in as: $UserPrincipal" -ForegroundColor Green
    
        # --- ROLE VALIDATION ---
        Write-Host "Verifying Directory Roles..." -ForegroundColor Gray
        $UserRoles = Get-MgUserMemberOf -UserId $Context.Account -All | Where-Object { $_.AdditionalProperties.displayName -ne $null }
        
        $Authorized = $false
        $RequiredRoles = @("Global Administrator", "Privileged Role Administrator")
    
        foreach ($role in $UserRoles) {
            $roleName = $role.AdditionalProperties.displayName
            if ($roleName -in $RequiredRoles) {
                $Authorized = $true
                Write-Host "Access Granted: $roleName" -ForegroundColor Green
                break
            }
        }
    
        if (-not $Authorized) {
            Write-Host "`nCRITICAL ERROR: Insufficient Privileges." -ForegroundColor Red
            Write-Host "Account must be 'Global Administrator' or 'Privileged Role Administrator'." -ForegroundColor Yellow
            Disconnect-MgGraph
            Read-Host "`nPress Enter to exit"; exit
        }
    
    } catch {
        Write-Error "Login failed: $_"
        Read-Host "Press Enter to exit"; exit
    }
    
    # --- USER INPUT ---
    Write-Host "`n--- APPLICATION SETUP ---" -ForegroundColor Cyan
    $InputName = Read-Host "Enter the name for your new Entra ID Application (Default: Workspace Migration App)"
    $AppName = if ([string]::IsNullOrWhiteSpace($InputName)) { "Workspace Migration App" } else { $InputName }
    
    # --- CONFIGURATION ---
    # Updated Map containing all the requested application permissions
    $PermissionMap = @{
        "member.read.hidden"          = "Member.Read.Hidden"
        "organization.read.all"       = "Organization.Read.All"
        "channelmember.read.all"      = "ChannelMember.Read.All"
        "channelmessage.read.all"     = "ChannelMessage.Read.All"
        "channelsettings.read.all"    = "ChannelSettings.Read.All"
        "group.read.all"              = "Group.Read.All"
        "team.readbasic.all"          = "Team.ReadBasic.All"
        "teammember.read.all"         = "TeamMember.Read.All"
        "user.read.all"               = "User.Read.All"
        application.read.all        = Application.Read.All
    }
    
    $TenantId = $Context.TenantId
    $GraphAppId = "00000003-0000-0000-c000-000000000000"
    
    try {
        # --- STEP 1: REGISTER APPLICATION ---
        Write-Host "Creating Application: $AppName..." -ForegroundColor Cyan
        $Application = New-MgApplication -BodyParameter @{
            displayName = $AppName
            signInAudience = "AzureADMyOrg"
        }
        
        # --- STEP 2: PREPARE SERVICE PRINCIPAL ---
        $NewServicePrincipal = New-MgServicePrincipal -BodyParameter @{ appId = $Application.AppId }
    
        Write-Host "Waiting 10 seconds for replication..." -ForegroundColor DarkGray
        Start-Sleep -Seconds 10
    
        # --- STEP 3: CONFIGURE & GRANT PERMISSIONS ---
        Write-Host "Configuring API Permissions & Granting Admin Consent..." -ForegroundColor Cyan
        $GraphSP = Get-MgServicePrincipal -Filter "AppId eq '$GraphAppId'" | Select-Object -First 1
        
        $ResourceAccessList = @()
    
        foreach ($key in $PermissionMap.Keys) {
            $RealRoleName = $PermissionMap[$key]
            $Role = $GraphSP.AppRoles | Where-Object { $_.Value -eq $RealRoleName }
    
            if ($Role) {
                $ResourceAccessList += @{ id = $Role.Id; type = "Role" }
    
                New-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $NewServicePrincipal.Id -BodyParameter @{
                    principalId = $NewServicePrincipal.Id
                    resourceId  = $GraphSP.Id
                    appRoleId   = $Role.Id
                } | Out-Null
                Write-Host " - Granted: $RealRoleName" -ForegroundColor Gray
            }
        }
    
        Update-MgApplication -ApplicationId $Application.Id -RequiredResourceAccess @(@{
            resourceAppId  = $GraphAppId
            resourceAccess = $ResourceAccessList
        })
    
        # --- STEP 4: CREATE CLIENT SECRET ---
        Write-Host "Generating Client Secret..." -ForegroundColor Cyan
        $ExpiryDate = (Get-Date).AddYears(2).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ")
        $PasswordCred = Add-MgApplicationPassword -ApplicationId $Application.Id -BodyParameter @{
            passwordCredential = @{
                displayName = "MigrationToolSecret"
                endDateTime = $ExpiryDate
            }
        }
    
        # --- OUTPUT ---
        Write-Host "`n-------------------------------------------------------" -ForegroundColor Yellow
        Write-Host "        SETUP COMPLETE - SAVE THESE DETAILS" -ForegroundColor Yellow
        Write-Host "-------------------------------------------------------" -ForegroundColor Yellow
        Write-Host "Application Name        : $AppName"
        Write-Host "Application (Client) ID : $($Application.AppId)"
        Write-Host "Client Secret Value     : $($PasswordCred.SecretText)"
        Write-Host "Directory (Tenant) ID   : $TenantId"
        Write-Warning "IMPORTANT: Copy the Client Secret Value immediately."
    
    }
    catch {
        Write-Error "Operation failed: $_"
    }
    
    # --- FINAL DISCONNECT ---
    Disconnect-MgGraph
    Read-Host "`nPress Enter to close this window"
        
  7. 次の認証情報をメモして、安全に保管してください。認証情報が漏洩すると、ハッカーが Teams のすべてのデータにアクセスできるようになります。
    • クライアント シークレット
    • アプリケーション(クライアント)ID
    • ディレクトリ(テナント)ID

オプション 2: Windows PowerShell を使用する

  1. Windows で、新しいプレーン テキスト ファイルを作成し、migration_app_creator.ps1 という名前を付けます。
  2. 次のコードブロックをコピーして新しいファイルに貼り付け、[Run with PowerShell] をクリックします。
  3.      <#    
    .SYNOPSIS    
    Automates the creation of a Single-Tenant Entra ID App for Workspace Migration.    
    Strictly forces account selection and verifies specific Admin roles.    
    #>
    
    # Check if the module is missing
    if (-not (Get-Module -ListAvailable -Name Microsoft.Graph.Authentication)) {
        Write-Host "Microsoft Graph module is NOT installed." -ForegroundColor Yellow
        $UserResponse = Read-Host "Would you like to try installing Microsoft Graph? (Y/N)"
    
        if ($UserResponse -ieq "Y") {
            try {
                # Use only native cmdlets, no .NET property setting
                Install-Module -Name Microsoft.Graph -Scope CurrentUser -Force -AllowClobber
                Write-Host "Installation complete!" -ForegroundColor Green
            }
            catch {
                Write-Error "Policy is blocking installation. Please contact IT to install Microsoft.Graph module."
                Read-Host "Press Enter to exit"; exit
            }
        }
        else {
            exit
        }
    } else {
        Write-Host "Microsoft Graph modules detected. Proceeding..." -ForegroundColor Green
    }
    
    # --- STEP 0: THE "DEEP" LOGOUT ---
    Write-Host "Forcing session cleanup..." -ForegroundColor Gray
    Disconnect-MgGraph -ErrorAction SilentlyContinue
    
    # Force clear the local token cache folder if it exists
    $CachePath = "$env:USERPROFILE\.mg"
    if (Test-Path $CachePath) {
        try { Remove-Item $CachePath -Recurse -Force -ErrorAction SilentlyContinue } catch {}
    }
    
    Write-Host "Opening Microsoft Login... (Please select the correct account)" -ForegroundColor Cyan
    
    $RequiredScopes = @(
        "Application.ReadWrite.All", 
        "AppRoleAssignment.ReadWrite.All", 
        "Directory.Read.All", 
        "RoleManagement.Read.Directory"
    )
    
    try {
        # In v2, -ContextScope Process is the most reliable way to force account selection
        # and prevent the session from saving to the machine permanently.
        Connect-MgGraph -Scopes $RequiredScopes -ContextScope Process
    
        $Context = Get-MgContext
        if ($null -eq $Context) { throw "Login was cancelled or failed." }
    
        $UserPrincipal = $Context.Account
        Write-Host "Logged in as: $UserPrincipal" -ForegroundColor Green
    
        # --- ROLE VALIDATION ---
        Write-Host "Verifying Directory Roles..." -ForegroundColor Gray
        $UserRoles = Get-MgUserMemberOf -UserId $Context.Account -All | Where-Object { $_.AdditionalProperties.displayName -ne $null }
        
        $Authorized = $false
        $RequiredRoles = @("Global Administrator", "Privileged Role Administrator")
    
        foreach ($role in $UserRoles) {
            $roleName = $role.AdditionalProperties.displayName
            if ($roleName -in $RequiredRoles) {
                $Authorized = $true
                Write-Host "Access Granted: $roleName" -ForegroundColor Green
                break
            }
        }
    
        if (-not $Authorized) {
            Write-Host "`nCRITICAL ERROR: Insufficient Privileges." -ForegroundColor Red
            Write-Host "Account must be 'Global Administrator' or 'Privileged Role Administrator'." -ForegroundColor Yellow
            Disconnect-MgGraph
            Read-Host "`nPress Enter to exit"; exit
        }
    
    } catch {
        Write-Error "Login failed: $_"
        Read-Host "Press Enter to exit"; exit
    }
    
    # --- USER INPUT ---
    Write-Host "`n--- APPLICATION SETUP ---" -ForegroundColor Cyan
    $InputName = Read-Host "Enter the name for your new Entra ID Application (Default: Workspace Migration App)"
    $AppName = if ([string]::IsNullOrWhiteSpace($InputName)) { "Workspace Migration App" } else { $InputName }
    
    # --- CONFIGURATION ---
    # Updated Map containing all the requested application permissions
    $PermissionMap = @{
        "member.read.hidden"          = "Member.Read.Hidden"
        "organization.read.all"       = "Organization.Read.All"
        "channelmember.read.all"      = "ChannelMember.Read.All"
        "channelmessage.read.all"     = "ChannelMessage.Read.All"
        "channelsettings.read.all"    = "ChannelSettings.Read.All"
        "group.read.all"              = "Group.Read.All"
        "team.readbasic.all"          = "Team.ReadBasic.All"
        "teammember.read.all"         = "TeamMember.Read.All"
        "user.read.all"               = "User.Read.All"
        application.read.all        = Application.Read.All
    }
    
    $TenantId = $Context.TenantId
    $GraphAppId = "00000003-0000-0000-c000-000000000000"
    
    try {
        # --- STEP 1: REGISTER APPLICATION ---
        Write-Host "Creating Application: $AppName..." -ForegroundColor Cyan
        $Application = New-MgApplication -BodyParameter @{
            displayName = $AppName
            signInAudience = "AzureADMyOrg"
        }
        
        # --- STEP 2: PREPARE SERVICE PRINCIPAL ---
        $NewServicePrincipal = New-MgServicePrincipal -BodyParameter @{ appId = $Application.AppId }
    
        Write-Host "Waiting 10 seconds for replication..." -ForegroundColor DarkGray
        Start-Sleep -Seconds 10
    
        # --- STEP 3: CONFIGURE & GRANT PERMISSIONS ---
        Write-Host "Configuring API Permissions & Granting Admin Consent..." -ForegroundColor Cyan
        $GraphSP = Get-MgServicePrincipal -Filter "AppId eq '$GraphAppId'" | Select-Object -First 1
        
        $ResourceAccessList = @()
    
        foreach ($key in $PermissionMap.Keys) {
            $RealRoleName = $PermissionMap[$key]
            $Role = $GraphSP.AppRoles | Where-Object { $_.Value -eq $RealRoleName }
    
            if ($Role) {
                $ResourceAccessList += @{ id = $Role.Id; type = "Role" }
    
                New-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $NewServicePrincipal.Id -BodyParameter @{
                    principalId = $NewServicePrincipal.Id
                    resourceId  = $GraphSP.Id
                    appRoleId   = $Role.Id
                } | Out-Null
                Write-Host " - Granted: $RealRoleName" -ForegroundColor Gray
            }
        }
    
        Update-MgApplication -ApplicationId $Application.Id -RequiredResourceAccess @(@{
            resourceAppId  = $GraphAppId
            resourceAccess = $ResourceAccessList
        })
    
        # --- STEP 4: CREATE CLIENT SECRET ---
        Write-Host "Generating Client Secret..." -ForegroundColor Cyan
        $ExpiryDate = (Get-Date).AddYears(2).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ")
        $PasswordCred = Add-MgApplicationPassword -ApplicationId $Application.Id -BodyParameter @{
            passwordCredential = @{
                displayName = "MigrationToolSecret"
                endDateTime = $ExpiryDate
            }
        }
    
        # --- OUTPUT ---
        Write-Host "`n-------------------------------------------------------" -ForegroundColor Yellow
        Write-Host "        SETUP COMPLETE - SAVE THESE DETAILS" -ForegroundColor Yellow
        Write-Host "-------------------------------------------------------" -ForegroundColor Yellow
        Write-Host "Application Name        : $AppName"
        Write-Host "Application (Client) ID : $($Application.AppId)"
        Write-Host "Client Secret Value     : $($PasswordCred.SecretText)"
        Write-Host "Directory (Tenant) ID   : $TenantId"
        Write-Warning "IMPORTANT: Copy the Client Secret Value immediately."
    
    }
    catch {
        Write-Error "Operation failed: $_"
    }
    
    # --- FINAL DISCONNECT ---
    Disconnect-MgGraph
    Read-Host "`nPress Enter to close this window"
        
  4. 次の認証情報をメモして、安全に保管してください。認証情報が漏洩すると、ハッカーが Teams のすべてのデータにアクセスできるようになります。
    • クライアント シークレット
    • アプリケーション(クライアント)ID
    • ディレクトリ(テナント)ID

Azure を使用して手動接続を設定する

Microsoft の具体的な手順は、Azure Portal のバージョンや Microsoft による更新によって異なる場合があります。アプリの登録と認可に関する最新のガイダンスについては、Microsoft のドキュメントをご覧ください。

手順 1: 新しいアプリケーションを登録する

セキュリティ上の理由から、新しいアプリケーションは単一のテナントとして登録することをおすすめします。

  1. 管理者として Azure ポータルにログインします。
  2. [Azure サービス] で、[アプリの登録] に移動します。
  3. [新規登録] をクリックし、アプリケーションの名前(高度なインポート アプリなど)を入力します。
  4. [サポートされているアカウントの種類] で、[この組織ディレクトリ内のアカウントのみ] をクリックして、単一テナント アプリケーションを作成します。
  5. [登録] をクリックします。

手順 2: API 権限を構成する

次のいずれかのオプションを選択します。

オプション 1: 権限を手動で追加する

  1. サイドバーの [管理] で、[API 権限] をクリックします。
  2. [権限を追加] 次に [Microsoft API] 次に [Microsoft Graph] をクリックします。
  3. [アプリケーションの権限] で、以下を選択します。
    • Application.Read.All
    • ChannelMember.Read.All
    • ChannelMessage.Read.All
    • ChannelSettings.Read.All
    • Group.Read.All
    • Member.Read.Hidden
    • Organization.Read.All
    • Team.ReadBasic.All
    • TeamMember.Read.All
    • User.Read.All
  4. [[組織名] に管理者の同意を与えます] をクリックします。

オプション 2: アプリケーション マニフェストを編集する

  1. アプリケーション マニフェストを開きます。
  2. “resourceAccess” : [ ] に移動し、次のいずれかのオプションを選択します。
    • “resourceAccess” : [ ] にすでに値がある場合は、カンマを追加してから次のコードブロックを貼り付けます。
    • “resourceAccess” : [ ] に値がない場合は、次のコードブロックをコピーして貼り付けます。

    { "id": "658aa5d8-239f-45c4-aa12-864f4fc7e490", "type": "Role" },

    { "id": "498476ce-e0fe-48b0-b801-37ba7e2685c6", "type": "Role" },

    { "id": "3b55498e-47ec-484f-8136-9013221c06a9", "type": "Role" },

    { "id": "7b2449af-6ccd-4f4d-9f78-e550c193f0d1", "type": "Role" },

    { "id": "c97b873f-f59f-49aa-8a0e-52b32d762124", "type": "Role" },

    { "id": "5b567255-7703-4780-807c-7be8301ae99b", "type": "Role" },

    { "id": "2280dda6-0bfd-44ee-a2f4-cb867cfc4c1e", "type": "Role" },

    { "id": "660b7406-55f1-41ca-a0ed-0b035e182f3e", "type": "Role" },

    { "id": "df021288-bdef-4463-88db-98f22de89214", "type": "Role" },

    { "id": "9a5d68dd-52b0-4cc2-bd40-abcf44ac3a30", "type": "Role" }

  3. [[組織名] に管理者の同意を与えます] をクリックします。

ステップ 3: クライアント シークレットを生成する

  1. サイドバーの [管理] で、[証明書とシークレット] 次に [新しいクライアント シークレット] をクリックします。
  2. 説明を入力し、有効期限を選択して、[追加] をクリックします。
  3. クライアント シークレットの値をコピーして安全に保管します。値は 1 回だけ表示されます。

ステップ 4: アプリケーションの認証情報を収集する

重要: アプリケーションの認証情報は安全に保管してください。認証情報が漏洩すると、ハッカーが Teams のすべてのデータにアクセスできるようになります。

[概要] をクリックし、次の認証情報を安全な場所にメモします。

  • アプリケーション(クライアント)ID
  • ディレクトリ(テナント)ID


Google、Google Workspace、および関連するマークとロゴは、Google LLC の商標です。その他すべての企業名および商品名は関連各社の商標です。