Configurare la sincronizzazione tra tenant usando PowerShell o Microsoft API Graph

Questo articolo descrive i passaggi principali per configurare una sincronizzazione tra tenant usando Microsoft Graph PowerShell o l'API Microsoft Graph. Se configurato, Microsoft Entra ID effettua automaticamente il provisioning e il deprovisioning degli utenti B2B nel tenant di destinazione. Per informazioni dettagliate sull'uso dell'Interfaccia di amministrazione di Microsoft Entra, vedere Configurare la sincronizzazione tra tenant.

Diagramma che mostra la sincronizzazione tra tenant, tra quello di origine e quello target.

Prerequisiti

Icona per il tenant di origine.
Tenant di origine

Icona per il tenant di destinazione.
Tenant di destinazione

Passaggio 1: Accedere al tenant target

Icona per il tenant di destinazione.
Tenant di destinazione

  1. Avviare PowerShell.

  2. Se necessario, installare Microsoft Graph PowerShell SDK.

  3. Ottenere l'ID tenant dei tenant di origine e target e inizializzare le variabili.

    $SourceTenantId = "<SourceTenantId>"
    $TargetTenantId = "<TargetTenantId>"
    
  4. Usare il comando Connect-MgGraph per accedere al tenant target e fornire il consenso alle autorizzazioni necessarie elencate di seguito.

    • Policy.Read.All
    • Policy.ReadWrite.CrossTenantAccess
    Connect-MgGraph -TenantId $TargetTenantId -Scopes "Policy.Read.All","Policy.ReadWrite.CrossTenantAccess"
    

Passaggio 2: Abilitare la sincronizzazione degli utenti nel tenant target

Icona per il tenant di destinazione.
Tenant di destinazione

  1. Nel tenant di destinazione usare il comando New-MgPolicyCrossTenantAccessPolicyPartner per creare una nuova configurazione partner in un criterio di accesso tra i tenant, in particolare tra il tenant di destinazione e il tenant di origine. Usare l'ID tenant di origine nella richiesta.

    Se viene visualizzato l'errore New-MgPolicyCrossTenantAccessPolicyPartner_Create: Another object with the same value for property tenantId already exists, potrebbe esistere già una configurazione. Per altre informazioni, vedere Sintomo: Errore 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. Usare il comando Invoke-MgGraphRequest per abilitare la sincronizzazione degli utenti nel tenant di destinazione.

    Se viene visualizzato un errore Request_MultipleObjectsWithSameKeyValue, potrebbe esistere già una policy. Per altre informazioni, vedere Sintomo:Errore 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. Usare il comando Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization per verificare che IsSyncAllowed sia impostato su True.

    (Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization -CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId).UserSyncInbound
    
    IsSyncAllowed
    -------------
    True
    

Passaggio 3: Riscattare automaticamente gli inviti nel tenant di destinazione

Icona per il tenant di destinazione.
Tenant di destinazione

  1. Nel tenant di destinazione usare il comando Update-MgPolicyCrossTenantAccessPolicyPartner per riscattare automaticamente gli inviti e disabilitare le richieste di consenso per l'accesso in ingresso.

    $AutomaticUserConsentSettings = @{
        "InboundAllowed"="True"
    }
    Update-MgPolicyCrossTenantAccessPolicyPartner -CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId -AutomaticUserConsentSettings $AutomaticUserConsentSettings
    

Passaggio 4: Accedere al tenant di origine

Icona per il tenant di origine.
Tenant di origine

  1. Avviare un'istanza di PowerShell.

  2. Ottenere l'ID tenant dei tenant di origine e target e inizializzare le variabili.

    $SourceTenantId = "<SourceTenantId>"
    $TargetTenantId = "<TargetTenantId>"
    
  3. Usare il comando Connect-MgGraph per accedere al tenant di origine e fornire il consenso alle autorizzazioni necessarie elencate di seguito.

    • 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"
    

Passaggio 5: Riscattare automaticamente gli inviti nel tenant di origine

Icona per il tenant di origine.
Tenant di origine

  1. Nel tenant di origine usare il comando New-MgPolicyCrossTenantAccessPolicyPartner per creare una nuova configurazione partner in un criterio di accesso tra i tenant, in particolare tra il tenant di origine e il tenant di destinazione. Usare l'ID tenant di destinazione nella richiesta.

    Se viene visualizzato l'errore New-MgPolicyCrossTenantAccessPolicyPartner_Create: Another object with the same value for property tenantId already exists, potrebbe esistere già una configurazione. Per altre informazioni, vedere Sintomo: Errore 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. Usare il comando Update-MgPolicyCrossTenantAccessPolicyPartner per riscattare automaticamente gli inviti e disabilitare le richieste di consenso per l'accesso in uscita.

    $AutomaticUserConsentSettings = @{
        "OutboundAllowed"="True"
    }
    Update-MgPolicyCrossTenantAccessPolicyPartner -CrossTenantAccessPolicyConfigurationPartnerTenantId $TargetTenantId -AutomaticUserConsentSettings $AutomaticUserConsentSettings
    

Passaggio 6: Creare un'applicazione di configurazione nel tenant di origine

Icona per il tenant di origine.
Tenant di origine

  1. Nel tenant di origine usare il comando Invoke-MgInstantiateApplicationTemplate per aggiungere un'istanza di un'applicazione di configurazione dalla raccolta di applicazioni di Microsoft Entra nel tenant.

    Invoke-MgInstantiateApplicationTemplate -ApplicationTemplateId "518e5f48-1fc8-4c48-9387-9fdf28b0dfe7" -DisplayName "Fabrikam"
    
  2. Usare il comando Get-MgServicePrincipal per ottenere l'ID entità servizio e l'ID ruolo dell'app.

    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. Inizializzare una variabile per l'ID entità servizio.

    Assicurarsi di usare l'ID entità servizio anziché l'ID applicazione.

    $ServicePrincipalId = "<ServicePrincipalId>"
    
  4. Inizializzare una variabile per l'ID ruolo dell'app.

    $AppRoleId= "<AppRoleId>"
    

Passaggio 7: Testare la connessione al tenant di destinazione

Icona per il tenant di origine.
Tenant di origine

  1. Nel tenant di origine usare il comando Invoke-MgGraphRequest per testare la connessione al tenant di destinazione e convalidare le credenziali.

    $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
    

Passaggio 8: Creare un processo di provisioning nel tenant di origine

Icona per il tenant di origine.
Tenant di origine

Nel tenant di origine, per abilitare il provisioning, creare un processo di provisioning.

  1. Determinare il modello di sincronizzazione da usare, ad esempio Azure2Azure.

    Un modello ha impostazioni di sincronizzazione preconfigurate.

  2. Nel tenant di origine usare il comando New-MgServicePrincipalSynchronizationJob per creare un processo di provisioning basato su un modello.

    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. Inizializzare una variabile per l'ID processo.

    $JobId = "<JobId>"
    

Passaggio 9: Salvare le credenziali personali

Icona per il tenant di origine.
Tenant di origine

  1. Nel tenant di origine usare il comando Invoke-MgGraphRequest per salvare le credenziali.

    $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
    

Passaggio 10: Assegnare un utente alla configurazione

Icona per il tenant di origine.
Tenant di origine

Per il funzionamento della sincronizzazione tra tenant, è necessario assegnare almeno un utente interno alla configurazione.

  1. Nel tenant di origine usare il comando New-MgServicePrincipalAppRoleAssignedTo per assegnare un utente interno alla configurazione.

    $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]}
    

Passaggio 11: Testare il provisioning su richiesta

Icona per il tenant di origine.
Tenant di origine

Dopo aver creato una configurazione, è possibile testare il provisioning su richiesta con uno degli utenti.

  1. Nel tenant di origine usare il comando Get-MgServicePrincipalSynchronizationJobSchema per ottenere l'ID regola dello schema.

    $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. Inizializzare una variabile per l'ID regola

    $RuleId = "<RuleId>"
    
  3. Usare il comando New-MgServicePrincipalSynchronizationJobOnDemand per effettuare il provisioning di un utente di test su richiesta.

    $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]}
    

Passaggio 12: Avviare il processo di provisioning

Icona per il tenant di origine.
Tenant di origine

  1. Ora che il processo di provisioning è configurato, nel tenant di origine, usare il comando Start-MgServicePrincipalSynchronizationJob per avviare il processo di provisioning.

    Start-MgServicePrincipalSynchronizationJob -ServicePrincipalId $ServicePrincipalId -SynchronizationJobId $JobId
    

Passaggio 13: Monitorare il provisioning

Icona per il tenant di origine.
Tenant di origine

  1. Ora che il processo di provisioning è in esecuzione, nel tenant di origine, usare il comando Get-MgServicePrincipalSynchronizationJob per monitorare lo stato di avanzamento del ciclo di provisioning corrente e le statistiche fino a quel momento, ad esempio il numero di utenti e gruppi creati nel sistema di destinazione.

    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. Oltre a monitorare lo stato del processo di provisioning, usare il comando Get-MgAuditLogProvisioning per recuperare i log di provisioning e ottenere tutti gli eventi di provisioning che si verificano. Ad esempio, eseguire una query per un determinato utente e determinare se è stato eseguito correttamente il provisioning.

    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 : {}
    

Suggerimenti per la risoluzione dei problemi

Sintomo: Errore di privilegi insufficienti

Quando si tenta di eseguire un'azione, si riceve un messaggio di errore simile al seguente:

code: Authorization_RequestDenied
message: Insufficient privileges to complete the operation.

Causa

L'utente connesso non dispone di privilegi sufficienti oppure è necessario fornire il consenso a una delle autorizzazioni necessarie.

Soluzione

  1. Assicurarsi di aver assegnato i ruoli necessari. Vedere la sezione Prerequisiti più indietro in questo articolo.

  2. Quando si accede con Connect-MgGraph, assicurarsi di specificare gli ambiti necessari. Vedere Passaggio 1: Accedere al tenant di destinazione e Passaggio 4: Accedere al tenant di origine più indietro in questo articolo.

Sintomo: Errore New-MgPolicyCrossTenantAccessPolicyPartner_Create

Quando si tenta di creare una nuova configurazione partner, si riceve un messaggio di errore simile al seguente:

New-MgPolicyCrossTenantAccessPolicyPartner_Create: Another object with the same value for property tenantId already exists.

Causa

È probabile che si stia tentando di creare una configurazione o un oggetto già esistente, probabilmente da una configurazione precedente.

Soluzione

  1. Verificare la sintassi e di usare l'ID tenant corretto.

  2. Usare il comando Get-MgPolicyCrossTenantAccessPolicyPartner per elencare l'oggetto esistente.

  3. Se si dispone di un oggetto esistente, potrebbe essere necessario eseguire un aggiornamento usando Update-MgPolicyCrossTenantAccessPolicyPartner

Sintomo: Errore Request_MultipleObjectsWithSameKeyValue

Quando si tenta di abilitare una sincronizzazione utente, si riceve un messaggio di errore simile al seguente:

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

È probabile che si stia tentando di creare un criterio già esistente, probabilmente da una configurazione precedente.

Soluzione

  1. Verificare la sintassi e di usare l'ID tenant corretto.

  2. Usare il comando Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization per elencare le impostazioni IsSyncAllowed.

    (Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization -CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId).UserSyncInbound
    
  3. Se si dispone di un criterio esistente, potrebbe essere necessario eseguire un aggiornamento usando il comando Set-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization per abilitare la sincronizzazione degli utenti.

    $Params = @{
        userSyncInbound = @{
            isSyncAllowed = $true
        }
    }
    Set-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization -CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId -BodyParameter $Params
    

Passaggi successivi