Настройка синхронизации между клиентами с помощью 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 -CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId).UserSyncInbound
Если у вас есть политика, может потребоваться выполнить обновление с помощью команды Set-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization , чтобы включить синхронизацию пользователей.
$Params = @{ userSyncInbound = @{ isSyncAllowed = $true } } Set-MgPolicyCrossTenantAccessPolicyPartnerIdentitySynchronization -CrossTenantAccessPolicyConfigurationPartnerTenantId $SourceTenantId -BodyParameter $Params