Настройка синхронизации между клиентами с помощью PowerShell или API Microsoft Graph
В этой статье описаны основные шаги по настройке синхронизации между клиентами с помощью Microsoft Graph PowerShell или API Microsoft Graph. При настроенной конфигурации Microsoft Entra ID автоматически создает и удаляет пользователей B2B в целевой области. Подробные инструкции, описанные в Центре администрирования Microsoft Entra, см. в разделе "Настройка синхронизации между клиентами".
Предварительные условия
Исходный клиент
- Лицензия Microsoft Entra ID P1 или P2. Дополнительные сведения см. в статье Лицензионные требования.
- Роль администратора безопасности для настройки параметров доступа между клиентами.
- Роль администратора гибридной идентификации для настройки межарендаторной синхронизации.
- Роль администратора облачных приложений или администратора приложений для назначения пользователям конфигурации и удаления конфигурации.
- роль Администратора Привилегированных Ролей для предоставления согласия на необходимые разрешения.
Целевой клиент
- Лицензия Microsoft Entra ID P1 или P2. Дополнительные сведения см. в статье Лицензионные требования.
- Роль администратора безопасности для настройки параметров доступа между клиентами.
- роль администратора привилегированных ролей, чтобы предоставить согласие на необходимые разрешения.
Шаг 1. Вход в целевой клиент
Целевой клиент
Запустите PowerShell.
При необходимости установите пакет SDK Для Microsoft Graph PowerShell.
Получите идентификатор тенанта исходного и целевого тенантов и инициализируйте переменные.
$SourceTenantId = "<SourceTenantId>" $TargetTenantId = "<TargetTenantId>"
Используйте команду Connect-MgGraph, чтобы войти в целевой клиент и предоставить согласие на следующие необходимые разрешения.
Policy.Read.All
Policy.ReadWrite.CrossTenantAccess
Connect-MgGraph -TenantId $TargetTenantId -Scopes "Policy.Read.All","Policy.ReadWrite.CrossTenantAccess"
Шаг 2. Включение синхронизации пользователей в целевом клиенте
Целевой клиент
В целевом клиенте используйте команду New-MgPolicyCrossTenantAccessPolicyPartner , чтобы создать новую конфигурацию партнера в политике доступа между целевым клиентом и исходным клиентом. Используйте идентификатор исходного клиента в запросе.
Если вы получите ошибку
New-MgPolicyCrossTenantAccessPolicyPartner_Create: Another object with the same value for property tenantId already exists
, возможно, у вас уже есть существующая конфигурация. Дополнительные сведения см. в разделе "Симптом" — ошибка new-MgPolicyCrossTenantAccessPolicyPartner_Create.$Params = @{ TenantId = $SourceTenantId } New-MgPolicyCrossTenantAccessPolicyPartner -BodyParameter $Params | Format-List
AutomaticUserConsentSettings : Microsoft.Graph.PowerShell.Models.MicrosoftGraphInboundOutboundPolicyConfiguration B2BCollaborationInbound : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting B2BCollaborationOutbound : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting B2BDirectConnectInbound : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting B2BDirectConnectOutbound : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting IdentitySynchronization : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantIdentitySyncPolicyPartner InboundTrust : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyInboundTrust IsServiceProvider : TenantId : <SourceTenantId> TenantRestrictions : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyTenantRestrictions AdditionalProperties : {[@odata.context, https://graph.microsoft.com/v1.0/$metadata#policies/crossTenantAccessPolicy/partners/$entity], [crossCloudMeetingConfiguration, System.Collections.Generic.Dictionary`2[System.String,System.Object]], [protectedContentSharing, System.Collections.Generic.Dictionary`2[System.String,System.Object]]}
Используйте команду Invoke-MgGraphRequest, чтобы включить синхронизацию пользователей в целевом клиенте.
Если возникает
Request_MultipleObjectsWithSameKeyValue
ошибка, возможно, у вас уже есть существующая политика. Дополнительные сведения см. в разделе "Симптом" — Request_MultipleObjectsWithSameKeyValue ошибка.$Params = @{ userSyncInbound = @{ isSyncAllowed = $true } } Invoke-MgGraphRequest -Method PUT -Uri "https://graph.microsoft.com/v1.0/policies/crossTenantAccessPolicy/partners/$SourceTenantId/identitySynchronization" -Body $Params
Используйте команду Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization, чтобы проверить, что
IsSyncAllowed
задано значение True.(Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization -CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId).UserSyncInbound
IsSyncAllowed ------------- True
Шаг 3: Автоматическое погашение приглашений для целевого клиента
Целевой клиент
В целевом клиенте используйте команду Update-MgPolicyCrossTenantAccessPolicyPartner для автоматической активации приглашений и подавления запросов на согласие при доступе извне.
$AutomaticUserConsentSettings = @{ "InboundAllowed"="True" } Update-MgPolicyCrossTenantAccessPolicyPartner -CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId -AutomaticUserConsentSettings $AutomaticUserConsentSettings
Шаг 4. Вход в исходный клиент
Исходный клиент
Запустите экземпляр PowerShell.
Получите идентификатор арендатора исходного и целевого арендаторов и инициализируйте переменные.
$SourceTenantId = "<SourceTenantId>" $TargetTenantId = "<TargetTenantId>"
Используйте команду Connect-MgGraph, чтобы войти в исходный клиент и предоставить согласие на следующие необходимые разрешения.
Policy.Read.All
Policy.ReadWrite.CrossTenantAccess
Application.ReadWrite.All
Directory.ReadWrite.All
AuditLog.Read.All
Connect-MgGraph -TenantId $SourceTenantId -Scopes "Policy.Read.All","Policy.ReadWrite.CrossTenantAccess","Application.ReadWrite.All","Directory.ReadWrite.All","AuditLog.Read.All"
Шаг 5. Автоматическая обработка приглашений в исходной организации
Исходный клиент
В исходном клиенте используйте команду New-MgPolicyCrossTenantAccessPolicyPartner , чтобы создать новую конфигурацию партнера в политике доступа между исходным клиентом и целевым клиентом. Используйте идентификатор целевого клиента в запросе.
Если вы получите ошибку
New-MgPolicyCrossTenantAccessPolicyPartner_Create: Another object with the same value for property tenantId already exists
, возможно, у вас уже есть существующая конфигурация. Дополнительные сведения см. в разделе Симптом — ошибка New-MgPolicyCrossTenantAccessPolicyPartner_Create.$Params = @{ TenantId = $TargetTenantId } New-MgPolicyCrossTenantAccessPolicyPartner -BodyParameter $Params | Format-List
AutomaticUserConsentSettings : Microsoft.Graph.PowerShell.Models.MicrosoftGraphInboundOutboundPolicyConfiguration B2BCollaborationInbound : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting B2BCollaborationOutbound : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting B2BDirectConnectInbound : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting B2BDirectConnectOutbound : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyB2BSetting IdentitySynchronization : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantIdentitySyncPolicyPartner InboundTrust : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyInboundTrust IsServiceProvider : TenantId : <TargetTenantId> TenantRestrictions : Microsoft.Graph.PowerShell.Models.MicrosoftGraphCrossTenantAccessPolicyTenantRestrictions AdditionalProperties : {[@odata.context, https://graph.microsoft.com/v1.0/$metadata#policies/crossTenantAccessPolicy/partners/$entity], [crossCloudMeetingConfiguration, System.Collections.Generic.Dictionary`2[System.String,System.Object]], [protectedContentSharing, System.Collections.Generic.Dictionary`2[System.String,System.Object]]}
Используйте команду Update-MgPolicyCrossTenantAccessPolicyPartner для автоматического подтверждения приглашений и устранения запросов согласия для исходящего доступа.
$AutomaticUserConsentSettings = @{ "OutboundAllowed"="True" } Update-MgPolicyCrossTenantAccessPolicyPartner -CrossTenantAccessPolicyConfigurationPartnerTenantId $TargetTenantId -AutomaticUserConsentSettings $AutomaticUserConsentSettings
Шаг 6. Создайте приложение конфигурации в исходном арендаторе
Исходный клиент
В исходном тенанте используйте команду Invoke-MgInstantiateApplicationTemplate, чтобы добавить экземпляр конфигурационного приложения из галереи приложений Microsoft Entra в ваш тенант.
Invoke-MgInstantiateApplicationTemplate -ApplicationTemplateId "518e5f48-1fc8-4c48-9387-9fdf28b0dfe7" -DisplayName "Fabrikam"
Используйте команду Get-MgServicePrincipal, чтобы получить идентификатор субъекта-службы и идентификатор роли приложения.
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 : ...
Инициализировать переменную для идентификатора учетной записи службы.
Не забудьте использовать идентификатор субъекта-службы вместо идентификатора приложения.
$ServicePrincipalId = "<ServicePrincipalId>"
Инициализировать переменную для идентификатора роли приложения.
$AppRoleId= "<AppRoleId>"
Шаг 7. Проверка подключения к целевому клиенту
Исходный клиент
В исходном клиенте используйте команду Invoke-MgGraphRequest для проверки подключения к целевому клиенту и проверки учетных данных.
$Params = @{ "useSavedCredentials" = $false "templateId" = "Azure2Azure" "credentials" = @( @{ "key" = "CompanyId" "value" = $TargetTenantId } @{ "key" = "AuthenticationType" "value" = "SyncPolicy" } ) } Invoke-MgGraphRequest -Method POST -Uri "https://graph.microsoft.com/v1.0/servicePrincipals/$ServicePrincipalId/synchronization/jobs/validateCredentials" -Body $Params
Шаг 8. Создание задания подготовки в исходном клиенте
Исходный клиент
Чтобы включить подготовку, создайте задание подготовки в исходном клиенте.
Определите шаблон синхронизации, используемый, например
Azure2Azure
.Шаблон имеет предварительно настроенные параметры синхронизации.
В исходном клиенте используйте команду New-MgServicePrincipalSynchronizationJob для создания задания подготовки на основе шаблона.
New-MgServicePrincipalSynchronizationJob -ServicePrincipalId $ServicePrincipalId -TemplateId "Azure2Azure" | Format-List
Id : <JobId> Schedule : Microsoft.Graph.PowerShell.Models.MicrosoftGraphSynchronizationSchedule Schema : Microsoft.Graph.PowerShell.Models.MicrosoftGraphSynchronizationSchema Status : Microsoft.Graph.PowerShell.Models.MicrosoftGraphSynchronizationStatus SynchronizationJobSettings : {AzureIngestionAttributeOptimization, LookaheadQueryEnabled} TemplateId : Azure2Azure AdditionalProperties : {[@odata.context, https://graph.microsoft.com/v1.0/$metadata#servicePrincipals('<ServicePrincipalId>')/synchro nization/jobs/$entity]}
Инициализируйте переменную для идентификатора работы.
$JobId = "<JobId>"
Шаг 9. Сохранение учетных данных
Исходный клиент
В исходном клиенте используйте команду Invoke-MgGraphRequest для сохранения учетных данных.
$Params = @{ "value" = @( @{ "key" = "AuthenticationType" "value" = "SyncPolicy" } @{ "key" = "CompanyId" "value" = $TargetTenantId } ) } Invoke-MgGraphRequest -Method PUT -Uri "https://graph.microsoft.com/v1.0/servicePrincipals/$ServicePrincipalId/synchronization/secrets" -Body $Params
Шаг 10: Назначьте пользователя для конфигурации
Исходный клиент
Чтобы синхронизация между клиентами работала, необходимо назначить по крайней мере одного внутреннего пользователя конфигурации.
В исходном клиенте используйте команду New-MgServicePrincipalAppRoleAssignedTo, чтобы назначить внутреннего пользователя на конфигурацию.
$Params = @{ PrincipalId = "<PrincipalId>" ResourceId = $ServicePrincipalId AppRoleId = $AppRoleId } New-MgServicePrincipalAppRoleAssignedTo -ServicePrincipalId $ServicePrincipalId -BodyParameter $Params | Format-List
AppRoleId : <AppRoleId> CreatedDateTime : 7/31/2023 10:27:12 PM DeletedDateTime : Id : <Id> PrincipalDisplayName : User1 PrincipalId : <PrincipalId> PrincipalType : User ResourceDisplayName : Fabrikam ResourceId : <ServicePrincipalId> AdditionalProperties : {[@odata.context, https://graph.microsoft.com/v1.0/$metadata#appRoleAssignments/$entity]}
Шаг 11. Проверка предоставления по требованию
Исходный клиент
Теперь, когда у вас есть конфигурация, можно протестировать подготовку по запросу с одним из пользователей.
В исходном клиенте используйте команду Get-MgServicePrincipalSynchronizationJobSchema, чтобы получить идентификатор правила схемы.
$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 : {}
Инициализировать переменную для идентификатора правила.
$RuleId = "<RuleId>"
Используйте команду New-MgServicePrincipalSynchronizationJobOnDemand для подготовки тестового пользователя по запросу.
$Params = @{ Parameters = @( @{ Subjects = @( @{ ObjectId = "<UserObjectId>" ObjectTypeName = "User" } ) RuleId = $RuleId } ) } New-MgServicePrincipalSynchronizationJobOnDemand -ServicePrincipalId $ServicePrincipalId -SynchronizationJobId $JobId -BodyParameter $Params | Format-List
Key : Microsoft.Identity.Health.CPP.Common.DataContracts.SyncFabric.StatusInfo Value : [{"provisioningSteps":[{"name":"EntryImport","type":"Import","status":"Success","description":"Retrieved User 'user1@fabrikam.com' from Azure Active Directory","timestamp":"2023-07-31T22:31:15.9116590Z","details":{"objectId": "<UserObjectId>","accountEnabled":"True","displayName":"User1","mailNickname":"user1","userPrincipalName":"use ... AdditionalProperties : {[@odata.context, https://graph.microsoft.com/v1.0/$metadata#microsoft.graph.stringKeyStringValuePair]}
Шаг 12. Запуск задания настройки
Исходный клиент
Теперь, когда задание подготовки настроено в исходном клиенте, используйте команду Start-MgServicePrincipalSynchronizationJob для запуска задания подготовки.
Start-MgServicePrincipalSynchronizationJob -ServicePrincipalId $ServicePrincipalId -SynchronizationJobId $JobId
Шаг 13. Мониторинг подготовки
Исходный клиент
Теперь, когда задание подготовки выполняется в исходном клиенте, используйте команду Get-MgServicePrincipalSynchronizationJob для отслеживания хода выполнения текущего цикла подготовки, а также статистики до даты, например количества пользователей и групп, созданных в целевой системе.
Get-MgServicePrincipalSynchronizationJob -ServicePrincipalId $ServicePrincipalId -SynchronizationJobId $JobId | Format-List
Id : <JobId> Schedule : Microsoft.Graph.PowerShell.Models.MicrosoftGraphSynchronizationSchedule Schema : Microsoft.Graph.PowerShell.Models.MicrosoftGraphSynchronizationSchema Status : Microsoft.Graph.PowerShell.Models.MicrosoftGraphSynchronizationStatus SynchronizationJobSettings : {AzureIngestionAttributeOptimization, LookaheadQueryEnabled} TemplateId : Azure2Azure AdditionalProperties : {[@odata.context, https://graph.microsoft.com/v1.0/$metadata#servicePrincipals('<ServicePrincipalId>')/synchro nization/jobs/$entity]}
Помимо мониторинга состояния задания подготовки, используйте команду Get-MgAuditLogProvisioning для получения журналов подготовки и получения всех происходящих событий подготовки. Например, можно отправить запрос конкретному пользователю, чтобы узнать, насколько успешно прошла для него подготовка.
Get-MgAuditLogDirectoryAudit | Select -First 10 | Format-List
ActivityDateTime : 7/31/2023 12:08:17 AM ActivityDisplayName : Export AdditionalDetails : {Details, ErrorCode, EventName, ipaddr...} Category : ProvisioningManagement CorrelationId : aaaa0000-bb11-2222-33cc-444444dddddd Id : Sync_aaaa0000-bb11-2222-33cc-444444dddddd_L5BFV_161778479 InitiatedBy : Microsoft.Graph.PowerShell.Models.MicrosoftGraphAuditActivityInitiator1 LoggedByService : Account Provisioning OperationType : Result : success ResultReason : User 'user2@fabrikam.com' was created in Azure Active Directory (target tenant) TargetResources : {<ServicePrincipalId>, } AdditionalProperties : {} ActivityDateTime : 7/31/2023 12:08:17 AM ActivityDisplayName : Export AdditionalDetails : {Details, ErrorCode, EventName, ipaddr...} Category : ProvisioningManagement CorrelationId : aaaa0000-bb11-2222-33cc-444444dddddd Id : Sync_aaaa0000-bb11-2222-33cc-444444dddddd_L5BFV_161778264 InitiatedBy : Microsoft.Graph.PowerShell.Models.MicrosoftGraphAuditActivityInitiator1 LoggedByService : Account Provisioning OperationType : Result : success ResultReason : User 'user2@fabrikam.com' was updated in Azure Active Directory (target tenant) TargetResources : {<ServicePrincipalId>, } AdditionalProperties : {} ActivityDateTime : 7/31/2023 12:08:14 AM ActivityDisplayName : Synchronization rule action AdditionalDetails : {Details, ErrorCode, EventName, ipaddr...} Category : ProvisioningManagement CorrelationId : aaaa0000-bb11-2222-33cc-444444dddddd Id : Sync_aaaa0000-bb11-2222-33cc-444444dddddd_L5BFV_161778395 InitiatedBy : Microsoft.Graph.PowerShell.Models.MicrosoftGraphAuditActivityInitiator1 LoggedByService : Account Provisioning OperationType : Result : success ResultReason : User 'user2@fabrikam.com' will be created in Azure Active Directory (target tenant) (User is active and assigned in Azure Active Directory, but no matching User was found in Azure Active Directory (target tenant)) TargetResources : {<ServicePrincipalId>, } AdditionalProperties : {}
Советы по устранению неполадок
Симптом — ошибка недостаточных привилегий
При попытке выполнить действие вы получите сообщение об ошибке, аналогичное следующему:
code: Authorization_RequestDenied
message: Insufficient privileges to complete the operation.
Причина
Пользователь, вошедшего в систему, не имеет достаточных привилегий, или необходимо предоставить согласие на одно из необходимых разрешений.
Решение
Убедитесь, что вам назначены необходимые роли. См. Предварительные требования ранее в этой статье.
При входе с помощью Connect-MgGraph убедитесь, что укажите необходимые области. См. шаг 1. Вход в целевой клиент и шаг 4. Вход в исходный клиент выше в этой статье.
Симптом — ошибка new-MgPolicyCrossTenantAccessPolicyPartner_Create
При попытке создать новую конфигурацию партнера вы получите сообщение об ошибке, аналогичное следующему:
New-MgPolicyCrossTenantAccessPolicyPartner_Create: Another object with the same value for property tenantId already exists.
Причина
Скорее всего, вы пытаетесь создать конфигурацию или объект, который уже существует, возможно, из предыдущей конфигурации.
Решение
Убедитесь, что ваш синтаксис правильный и вы используете корректный идентификатор арендатора.
Используйте команду Get-MgPolicyCrossTenantAccessPolicyPartner для перечисления существующего объекта.
Если у вас существует объект, вам может понадобиться обновить его с помощью Update-MgPolicyCrossTenantAccessPolicyPartner
Симптом — ошибка Request_MultipleObjectsWithSameKeyValue
При попытке включить синхронизацию пользователей вы получите сообщение об ошибке, аналогичное следующему:
Invoke-MgGraphRequest: PUT https://graph.microsoft.com/v1.0/policies/crossTenantAccessPolicy/partners/<SourceTenantId>/identitySynchronization
HTTP/1.1 409 Conflict
...
{"error":{"code":"Request_MultipleObjectsWithSameKeyValue","message":"A conflicting object with one or more of the specified property values is present in the directory.","details":[{"code":"ConflictingObjects","message":"A conflicting object with one or more of the specified property values is present in the directory.", ... }}}
Причина
Скорее всего, вы пытаетесь создать политику, которая уже существует, возможно, из предыдущей конфигурации.
Решение
Проверьте синтаксис и правильность использования идентификатора арендатора.
Используйте команду Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization, чтобы получить список настройки
IsSyncAllowed
.(Get-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization -CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId).UserSyncInbound
Если у вас есть действующая политика, может потребоваться обновление с помощью команды Set-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization, чтобы включить синхронизацию пользователей.
$Params = @{ userSyncInbound = @{ isSyncAllowed = $true } } Set-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization -CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId -BodyParameter $Params