PowerShell または Microsoft Graph API を使用してテナント間同期を構成する
この記事では、Microsoft Graph PowerShell または Microsoft Graph API を使用してテナント間同期を構成する主要な手順について説明します。 構成すると、Microsoft Entra ID では、ターゲット テナント内の B2B ユーザーが自動的にプロビジョニングおよびプロビジョニング解除されます。 Microsoft Entra 管理センターを使用する詳細な手順については、「テナント間同期を構成する」を参照してください。
前提条件
ソース テナント
- Microsoft Entra ID P1 または P2 ライセンス。 詳細については、「License requirements ライセンスの要件」を参照してください。
- テナント間アクセス設定を構成するためのセキュリティ管理者ロール。
- テナント間同期を構成するためのハイブリッド ID の管理者ロール。
- 構成へのユーザーの割り当てと、構成の削除を行うクラウド アプリケーション管理者またはアプリケーション管理者ロール。
- 必要なアクセス許可に同意するためのグローバル管理者ロール。
ターゲット テナント
- Microsoft Entra ID P1 または P2 ライセンス。 詳細については、「License requirements ライセンスの要件」を参照してください。
- テナント間アクセス設定を構成するためのセキュリティ管理者ロール。
- 必要なアクセス許可に同意するためのグローバル管理者ロール。
手順 1: ターゲット テナントにサインインする
ターゲット テナント
PowerShell を開始します。
必要に応じて、Microsoft Graph PowerShell SDK をインストールします。
ソースとターゲットのテナントのテナント ID を取得し、変数を初期化します。
$SourceTenantId = "<SourceTenantId>" $TargetTenantId = "<TargetTenantId>"
Connect-MgGraph コマンドを使用してターゲット テナントにサインインし、次の必要なアクセス許可に同意します。
Policy.Read.All
Policy.ReadWrite.CrossTenantAccess
Connect-MgGraph -TenantId $TargetTenantId -Scopes "Policy.Read.All","Policy.ReadWrite.CrossTenantAccess"
手順 2: ターゲット テナントでユーザーの同期を有効にする
ターゲット テナント
ターゲット テナントで、New-MgPolicyCrossTenantAccessPolicyPartner コマンドを使用して、ターゲット テナントとソース テナントの間のテナント間アクセス ポリシーに新しいパートナー構成を作成します。 要求でソース テナント ID を使用します。
エラー
New-MgPolicyCrossTenantAccessPolicyPartner_Create: Another object with the same value for property tenantId already exists
が発生した場合は、既存の構成が既に存在する可能性があります。 詳細については、「現象 - New-MgPolicyCrossTenantAccessPolicyPartner_Create エラー」を参照してください。$Params = @{ TenantId = $SourceTenantId } New-MgPolicyCrossTenantAccessPolicyPartner -BodyParameter $Params | Format-List
AutomaticUserConsentSettings : Microsoft.Graph.PowerShell.Models.MicrosoftGraphInboundOutboundPolicyConfiguration B2BCollaborationInbound : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting B2BCollaborationOutbound : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting B2BDirectConnectInbound : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting B2BDirectConnectOutbound : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting IdentitySynchronization : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantIdentitySyncPolicyPartner InboundTrust : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyInboundTrust IsServiceProvider : TenantId : <SourceTenantId> TenantRestrictions : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyTenantRestrictions AdditionalProperties : {[@odata.context, https://graph.microsoft.com/v1.0/$metadata#policies/crossTenantAccessPolicy/partners/$entity], [crossCloudMeetingConfiguration, System.Collections.Generic.Dictionary`2[System.String,System.Object]], [protectedContentSharing, System.Collections.Generic.Dictionary`2[System.String,System.Object]]}
Invoke-MgGraphRequest コマンドを使用して、ターゲット テナントでユーザー同期を有効にします。
Request_MultipleObjectsWithSameKeyValue
エラーが発生した場合は、既存のポリシーが既に存在する可能性があります。 詳細については、「現象 - Request_MultipleObjectsWithSameKeyValue エラー」を参照してください。$Params = @{ userSyncInbound = @{ isSyncAllowed = $true } } Invoke-MgGraphRequest -Method PUT -Uri "https://graph.microsoft.com/v1.0/policies/crossTenantAccessPolicy/partners/$SourceTenantId/identitySynchronization" -Body $Params
Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization コマンドを使用して、
IsSyncAllowed
が True に設定されていることを確認します。(Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization -CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId).UserSyncInbound
IsSyncAllowed ------------- True
手順 3: ターゲット テナントで招待を自動的に引き換える
ターゲット テナント
ターゲット テナントで、Update-MgPolicyCrossTenantAccessPolicyPartner コマンドを使用して、招待を自動的に引き換え、受信アクセスの同意プロンプトを抑制します。
$AutomaticUserConsentSettings = @{ "InboundAllowed"="True" } Update-MgPolicyCrossTenantAccessPolicyPartner -CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId -AutomaticUserConsentSettings $AutomaticUserConsentSettings
手順 4: ソース テナントにサインインする
ソース テナント
PowerShell のインスタンスを開始します。
ソースとターゲットのテナントのテナント ID を取得し、変数を初期化します。
$SourceTenantId = "<SourceTenantId>" $TargetTenantId = "<TargetTenantId>"
Connect-MgGraph コマンドを使用してソース テナントにサインインし、次の必要なアクセス許可に同意します。
Policy.Read.All
Policy.ReadWrite.CrossTenantAccess
Application.ReadWrite.All
Directory.ReadWrite.All
AuditLog.Read.All
Connect-MgGraph -TenantId $SourceTenantId -Scopes "Policy.Read.All","Policy.ReadWrite.CrossTenantAccess","Application.ReadWrite.All","Directory.ReadWrite.All","AuditLog.Read.All"
手順 5: ソース テナントで招待を自動的に引き換える
ソース テナント
ソース テナントで、New-MgPolicyCrossTenantAccessPolicyPartner コマンドを使用して、ソース テナントとターゲット テナントの間のテナント間アクセス ポリシーに新しいパートナー構成を作成します。 要求でターゲット テナント ID を使用します。
エラー
New-MgPolicyCrossTenantAccessPolicyPartner_Create: Another object with the same value for property tenantId already exists
が発生した場合は、既存の構成が既に存在する可能性があります。 詳細については、「現象 - New-MgPolicyCrossTenantAccessPolicyPartner_Create エラー」を参照してください。$Params = @{ TenantId = $TargetTenantId } New-MgPolicyCrossTenantAccessPolicyPartner -BodyParameter $Params | Format-List
AutomaticUserConsentSettings : Microsoft.Graph.PowerShell.Models.MicrosoftGraphInboundOutboundPolicyConfiguration B2BCollaborationInbound : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting B2BCollaborationOutbound : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting B2BDirectConnectInbound : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting B2BDirectConnectOutbound : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting IdentitySynchronization : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantIdentitySyncPolicyPartner InboundTrust : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyInboundTrust IsServiceProvider : TenantId : <TargetTenantId> TenantRestrictions : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyTenantRestrictions AdditionalProperties : {[@odata.context, https://graph.microsoft.com/v1.0/$metadata#policies/crossTenantAccessPolicy/partners/$entity], [crossCloudMeetingConfiguration, System.Collections.Generic.Dictionary`2[System.String,System.Object]], [protectedContentSharing, System.Collections.Generic.Dictionary`2[System.String,System.Object]]}
Update-MgPolicyCrossTenantAccessPolicyPartner コマンドを使用して、招待を自動的に引き換え、送信アクセスの同意プロンプトを抑制します。
$AutomaticUserConsentSettings = @{ "OutboundAllowed"="True" } Update-MgPolicyCrossTenantAccessPolicyPartner -CrossTenantAccessPolicyConfigurationPartnerTenantId $TargetTenantId -AutomaticUserConsentSettings $AutomaticUserConsentSettings
手順 6: ソース テナントで構成アプリケーションを作成する
ソース テナント
ソース テナントで、Invoke-MgInstantiateApplicationTemplate コマンドを使って、Microsoft Entra アプリケーション ギャラリーからテナントに構成アプリケーションのインスタンスを追加します。
Invoke-MgInstantiateApplicationTemplate -ApplicationTemplateId "518e5f48-1fc8-4c48-9387-9fdf28b0dfe7" -DisplayName "Fabrikam"
Get-MgServicePrincipal コマンドを使用して、サービス プリンシパル ID とアプリ ロール ID を取得します。
Get-MgServicePrincipal -Filter "DisplayName eq 'Fabrikam'" | Format-List
AccountEnabled : True AddIns : {} AlternativeNames : {} AppDescription : AppDisplayName : Fabrikam AppId : <AppId> AppManagementPolicies : AppOwnerOrganizationId : <AppOwnerOrganizationId> AppRoleAssignedTo : AppRoleAssignmentRequired : True AppRoleAssignments : AppRoles : {<AppRoleId>} ApplicationTemplateId : 518e5f48-1fc8-4c48-9387-9fdf28b0dfe7 ClaimsMappingPolicies : CreatedObjects : CustomSecurityAttributes : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCustomSecurityAttributeValue DelegatedPermissionClassifications : DeletedDateTime : Description : DisabledByMicrosoftStatus : DisplayName : Fabrikam Endpoints : ErrorUrl : FederatedIdentityCredentials : HomeRealmDiscoveryPolicies : Homepage : https://account.activedirectory.windowsazure.com:444/applications/default.aspx?metadata=aad2aadsync|ISV9.1|primary|z Id : <ServicePrincipalId> Info : Microsoft.Graph.PowerShell.Models.MicrosoftGraphInformationalUrl KeyCredentials : {} LicenseDetails : ...
サービス プリンシパル ID の変数を初期化します。
必ず、アプリケーション ID の代わりにサービス プリンシパル ID を使用してください。
$ServicePrincipalId = "<ServicePrincipalId>"
アプリ ロール ID の変数を初期化します。
$AppRoleId= "<AppRoleId>"
手順 7: ターゲット テナントへの接続をテストする
ソース テナント
ソース テナントで、Invoke-MgGraphRequest コマンドを使用して、ターゲット テナントへの接続をテストし、資格情報を検証します。
$Params = @{ "useSavedCredentials" = $false "templateId" = "Azure2Azure" "credentials" = @( @{ "key" = "CompanyId" "value" = $TargetTenantId } @{ "key" = "AuthenticationType" "value" = "SyncPolicy" } ) } Invoke-MgGraphRequest -Method POST -Uri "https://graph.microsoft.com/v1.0/servicePrincipals/$ServicePrincipalId/synchronization/jobs/validateCredentials" -Body $Params
手順 8: ソース テナントでプロビジョニング ジョブを作成する
ソース テナント
ソース テナントで、プロビジョニングを有効にするには、プロビジョニング ジョブを作成します。
使用する同期テンプレート (
Azure2Azure
など) を決定します。テンプレートには、事前に構成された同期設定が含まれています。
ソース テナントで、New-MgServicePrincipalSynchronizationJob コマンドを使用して、テンプレートに基づくプロビジョニング ジョブを作成します。
New-MgServicePrincipalSynchronizationJob -ServicePrincipalId $ServicePrincipalId -TemplateId "Azure2Azure" | Format-List
Id : <JobId> Schedule : Microsoft.Graph.PowerShell.Models.MicrosoftGraphSynchronizationSchedule Schema : Microsoft.Graph.PowerShell.Models.MicrosoftGraphSynchronizationSchema Status : Microsoft.Graph.PowerShell.Models.MicrosoftGraphSynchronizationStatus SynchronizationJobSettings : {AzureIngestionAttributeOptimization, LookaheadQueryEnabled} TemplateId : Azure2Azure AdditionalProperties : {[@odata.context, https://graph.microsoft.com/v1.0/$metadata#servicePrincipals('<ServicePrincipalId>')/synchro nization/jobs/$entity]}
ジョブ ID の変数を初期化します。
$JobId = "<JobId>"
手順 9: 資格情報を保存する
ソース テナント
ソース テナントで、Invoke-MgGraphRequest コマンドを使用して、資格情報を保存します。
$Params = @{ "value" = @( @{ "key" = "AuthenticationType" "value" = "SyncPolicy" } @{ "key" = "CompanyId" "value" = $TargetTenantId } ) } Invoke-MgGraphRequest -Method PUT -Uri "https://graph.microsoft.com/v1.0/servicePrincipals/$ServicePrincipalId/synchronization/secrets" -Body $Params
手順 10: 構成にユーザーを割り当てる
ソース テナント
テナント間同期が機能するには、少なくとも 1 人の内部ユーザーを構成に割り当てる必要があります。
ソース テナントで、New-MgServicePrincipalAppRoleAssignedTo コマンドを使用して、構成に内部ユーザーを割り当てます。
$Params = @{ PrincipalId = "<PrincipalId>" ResourceId = $ServicePrincipalId AppRoleId = $AppRoleId } New-MgServicePrincipalAppRoleAssignedTo -ServicePrincipalId $ServicePrincipalId -BodyParameter $Params | Format-List
AppRoleId : <AppRoleId> CreatedDateTime : 7/31/2023 10:27:12 PM DeletedDateTime : Id : <Id> PrincipalDisplayName : User1 PrincipalId : <PrincipalId> PrincipalType : User ResourceDisplayName : Fabrikam ResourceId : <ServicePrincipalId> AdditionalProperties : {[@odata.context, https://graph.microsoft.com/v1.0/$metadata#appRoleAssignments/$entity]}
手順 11: オンデマンドのプロビジョニングをテストする
ソース テナント
構成が完了したので、いずれかのユーザーでオンデマンド プロビジョニングをテストできます。
ソース テナントで、Get-MgServicePrincipalSynchronizationJobSchema コマンドを使用してスキーマ ルール ID を取得します。
$SynchronizationSchema = Get-MgServicePrincipalSynchronizationJobSchema -ServicePrincipalId $ServicePrincipalId -SynchronizationJobId $JobId $SynchronizationSchema.SynchronizationRules | Format-List
ContainerFilter : Microsoft.Graph.PowerShell.Models.MicrosoftGraphContainerFilter Editable : True GroupFilter : Microsoft.Graph.PowerShell.Models.MicrosoftGraphGroupFilter Id : <RuleId> Metadata : {defaultSourceObjectMappings, supportsProvisionOnDemand} Name : USER_INBOUND_USER ObjectMappings : {Provision Azure Active Directory Users, , , ...} Priority : 1 SourceDirectoryName : Azure Active Directory TargetDirectoryName : Azure Active Directory (target tenant) AdditionalProperties : {}
ルール ID の変数を初期化します。
$RuleId = "<RuleId>"
New-MgServicePrincipalSynchronizationJobOnDemand コマンドを使用して、オンデマンドでテスト ユーザーをプロビジョニングします。
$Params = @{ Parameters = @( @{ Subjects = @( @{ ObjectId = "<UserObjectId>" ObjectTypeName = "User" } ) RuleId = $RuleId } ) } New-MgServicePrincipalSynchronizationJobOnDemand -ServicePrincipalId $ServicePrincipalId -SynchronizationJobId $JobId -BodyParameter $Params | Format-List
Key : Microsoft.Identity.Health.CPP.Common.DataContracts.SyncFabric.StatusInfo Value : [{"provisioningSteps":[{"name":"EntryImport","type":"Import","status":"Success","description":"Retrieved User 'user1@fabrikam.com' from Azure Active Directory","timestamp":"2023-07-31T22:31:15.9116590Z","details":{"objectId": "<UserObjectId>","accountEnabled":"True","displayName":"User1","mailNickname":"user1","userPrincipalName":"use ... AdditionalProperties : {[@odata.context, https://graph.microsoft.com/v1.0/$metadata#microsoft.graph.stringKeyStringValuePair]}
手順 12: プロビジョニング ジョブを開始する
ソース テナント
これで、プロビジョニング ジョブが構成されたので、ソース テナントで、Start-MgServicePrincipalSynchronizationJob コマンドを使用してプロビジョニング ジョブを開始します。
Start-MgServicePrincipalSynchronizationJob -ServicePrincipalId $ServicePrincipalId -SynchronizationJobId $JobId
手順 13: プロビジョニングを監視する
ソース テナント
これで、プロビジョニング ジョブが実行中になったので、Get-MgServicePrincipalSynchronizationJob コマンドを使用して、現在のプロビジョニング サイクルの進行状況と、現在までの統計情報 (ターゲット システムで作成されたユーザーとグループの数など) を監視します。
Get-MgServicePrincipalSynchronizationJob -ServicePrincipalId $ServicePrincipalId -SynchronizationJobId $JobId | Format-List
Id : <JobId> Schedule : Microsoft.Graph.PowerShell.Models.MicrosoftGraphSynchronizationSchedule Schema : Microsoft.Graph.PowerShell.Models.MicrosoftGraphSynchronizationSchema Status : Microsoft.Graph.PowerShell.Models.MicrosoftGraphSynchronizationStatus SynchronizationJobSettings : {AzureIngestionAttributeOptimization, LookaheadQueryEnabled} TemplateId : Azure2Azure AdditionalProperties : {[@odata.context, https://graph.microsoft.com/v1.0/$metadata#servicePrincipals('<ServicePrincipalId>')/synchro nization/jobs/$entity]}
プロビジョニング ジョブの状態の監視に加えて、Get-MgAuditLogProvisioning コマンドを使用して、プロビジョニング ログを取得し、発生するすべてのプロビジョニング イベントを取得します。 たとえば、特定のユーザーについてクエリを実行し、正常にプロビジョニングされたかどうかを判断します。
Get-MgAuditLogDirectoryAudit | Select -First 10 | Format-List
ActivityDateTime : 7/31/2023 12:08:17 AM ActivityDisplayName : Export AdditionalDetails : {Details, ErrorCode, EventName, ipaddr...} Category : ProvisioningManagement CorrelationId : aaaa0000-bb11-2222-33cc-444444dddddd Id : Sync_aaaa0000-bb11-2222-33cc-444444dddddd_L5BFV_161778479 InitiatedBy : Microsoft.Graph.PowerShell.Models.MicrosoftGraphAuditActivityInitiator1 LoggedByService : Account Provisioning OperationType : Result : success ResultReason : User 'user2@fabrikam.com' was created in Azure Active Directory (target tenant) TargetResources : {<ServicePrincipalId>, } AdditionalProperties : {} ActivityDateTime : 7/31/2023 12:08:17 AM ActivityDisplayName : Export AdditionalDetails : {Details, ErrorCode, EventName, ipaddr...} Category : ProvisioningManagement CorrelationId : aaaa0000-bb11-2222-33cc-444444dddddd Id : Sync_aaaa0000-bb11-2222-33cc-444444dddddd_L5BFV_161778264 InitiatedBy : Microsoft.Graph.PowerShell.Models.MicrosoftGraphAuditActivityInitiator1 LoggedByService : Account Provisioning OperationType : Result : success ResultReason : User 'user2@fabrikam.com' was updated in Azure Active Directory (target tenant) TargetResources : {<ServicePrincipalId>, } AdditionalProperties : {} ActivityDateTime : 7/31/2023 12:08:14 AM ActivityDisplayName : Synchronization rule action AdditionalDetails : {Details, ErrorCode, EventName, ipaddr...} Category : ProvisioningManagement CorrelationId : aaaa0000-bb11-2222-33cc-444444dddddd Id : Sync_aaaa0000-bb11-2222-33cc-444444dddddd_L5BFV_161778395 InitiatedBy : Microsoft.Graph.PowerShell.Models.MicrosoftGraphAuditActivityInitiator1 LoggedByService : Account Provisioning OperationType : Result : success ResultReason : User 'user2@fabrikam.com' will be created in Azure Active Directory (target tenant) (User is active and assigned in Azure Active Directory, but no matching User was found in Azure Active Directory (target tenant)) TargetResources : {<ServicePrincipalId>, } AdditionalProperties : {}
トラブルシューティングのヒント
現象 - 不十分な特権エラー
アクションを実行しようとすると、次のようなメッセージが表示されます。
code: Authorization_RequestDenied
message: Insufficient privileges to complete the operation.
原因
サインインしているユーザーに十分な特権がないか、または必要なアクセス許可のいずれかに同意する必要があります。
解決方法
必要なロールが割り当てられていることを確認します。 この記事に出てきた「前提条件」を参照してください。
Connect-MgGraph でサインインするときは、必要なスコープを指定するようにしてください。 この記事の「手順 1: ターゲット テナントにサインインする」と「手順 4: ソース テナントにサインインする」を参照してください。
現象 - New-MgPolicyCrossTenantAccessPolicyPartner_Create エラー
新しいパートナー構成を作成しようとすると、次のようなエラー メッセージが表示されます。
New-MgPolicyCrossTenantAccessPolicyPartner_Create: Another object with the same value for property tenantId already exists.
原因
以前の構成からのものと思われる、既に存在する構成またはオブジェクトを作成しようとしている可能性があります。
解決方法
構文と、正しいテナント ID を使用していることを確認します。
Get-MgPolicyCrossTenantAccessPolicyPartner コマンドを使用して、既存のオブジェクトを一覧表示します。
既存のオブジェクトがある場合は、Update-MgPolicyCrossTenantAccessPolicyPartner を使用して更新することが必要な場合があります
現象 - Request_MultipleObjectsWithSameKeyValue エラー
ユーザー同期を有効にしようとすると、次のようなメッセージが表示されます。
Invoke-MgGraphRequest: PUT https://graph.microsoft.com/v1.0/policies/crossTenantAccessPolicy/partners/<SourceTenantId>/identitySynchronization
HTTP/1.1 409 Conflict
...
{"error":{"code":"Request_MultipleObjectsWithSameKeyValue","message":"A conflicting object with one or more of the specified property values is present in the directory.","details":[{"code":"ConflictingObjects","message":"A conflicting object with one or more of the specified property values is present in the directory.", ... }}}
原因
前の構成由来の可能性がある、既に存在するポリシーを作成しようとしている可能性があります。
ソリューション
構文と、正しいテナント ID を使用していることを確認します。
Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization コマンドを使用して、
IsSyncAllowed
設定を一覧表示します。(Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization -CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId).UserSyncInbound
既存のポリシーがある場合は、Set-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization コマンドを使用して更新を行って、ユーザー同期を有効にすることが必要なことがあります。
$Params = @{ userSyncInbound = @{ isSyncAllowed = $true } } Set-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization -CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId -BodyParameter $Params