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.

Diagrama que mostra a sincronização entre locatários de origem e de destino.

Pré-requisitos

Ícone do locatário de origem.
Locatário de origem

Ícone do locatário de destino.
Locatário de destino

Etapa 1: Entre no locatário de destino

Ícone do locatário de destino.
Locatário de destino

  1. Inicie o PowerShell.

  2. Se necessário, instale o Microsoft Graph PowerShell SDK.

  3. Obtenha a ID do locatário dos locatários de origem e de destino e inicialize as variáveis.

    $SourceTenantId = "<SourceTenantId>"
    $TargetTenantId = "<TargetTenantId>"
    
  4. 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

Ícone do locatário de destino.
Locatário de destino

  1. 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]]}
    
  2. 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
    
  3. 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

Ícone do locatário de destino.
Locatário de destino

  1. 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

Ícone do locatário de origem.
Locatário de origem

  1. Inicie uma instância do PowerShell.

  2. Obtenha a ID do locatário dos locatários de origem e de destino e inicialize as variáveis.

    $SourceTenantId = "<SourceTenantId>"
    $TargetTenantId = "<TargetTenantId>"
    
  3. 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

Ícone do locatário de origem.
Locatário de origem

  1. 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]]}
    
    
  2. 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

Ícone do locatário de origem.
Locatário de origem

  1. 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"
    
  2. 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                      :
    
    ...
    
  3. 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>"
    
  4. 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

Ícone do locatário de origem.
Locatário de origem

  1. 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

Ícone do locatário de origem.
Locatário de origem

No locatário de origem, para habilitar o provisionamento, crie um trabalho de provisionamento.

  1. Determine o modelo de sincronização que será utilizado, como Azure2Azure.

    Um modelo tem configurações de sincronização pré-configuradas.

  2. 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]}
    
  3. Inicialize uma variável para a ID do trabalho.

    $JobId = "<JobId>"
    

Etapa 9: salve as credenciais

Ícone do locatário de origem.
Locatário de origem

  1. 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

Ícone do locatário de origem.
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.

  1. 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

Ícone do locatário de origem.
Locatário de origem

Agora que você tem uma configuração, pode testar o provisionamento sob demanda com um dos seus usuários.

  1. 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 : {}
    
  2. Inicialize uma variável para a ID da regra.

    $RuleId = "<RuleId>"
    
  3. 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

Ícone do locatário de origem.
Locatário de origem

  1. 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

Ícone do locatário de origem.
Locatário de origem

  1. 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]}
    
  2. 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        : cc519f3b-fb72-4ea2-9b7b-8f9dc271c5ec
    Id                   : Sync_cc519f3b-fb72-4ea2-9b7b-8f9dc271c5ec_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        : cc519f3b-fb72-4ea2-9b7b-8f9dc271c5ec
    Id                   : Sync_cc519f3b-fb72-4ea2-9b7b-8f9dc271c5ec_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        : cc519f3b-fb72-4ea2-9b7b-8f9dc271c5ec
    Id                   : Sync_cc519f3b-fb72-4ea2-9b7b-8f9dc271c5ec_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

  1. Verifique se você recebeu as funções necessárias. Consulte Pré-requisitos, citado anteriormente neste artigo.

  2. 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

  1. Verifique sua sintaxe e se você está usando a ID de locatário correta.

  2. Use o comando Get-MgPolicyCrossTenantAccessPolicyPartner para listar o objeto existente.

  3. 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

  1. Verifique sua sintaxe e se você está usando a ID de locatário correta.

  2. Use o comando Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization para listar a configuração de IsSyncAllowed.

    (Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization -CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId).UserSyncInbound
    
  3. 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
    

Próximas etapas