メインコンテンツにスキップ

PowerShell メールボックス移行用の Azure アプリ登録を設定する

サインインしたユーザーアカウントなしで ShareGate Migrate の PowerShell メールボックス移行を実行するために、Azure アプリ登録を設定する方法。

注: PowerShell 統合には、ShareGate Migrate のProまたはEnterpriseサブスクリプションが必要です。Essentialsプランでは利用できません。

この記事は、ShareGate Migrate のPowerShell integration専用です。アプリケーション専用認証を使用すると、サインインしたユーザーアカウントなしで PowerShell からメールボックス移行を実行できます。ShareGate Migrate は、ユーザー資格情報の代わりに Azure アプリ登録を使用して認証します。これは、エンタープライズ環境における自動化された移行やスケジュール設定された移行に適しています。

設定中に、ShareGate の PowerShell コマンドに渡す2つの値(Application (client) IDDirectory (tenant) ID)を取得します。

始める前に

  • ShareGate Migrate のProまたはEnterpriseサブスクリプション

  • アプリ登録を作成し、管理者の同意を付与するために必要な、移行元と移行先両方の Microsoft 365 テナントに対するGlobal Administratorアクセス権

シングルテナントとマルチテナント

2つの用語の違いを理解しておくと、適切な設定を選択するのに役立ちます。

  • アプリ登録は、アプリケーションの設計図です。アプリ登録はホームテナント(作成したテナント)に存在し、アプリのID、API 権限、証明書を定義します。

  • エンタープライズアプリケーション(サービスプリンシパルとも呼ばれます)は、特定のテナント内にあるそのアプリのローカルインスタンスです。管理者の同意を付与し、ロールを割り当てる対象となるのはこのインスタンスです。

移行するテナントの数に応じて選択してください。

  • シングルテナント: アプリは登録したテナント内でのみ使用されます。Supported account typesMy organization onlyを選択します。2つのテナント間で移行する場合は、各テナントで完全な設定を繰り返してください。

  • マルチテナント: ホームテナントに1つのアプリ登録を作成し、複数のテナントで再利用します。これは、コンサルタント、マネージドサービスプロバイダー、および移行元から移行先への移行で一般的に選択される方法です。Supported account typesMultiple Entra ID tenantsを選択し、Allow all tenantsを選択したままにします。その後、追加の各テナントでアプリへの同意を行い、Exchange Administrator ロールを割り当てます。詳細は、以下の追加のテナントを設定するを参照してください。

マルチテナントアプリの場合、資格情報オブジェクトを一度構築し、テナントごとに異なる-TenantIdConnect-MicrosoftOnlineに渡します。

アプリ登録を設定する

これはホームテナントで行います。シングルテナントアプリの場合は、移行元・移行先の各テナントで繰り返してください。マルチテナントアプリの場合は、一度だけ行い、その後は以下の追加のテナントを設定するの手順に従ってください。

オプション1: Azure portal での手動設定

手順1: アプリ登録を作成する

  1. Global Administrator としてMicrosoft Entra admin centerにサインインします。

  2. Entra ID > App registrations > New registrationに移動します。

  3. アプリに名前を付けます(例: ShareGate Mailbox Migration)。

  4. Supported account typesで、シナリオに合ったオプションを選択します。上記のシングルテナントとマルチテナントを参照してください。

  5. Redirect URIは今のところ空欄のままにします。

  6. Registerをクリックします。

  7. Overviewページで、Application (client) IDDirectory (tenant) IDをコピーします。これらはNew-AzureApplicationConnect-MicrosoftOnlineで使用します。また、手順4のロール割り当てのためにDisplay nameまたはObject IDも控えておいてください。

手順2: 返信URLを追加する

注: この手順はマルチテナントアプリで必須です。少なくとも1つの返信URLがないと、管理者の同意が完了しません。https://go.sharegate.com/vmenは、同意が正常に完了したことを確認する ShareGate のランディングページです。

  1. アプリ登録内でAuthenticationに移動し、+ Add Redirect URIをクリックします。

  2. Web platformペインのRedirect URIhttps://go.sharegate.com/vmenを入力します。

  3. Configureをクリックします。

手順3: API 権限を追加する

以下の2つの方法のいずれかを選択します。

オプションA: Azure portal で手動設定する

  1. API permissions > Add a permissionに移動します。

  2. 以下に記載されている各Application permissions(Delegated ではありません)を追加します。Microsoft Graph の権限と Office 365 Exchange Online の権限は別々に追加します。

  3. Grant admin consent for [your tenant]をクリックして確定します。

Microsoft Graph の権限:

Mail.ReadWrite

メールアイテム

Calendars.ReadWrite

カレンダーイベント

Contacts.ReadWrite

連絡先

MailboxSettings.ReadWrite

メールボックス設定

User.Read.All

メールボックスの一覧表示、ユーザープロファイル

Directory.Read.All

ライセンスの検証

Organization.Read.All

ドメインの検証

Office 365 Exchange Online の権限:

注: これらの権限は Microsoft Graph ではなく、Office 365 Exchange Onlineにあります。Exchange.ManageAsAppV2ではなくExchange.ManageAsAppを使用してください。

full_access_as_app

アーカイブメールボックスおよびグループメールボックス(EWS)

Exchange.ManageAsApp

メールボックス管理

オプションB: アプリマニフェスト経由

これにより、JSON スニペットを貼り付けるだけですべての権限を一度に追加でき、手動選択によるミスを回避できます。

  1. アプリ登録内でManifestに移動します。

  2. requiredResourceAccess配列を見つけて、以下の内容に置き換えます。

    "requiredResourceAccess": [
    {
    "resourceAppId": "00000002-0000-0ff1-ce00-000000000000",
    "resourceAccess": [
    { "id": "dc50a0fb-09a3-484d-be87-e023b12c6440", "type": "Role" },
    { "id": "dc890d15-9560-4a4c-9b7f-a736ec74ec40", "type": "Role" }
    ]
    },
    {
    "resourceAppId": "00000003-0000-0000-c000-000000000000",
    "resourceAccess": [
    { "id": "ef54d2bf-783f-4e0f-bca1-3210c0444d99", "type": "Role" },
    { "id": "6918b873-d17a-4dc1-b314-35f528134491", "type": "Role" },
    { "id": "7ab1d382-f21e-4acd-a863-ba3e13f7da61", "type": "Role" },
    { "id": "e2a3a72e-5f79-4c64-b1b1-878b674786c9", "type": "Role" },
    { "id": "6931bccd-447a-43d1-b442-00a195474933", "type": "Role" },
    { "id": "498476ce-e0fe-48b0-b801-37ba7e2685c6", "type": "Role" },
    { "id": "df021288-bdef-4463-88db-98f22de89214", "type": "Role" }
    ]
    }
    ]
  3. Saveをクリックします。

  4. API permissionsに移動し、Grant admin consent for [your tenant]をクリックして確定します。

手順4: Exchange Administrator ロールを割り当てる

注: この手順は、アーカイブ管理、訴訟ホールド、およびメールボックスサイズの操作に必要です。

Exchange Administrator はディレクトリレベルのロールであるため、アプリ登録のRoles and administratorsページから直接割り当てることはできません。以下の手順で、ディレクトリレベルの割り当て画面に移動します。

  1. アプリ登録内でRoles and administratorsに移動します。

  2. 「Directory-level roles have inherited access to this resource and can only be assigned at the directory level here」と表示されている行のhereをクリックして、ディレクトリレベルのロール割り当て画面を開きます。

  3. Exchange Administratorを検索して選択します。

  4. + Add assignmentsをクリックし、次にSelect member(s)をクリックします。

  5. アプリ登録のDisplay nameまたはObject IDを検索して選択し、Selectをクリックします。

  6. Nextをクリックし、次にAssignをクリックします。

オプション2: PowerShell によるクイック設定(推奨)

このスクリプトは、オプション1のすべての手順を自動化します。アプリ登録の作成、返信URLの追加、必要な権限の付与、Exchange Administrator ロールの割り当てを行います。資格情報の作成は行いません。これは以下の資格情報を追加するで行います。

まず、Microsoft Graph PowerShell SDK をインストールします(1回のみ)。

Install-Module Microsoft.Graph -Scope CurrentUser

次に、ホームテナントの Global Administrator としてサインインした状態で、以下を実行します。マルチテナントアプリの場合は$multiTenant = $trueに設定します。

$ErrorActionPreference = 'Stop'
$displayName = 'ShareGate Mailbox Migration'
$multiTenant = $false # set to $true to allow the app to be consented in other tenants
$replyUrl = 'https://go.sharegate.com/vmen'

$signInAudience = if ($multiTenant) { 'AzureADMultipleOrgs' } else { 'AzureADMyOrg' }

# Well-known resource app IDs
$graphAppId = '00000003-0000-0000-c000-000000000000' # Microsoft Graph
$exoAppId = '00000002-0000-0ff1-ce00-000000000000' # Office 365 Exchange Online

# Application permissions to grant
$graphRoleIds = @(
'e2a3a72e-5f79-4c64-b1b1-878b674786c9', # Mail.ReadWrite
'ef54d2bf-783f-4e0f-bca1-3210c0444d99', # Calendars.ReadWrite
'6918b873-d17a-4dc1-b314-35f528134491', # Contacts.ReadWrite
'6931bccd-447a-43d1-b442-00a195474933', # MailboxSettings.ReadWrite
'df021288-bdef-4463-88db-98f22de89214', # User.Read.All
'7ab1d382-f21e-4acd-a863-ba3e13f7da61', # Directory.Read.All
'498476ce-e0fe-48b0-b801-37ba7e2685c6' # Organization.Read.All
)
$exoRoleIds = @(
'dc50a0fb-09a3-484d-be87-e023b12c6440', # full_access_as_app
'dc890d15-9560-4a4c-9b7f-a736ec74ec40' # Exchange.ManageAsApp
)
$exchangeAdminRoleId = '29232cdf-9323-42fd-ade2-1d097af3e4de' # Exchange Administrator (built-in)

# 1. Sign in
Connect-MgGraph -Scopes 'Application.ReadWrite.All','AppRoleAssignment.ReadWrite.All','RoleManagement.ReadWrite.Directory'

# 2. Create the app registration
$requiredResourceAccess = @(
@{ ResourceAppId = $graphAppId; ResourceAccess = @($graphRoleIds | ForEach-Object { @{ Id = $_; Type = 'Role' } }) },
@{ ResourceAppId = $exoAppId; ResourceAccess = @($exoRoleIds | ForEach-Object { @{ Id = $_; Type = 'Role' } }) }
)
$app = New-MgApplication -DisplayName $displayName -SignInAudience $signInAudience `
-Web @{ RedirectUris = @($replyUrl) } `
-RequiredResourceAccess $requiredResourceAccess

# 3. Create the service principal
$sp = New-MgServicePrincipal -AppId $app.AppId
Start-Sleep -Seconds 10 # let the service principal replicate

# 4. Grant admin consent
$graphSp = Get-MgServicePrincipal -Filter "appId eq '$graphAppId'"
$exoSp = Get-MgServicePrincipal -Filter "appId eq '$exoAppId'"
foreach ($roleId in $graphRoleIds) {
New-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $sp.Id -PrincipalId $sp.Id -ResourceId $graphSp.Id -AppRoleId $roleId | Out-Null
}
foreach ($roleId in $exoRoleIds) {
New-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $sp.Id -PrincipalId $sp.Id -ResourceId $exoSp.Id -AppRoleId $roleId | Out-Null
}

# 5. Assign the Exchange Administrator role
New-MgRoleManagementDirectoryRoleAssignment -PrincipalId $sp.Id -RoleDefinitionId $exchangeAdminRoleId -DirectoryScopeId '/' | Out-Null

# 6. Output the values you'll use with ShareGate
[pscustomobject]@{
DisplayName = $displayName
ApplicationId = $app.AppId
TenantId = (Get-MgContext).TenantId
} | Format-List

出力からApplicationIdTenantIdをコピーします。これらは接続時に使用します。マルチテナントアプリの場合、これはホームテナントのみを設定します。追加の各テナントについては、以下の追加のテナントを設定するの手順に従ってください。

追加のテナントを設定する

注: このセクションはマルチテナントアプリにのみ適用されます。アプリ登録とその資格情報はホームテナントに存在します。別のテナントでアプリを使用するには、そのテナントの管理者がアプリに同意し、Exchange Administrator ロールを割り当てる必要があります。追加の各テナントについてこれを繰り返してください。

追加のテナントの管理者が、以下のURLをブラウザで開き、プレースホルダーを置き換えて、そのテナントの Global Administrator としてサインインします。

https://login.microsoftonline.com/<additional-tenant-id-or-domain>/adminconsent?client_id=<application-client-id>

権限を確認して承諾すると、ブラウザは ShareGate の確認ページにリダイレクトされます。これにより、そのテナント内にアプリのエンタープライズアプリケーション(サービスプリンシパル)がプロビジョニングされます。

2. 追加のテナントで Exchange Administrator ロールを割り当てる

追加のテナントにサインインした状態で、次の手順を行います。

  1. Entra ID > Roles & adminsに移動します。

  2. Exchange Administratorを検索して選択します。

  3. + Add assignmentsをクリックし、次にSelect member(s)をクリックします。

  4. アプリのDisplay nameまたはApplication (client) IDで検索して選択し、Selectをクリックします。

  5. Nextをクリックし、次にAssignをクリックします。

資格情報を追加する

New-AzureApplicationは、2種類の証明書ベースの認証方法をサポートしています。いずれかを選択してください。

オプションA: 証明書(ファイルから)

  1. Certificates & secrets > Certificates > Upload certificateに移動します。

  2. .cerまたは.pem形式の公開鍵ファイルをアップロードします。

  3. 秘密鍵(.pfx)は、実行時に PowerShell からアクセスできる状態にしておきます。

オプションB: 証明書のサムプリント(Windows Certificate Store)

  1. 移行を実行するマシンの Windows Certificate Store に、証明書(秘密鍵を含む)をインストールします。

  2. Certificates & secrets > Certificates > Upload certificateに移動し、公開鍵をアップロードします。

  3. サムプリントを控えておきます。これはNew-AzureApplicationに直接渡します。

注: マルチテナントアプリの場合、資格情報はホームテナントのアプリ登録に一度だけアップロードします。同じ資格情報が、アプリが同意されているすべてのテナントで機能します。

ShareGate から接続する

New-AzureApplicationで資格情報オブジェクトを構築し、Connect-MicrosoftOnlineで接続します。対象テナントは-TenantIdで渡します。

# Build a credential object from a certificate thumbprint
$azureApp = New-AzureApplication -ClientId <application-client-id> -Thumbprint <certificate-thumbprint>

# Connect to a tenant
Connect-MicrosoftOnline -TenantId <directory-tenant-id> -AzureApplication $azureApp

マルチテナントアプリの場合、同じ$azureAppオブジェクトを再利用し、テナントごとに-TenantIdを変更します。

Connect-MicrosoftOnline -TenantId <source-tenant-id> -AzureApplication $azureApp
Connect-MicrosoftOnline -TenantId <destination-tenant-id> -AzureApplication $azureApp

注: セキュリティポリシーにより必要な権限のいずれかを付与できない場合は、Connect-MicrosoftOnline-AllowMissingPermissionsを追加すると、そのまま接続できます。不足している権限に依存する操作は、Forbidden エラーで失敗します。このスイッチは、認証成功後の権限チェックを緩和するだけです。サインインの失敗を解決するものではありません。

既知の制限事項

  • グループカレンダーは、アプリケーション専用認証ではサポートされていません。これは Microsoft Graph API の制限であり、すべての移行ツールに影響します。

この記事はAIによって翻訳されています。ご不明な点がある場合は、英語の原文をご確認ください。

こちらの回答で解決しましたか?