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 no locatário de destino. Para obter as 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
- Microsoft Entra ID P1 ou P2. Para obter mais informações, veja Requisitos de licença.
- Função Administrador de Segurança para definir as configurações de acesso entre locatários.
- Função Administrador de Identidade Híbrida para definir a sincronização entre locatários.
- Função Administrador de Aplicativo de Nuvem ou Administrador de Aplicativo para atribuir usuários a uma configuração e para excluir uma configuração.
- Função Administrador Global para consentir com as permissões necessárias.
Locatário de destino
- Microsoft Entra ID P1 ou P2. Para obter mais informações, veja Requisitos de licença.
- Função Administrador de Segurança para definir as configurações de acesso entre locatários.
- Função Administrador Global para consentir com as permissões necessárias.
Etapa 1: Entre no locatário de destino
Locatário de destino
Inicie o PowerShell.
Se necessário, instale o Microsoft Graph PowerShell SDK.
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 de 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 a 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
, é possível que já tenha uma configuração existente. Para obter mais informações, consulte Sintoma - Erro 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]]}
Use o comando Invoke-MgGraphRequest para habilitar a sincronização do usuário no locatário de destino.
Se você receber um erro
Request_MultipleObjectsWithSameKeyValue
, talvez já tenha uma política existente. Para obter mais informações, consulte Sintoma – erro Request_MultipleObjectsWithSameKeyValue.$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
IsSyncAllowed
se está definido como True.(Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization -CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId).UserSyncInbound
IsSyncAllowed ------------- True
Etapa 3: resgatar automaticamente os convites no locatário de destino
Locatário de destino
No locatário de destino, use o comando Use-MgPolicyCrossTenantAccessPolicyPartner para resgatar automaticamente os convites e suprimir as solicitações de consentimento para acesso de entrada.
$AutomaticUserConsentSettings = @{ "InboundAllowed"="True" } Update-MgPolicyCrossTenantAccessPolicyPartner -CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId -AutomaticUserConsentSettings $AutomaticUserConsentSettings
Etapa 4: Entre 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 automaticamente os convites 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 a 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
, é possível que já tenha uma configuração existente. Para obter mais informações, consulte Sintoma - Erro 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]]}
Use o comando Update-MgPolicyCrossTenantAccessPolicyPartner para resgatar automaticamente os convites e suprimir as solicitações 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 por meio da galeria de aplicativos do 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 de 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 a 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 a ID da função de 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 que será utilizado, 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 as 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 a 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: testar provisionamento sob demanda
Locatário de origem
Agora que você tem uma configuração, pode testar o provisionamento sob demanda com um dos 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 as 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 eles foram provisionados 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 : {}
Dicas de solução de problemas
Sintoma – Erro de privilégios insuficientes
Ao tentar executar uma ação, você receberá uma mensagem de erro semelhante à seguinte:
code: Authorization_RequestDenied
message: Insufficient privileges to complete the operation.
Causa
O usuário conectado não tem privilégios suficientes ou você precisa de consentimento para uma das permissões necessárias.
Solução
Verifique se você recebeu as funções necessárias. Consulte Pré-requisitos, citado 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 mencionados anteriormente neste artigo.
Sintoma - Erro New-MgPolicyCrossTenantAccessPolicyPartner_Create
Ao tentar criar uma nova configuração de parceiro, você recebe uma mensagem de erro semelhante à seguinte:
New-MgPolicyCrossTenantAccessPolicyPartner_Create: Another object with the same value for property tenantId already exists.
Causa
É provável que você esteja tentando criar uma configuração ou objeto que já existe, possivelmente 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 o comando Update-MgPolicyCrossTenantAccessPolicyPartner
Sintoma – erro de Request_MultipleObjectsWithSameKeyValue
Ao tentar habilitar a sincronização de usuários, você 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.", ... }}}
Causa
É provável que você esteja tentando criar uma política que já existe, possivelmente 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 configuração de
IsSyncAllowed
.(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