Configurar a sincronização entre locatários usando o PowerShell ou a API do Microsoft Graph
Este artigo descreve as principais etapas para configurar a sincronização entre locatários usando o Microsoft Graph PowerShell ou a API do Microsoft Graph. Quando configurado, o Microsoft Entra ID provisiona e desprovisiona automaticamente os usuários B2B em seu locatário de destino. Para obter etapas detalhadas usando o centro de administração do Microsoft Entra, consulte Configurar a sincronização entre locatários.
Pré-requisitos
Locatário de origem
- Licença Microsoft Entra ID P1 ou P2. Para obter mais informações, consulte Requisitos de licença.
- Função de Administrador de Segurança para definir configurações de acesso entre locatários.
- Função de Administrador de Identidade Híbrida para configurar a sincronização entre locatários.
- Função de Administrador de Aplicativos na Nuvem ou Administrador de Aplicativos para atribuir usuários a uma configuração e excluir uma configuração.
- Função de Administrador Global para consentir com as permissões necessárias.
Locatário de destino
- Licença Microsoft Entra ID P1 ou P2. Para obter mais informações, consulte Requisitos de licença.
- Função de Administrador de Segurança para definir configurações de acesso entre locatários.
- Função de Administrador Global para consentir com as permissões necessárias.
Etapa 1: Entrar no locatário de destino
Locatário de destino
Inicie o PowerShell.
Se necessário, instale o SDK do Microsoft Graph PowerShell.
Obtenha a ID do locatário dos locatários de origem e de destino e inicialize as variáveis.
$SourceTenantId = "<SourceTenantId>" $TargetTenantId = "<TargetTenantId>"
Use o comando Connect-MgGraph para entrar no locatário de destino e consentir com as seguintes permissões necessárias.
Policy.Read.All
Policy.ReadWrite.CrossTenantAccess
Connect-MgGraph -TenantId $TargetTenantId -Scopes "Policy.Read.All","Policy.ReadWrite.CrossTenantAccess"
Etapa 2: Habilitar a sincronização do usuário no locatário de destino
Locatário de destino
No locatário de destino, use o comando New-MgPolicyCrossTenantAccessPolicyPartner para criar uma nova configuração de parceiro em uma política de acesso entre locatários entre o locatário de destino e o locatário de origem. Use o ID do locatário de origem na solicitação.
Se você receber o erro
New-MgPolicyCrossTenantAccessPolicyPartner_Create: Another object with the same value for property tenantId already exists
, talvez já tenha uma configuração existente. Para obter mais informações, consulte Sintoma - Erro de MgPolicyCrossTenantAccessPolicyPartner_Create novo.$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]]}
Use o comando Invoke-MgGraphRequest para habilitar a sincronização do usuário no locatário de destino.
Se você receber um
Request_MultipleObjectsWithSameKeyValue
erro, talvez já tenha uma política existente. Para obter mais informações, consulte Sintoma - Request_MultipleObjectsWithSameKeyValue erro.$Params = @{ userSyncInbound = @{ isSyncAllowed = $true } } Invoke-MgGraphRequest -Method PUT -Uri "https://graph.microsoft.com/v1.0/policies/crossTenantAccessPolicy/partners/$SourceTenantId/identitySynchronization" -Body $Params
Use o comando Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization para verificar se
IsSyncAllowed
está definido como True.(Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization -CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId).UserSyncInbound
IsSyncAllowed ------------- True
Etapa 3: resgatar convites automaticamente no locatário de destino
Locatário de destino
No locatário de destino, use o comando Update-MgPolicyCrossTenantAccessPolicyPartner para resgatar automaticamente convites e suprimir prompts de consentimento para acesso de entrada.
$AutomaticUserConsentSettings = @{ "InboundAllowed"="True" } Update-MgPolicyCrossTenantAccessPolicyPartner -CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId -AutomaticUserConsentSettings $AutomaticUserConsentSettings
Etapa 4: Entrar no locatário de origem
Locatário de origem
Inicie uma instância do PowerShell.
Obtenha a ID do locatário dos locatários de origem e de destino e inicialize as variáveis.
$SourceTenantId = "<SourceTenantId>" $TargetTenantId = "<TargetTenantId>"
Use o comando Connect-MgGraph para entrar no locatário de origem e consentir com as seguintes permissões necessárias.
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"
Etapa 5: resgatar convites automaticamente no locatário de origem
Locatário de origem
No locatário de origem, use o comando New-MgPolicyCrossTenantAccessPolicyPartner para criar uma nova configuração de parceiro em uma política de acesso entre locatários entre o locatário de origem e o locatário de destino. Use o ID do locatário de destino na solicitação.
Se você receber o erro
New-MgPolicyCrossTenantAccessPolicyPartner_Create: Another object with the same value for property tenantId already exists
, talvez já tenha uma configuração existente. Para obter mais informações, consulte Sintoma - Erro de MgPolicyCrossTenantAccessPolicyPartner_Create novo.$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]]}
Use o comando Update-MgPolicyCrossTenantAccessPolicyPartner para resgatar automaticamente convites e suprimir prompts de consentimento para acesso de saída.
$AutomaticUserConsentSettings = @{ "OutboundAllowed"="True" } Update-MgPolicyCrossTenantAccessPolicyPartner -CrossTenantAccessPolicyConfigurationPartnerTenantId $TargetTenantId -AutomaticUserConsentSettings $AutomaticUserConsentSettings
Etapa 6: Criar um aplicativo de configuração no locatário de origem
Locatário de origem
No locatário de origem, use o comando Invoke-MgInstantiateApplicationTemplate para adicionar uma instância de um aplicativo de configuração da galeria de aplicativos Microsoft Entra ao seu locatário.
Invoke-MgInstantiateApplicationTemplate -ApplicationTemplateId "518e5f48-1fc8-4c48-9387-9fdf28b0dfe7" -DisplayName "Fabrikam"
Use o comando Get-MgServicePrincipal para obter a ID da entidade de serviço e a ID da função do aplicativo.
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 : ...
Inicialize uma variável para o ID da entidade de serviço.
Certifique-se de usar a ID da entidade de serviço em vez da ID do aplicativo.
$ServicePrincipalId = "<ServicePrincipalId>"
Inicialize uma variável para o ID da função do aplicativo.
$AppRoleId= "<AppRoleId>"
Etapa 7: Testar a conexão com o locatário de destino
Locatário de origem
No locatário de origem, use o comando Invoke-MgGraphRequest para testar a conexão com o locatário de destino e validar as credenciais.
$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
Etapa 8: Criar um trabalho de provisionamento no locatário de origem
Locatário de origem
No locatário de origem, para habilitar o provisionamento, crie um trabalho de provisionamento.
Determine o modelo de sincronização a ser usado, como
Azure2Azure
.Um modelo tem configurações de sincronização pré-configuradas.
No locatário de origem, use o comando New-MgServicePrincipalSynchronizationJob para criar um trabalho de provisionamento com base em um modelo.
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]}
Inicialize uma variável para a ID do trabalho.
$JobId = "<JobId>"
Etapa 9: salve suas credenciais
Locatário de origem
No locatário de origem, use o comando Invoke-MgGraphRequest para salvar suas credenciais.
$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
Etapa 10: Atribuir um usuário à configuração
Locatário de origem
Para que a sincronização entre locatários funcione, pelo menos um usuário interno deve ser atribuído à configuração.
No locatário de origem, use o comando New-MgServicePrincipalAppRoleAssignedTo para atribuir um usuário interno à configuração.
$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]}
Etapa 11: Fornecimento de teste sob demanda
Locatário de origem
Agora que você tem uma configuração, pode testar o provisionamento sob demanda com um de seus usuários.
No locatário de origem, use o comando Get-MgServicePrincipalSynchronizationJobSchema para obter a ID da regra de esquema.
$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 : {}
Inicialize uma variável para a ID da regra.
$RuleId = "<RuleId>"
Use o comando New-MgServicePrincipalSynchronizationJobOnDemand para provisionar um usuário de teste sob demanda.
$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]}
Etapa 12: Iniciar o trabalho de provisionamento
Locatário de origem
Agora que o trabalho de provisionamento está configurado, no locatário de origem, use o comando Start-MgServicePrincipalSynchronizationJob para iniciar o trabalho de provisionamento.
Start-MgServicePrincipalSynchronizationJob -ServicePrincipalId $ServicePrincipalId -SynchronizationJobId $JobId
Etapa 13: Monitorar o provisionamento
Locatário de origem
Agora que o trabalho de provisionamento está em execução, no locatário de origem, use o comando Get-MgServicePrincipalSynchronizationJob para monitorar o progresso do ciclo de provisionamento atual, bem como estatísticas até o momento, como o número de usuários e grupos que foram criados no sistema de destino.
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]}
Além de monitorar o status do trabalho de provisionamento, use o comando Get-MgAuditLogProvisioning para recuperar os logs de provisionamento e obter todos os eventos de provisionamento que ocorrem. Por exemplo, consulte um usuário específico e determine se ele foi provisionado com êxito.
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 : {}
Sugestões de resolução de problemas
Sintoma - Erro de privilégios insuficientes
Quando você tenta executar uma ação, você recebe uma mensagem de erro semelhante à seguinte:
code: Authorization_RequestDenied
message: Insufficient privileges to complete the operation.
Motivo
O usuário conectado não tem privilégios suficientes ou você precisa consentir com uma das permissões necessárias.
Solução
Certifique-se de que lhe foram atribuídas as funções necessárias. Consulte Pré-requisitos anteriormente neste artigo.
Ao entrar com o Connect-MgGraph, certifique-se de especificar os escopos necessários. Consulte Etapa 1: Entrar no locatário de destino e Etapa 4: Entrar no locatário de origem anteriormente neste artigo.
Sintoma - Erro de nova MgPolicyCrossTenantAccessPolicyPartner_Create
Quando tenta criar uma nova configuração de parceiro, recebe uma mensagem de erro semelhante à seguinte:
New-MgPolicyCrossTenantAccessPolicyPartner_Create: Another object with the same value for property tenantId already exists.
Motivo
Você provavelmente está tentando criar uma configuração ou objeto que já existe, possivelmente a partir de uma configuração anterior.
Solução
Verifique sua sintaxe e se você está usando a ID de locatário correta.
Use o comando Get-MgPolicyCrossTenantAccessPolicyPartner para listar o objeto existente.
Se você tiver um objeto existente, talvez seja necessário fazer uma atualização usando Update-MgPolicyCrossTenantAccessPolicyPartner
Sintoma - erro Request_MultipleObjectsWithSameKeyValue
Quando tenta ativar a sincronização do utilizador, recebe uma mensagem de erro semelhante à seguinte:
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.", ... }}}
Motivo
Você provavelmente está tentando criar uma política que já existe, possivelmente a partir de uma configuração anterior.
Solução
Verifique sua sintaxe e se você está usando a ID de locatário correta.
Use o comando Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization para listar a
IsSyncAllowed
configuração.(Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization -CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId).UserSyncInbound
Se você tiver uma política existente, talvez seja necessário fazer uma atualização usando o comando Set-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization para habilitar a sincronização do usuário.
$Params = @{ userSyncInbound = @{ isSyncAllowed = $true } } Set-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization -CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId -BodyParameter $Params