This PowerShell solution provides a lightweight, automation-friendly way to synchronize users from a source Microsoft Entra tenant into a target tenant as mail contacts.
Unlike Cross-Tenant Synchronization (CTS), which provisions users as B2B identities, this script is focused on Exchange-based visibility and routing, using contacts instead of guest users.
- Create Mail Contacts in the target tenant
- Handle Adds, Updates, Deletes
- Uses Microsoft Graph (App + Secret) for source
- Uses Exchange Online (App + Certificate) for target
- Maintains state with Graph delta queries
- Multi-tenant support via XML configuration
Source Tenant (Graph) --> PowerShell Script --> Target Tenant (Exchange)
- PowerShell 5.1+
- ExchangeOnlineManagement module
- App registrations in both tenants
- Certificate installed on execution host
- Entra ID -> App registrations -> New
- Add permissions:
- User.Read.All
- Directory.Read.All
- Group.Read.All
- Create client secret
- Create certificate:
New-SelfSignedCertificate -CertStoreLocation Cert:\LocalMachine\My
-
Upload .cer file to app registration
-
Add permission:
- Exchange.ManageAsApp
.\TenantContactSync.ps1 -ConfigXmlPath ".\config.xml" -SourceObjectType User
.\TenantContactSync.ps1 -ConfigXmlPath ".\config.xml" -SourceObjectType Group
.\TenantContactSync.ps1 -ConfigXmlPath ".\config.xml" -SourceObjectType Both
Parameter Switches ALWAYS take priority over XML settings
.\TenantContactSync.ps1 -ConfigXmlPath ".\config.xml" -TopUsers 10
- Auth failures: verify cert access
- Graph failures: verify API permissions
- Duplicate contacts: clean target tenant
MIT