Skip to main content

Migrating to the new Microsoft Exchange Hybrid connectivity

Perform the following process to update the current Exchange Hybrid connector to the new version.

Installation requirements

Cloud: No manual installation required. Perform the process below to update the connector.
On-prem : Download and then install the connectivity package for the new Exchange Hybrid connectivity. Update it by following this section.

Modify the existing queries and mappings

Modify the following Resource and Resource assignment objects in queries and mappings:

Resources

  1. Add the following expression in the Filter:

Type != "Exchange Equipment Mailbox" && Type != "Exchange Room Mailbox" && Type != "Exchange Shared Mailbox"

  1. Modify the resource for DistributionGroups:

Distinct - Yes

DestinationOperatorSource
Security resource business keyMapDistributionGroupGuid
CategoryConstantPermission
Logic keyExpression!string.IsNullOrEmpty(DistributionGroupCustomAttribute1) ? DistributionGroupCustomAttribute1 : DistributionGroupGuid
  1. Create a new Resource object type:
SourceMailboxes
Query scopeLocal and Cloud
Mailbox subtypeEquipmentMailbox, RoomMailbox, SharedMailbox
DistinctYes
EnabledSelected
DescriptionSharedMailbox, EquipmentMailbox, RoomMailbox - FullAccess
DestinationOperatorSource
Business keyExpressionExchangeGuid + "_FullAccess"
Security resource business keyExpressionExchangeGuid + "_FullAccess"
NameExpressionDisplayName + "_FullAccess" + "_" + (ServerName == "exchange-ps" || ServerName == "exchange-local" ? "Local" : "Cloud")
CategoryConstantPermission
TypeExpressionRecipientTypeDetails == "EquipmentMailbox" ? "Exchange Equipment Mailbox" : RecipientTypeDetails == "RoomMailbox" ? "Exchange Room Mailbox" : RecipientTypeDetails == "SharedMailbox" ? "Exchange Shared Mailbox" : null
Short nameExpressionDisplayName + "_FullAccess" + "_" + (ServerName == "exchange-ps" || ServerName == "exchange-local" ? "Local" : "Cloud")
Logical keyExpressionstring.Format("<exchangeguid>{0}</exchangeguid>", DisplayName)
RecipientTypeDetailsMapRecipientTypeDetails
PrimarySmtpAddressMapPrimarySmtpAddress
IdentityMapIdentity
  1. Create a new Resource object type:
SourceMailboxes
Query scopeLocal and Cloud
Mailbox subtypeEquipmentMailbox, RoomMailbox, SharedMailbox
DistinctYes
EnabledSelected
DescriptionSharedMailbox, EquipmentMailbox, RoomMailbox - SendAs
DestinationOperatorSource
Business keyExpressionExchangeGuid + "_SendAs"
Security resource business keyExpressionExchangeGuid + "_SendAs"
NameExpressionDisplayName + "_SendAs" + "_" + (ServerName == "exchange-ps" || ServerName == "exchange-local" ? "Local" : "Cloud")
CategoryConstantPermission
TypeExpressionRecipientTypeDetails == "EquipmentMailbox" ? "Exchange Equipment Mailbox" : RecipientTypeDetails == "RoomMailbox" ? "Exchange Room Mailbox" : RecipientTypeDetails == "SharedMailbox" ? "Exchange Shared Mailbox" : null
Short nameExpressionDisplayName + "_SendAs" + "_" + (ServerName == "exchange-ps" || ServerName == "exchange-local" ? "Local" : "Cloud")
DescriptionMapDisplayName
RecipientTypeDetailsMapRecipientTypeDetails
mailPrimarySmtpAddressMapPrimarySmtpAddress
IdentityMapIdentity
  1. Create a new Resource object type:
SourceMailboxes
Query scopeLocal and Cloud
Mailbox subtypeEquipmentMailbox, RoomMailbox, SharedMailbox
DistinctYes
EnabledSelected
DescriptionSharedMailbox, EquipmentMailbox, RoomMailbox - SendOnBehalf
DestinationOperatorSource
Business keyExpressionExchangeGuid + "_SendOnBehalf"
Security resource business keyExpressionExchangeGuid + "_SendOnBehalf"
NameExpressionDisplayName + "_SendOnBehalf" + "_" + (ServerName == "exchange-ps" || ServerName == "exchange-local" ? "Local" : "Cloud")
CategoryConstantPermission
TypeExpressionRecipientTypeDetails == "EquipmentMailbox" ? "Exchange Equipment Mailbox" : RecipientTypeDetails == "RoomMailbox" ? "Exchange Room Mailbox" : RecipientTypeDetails == "SharedMailbox" ? "Exchange Shared Mailbox" : null
Short nameExpressionDisplayName + "_SendOnBehalf" + "_" + (ServerName == "exchange-ps" || ServerName == "exchange-local" ? "Local" : "Cloud")
DescriptionMapDisplayName
RecipientTypeDetailsMapRecipientTypeDetails
PrimarySmtpAddressMapPrimarySmtpAddress
IdentityMapIdentity

After applying all the changes, the queries and mappings should list the following objects:

Objects

Resource assignments

  1. Modify the Resource assignment for Local shared mailboxes:

    • Remove EquipmentMailbox, RoomMailbox, SharedMailbox from the Mailbox subtype.
    • Distinct: Yes
  2. Modify the Resource assignment for Cloud shared mailboxes:

    • Remove EquipmentMailbox, RoomMailbox, SharedMailbox from the Mailbox subtype.
    • Distinct: Yes
  3. Modify the Resource assignment for Local send on behalf mailboxes:

    • Remove EquipmentMailbox, RoomMailbox, SharedMailbox from the Mailbox subtype.
  4. Modify the Resource assignment for Cloud send on behalf mailboxes:

    • Remove EquipmentMailbox, RoomMailbox, SharedMailbox from the Mailbox subtype.
  5. Modify the Resource assignment for Local user mailboxes:

    • Remove EquipmentMailbox, RoomMailbox, SharedMailbox from the Mailbox subtype.
  6. Modify Resource assignment for Cloud user mailboxes:

    • Remove EquipmentMailbox, RoomMailbox, SharedMailbox from the Mailbox subtype.
  7. Modify the Resource assignment for Cloud administrative role:

    • Distinct: Yes
    • Filter: Type=="Members" && RecipientType?.ToString().IndexOf("Group") < 0 && RecipientType =="UserMailbox" |
DestinationOperatorSource
Business keyExpressionstring.Format("<account>{0}</account><resource>{1}</resource><target>{2}</target>", MemberName, MemberRecipientTypeDetails, RoleGroupSamAccountName.ToLower())
  1. Create a Resource assignment for Local equipment, room and shared mailboxes (send on behalf):
SourceMailboxes
Query scopeLocal
Mailbox subtypeEquipmentMailbox, RoomMailbox, SharedMailbox
DistinctYes
FilterType=="Send on behalf"
EnabledSelected
DescriptionLocal send on behalf - equipment, room and shared mailboxes
DestinationOperatorSource
Resource business keyExpressionExchangeGuid + "_SendOnBehalf"
Account - CBKLookupPath=GrantSendOnBehalfTo
Target - CBKExpressionstring.Format("{0}_<exchangeguid>{1}</exchangeguid>", BuiltIn.SourceSystemID, ExchangeGuid)
Business keyExpressionstring.Format("<account>{0}</account><resource>{1}</resource><target>{2}</target>", GrantSendOnBehalfTo, Type, ExchangeGuid)
PRIMARY_EMAILMapPrimarySmtpAddress
IdentityMapIdentity
RecipientTypeDetailsMapRecipientTypeDetails
ExternalDirectoryObjectIDMapExternalDirectoryObjectID
GrantSendOnBehalfToMapGrantSendOnBehalfTo
MAILBOXREFExpressionstring.Format("{0}_<exchangeguid>{1}</exchangeguid>", BuiltIn.SourceSystemID, ExchangeGuid)
  1. Create a Resource assignment for Cloud equipment, room and shared mailboxes (send on behalf):
SourceMailboxes
Query scopeCloud
Mailbox subtypeEquipmentMailbox, RoomMailbox, SharedMailbox
DistinctYes
FilterType=="Send on behalf"
EnabledSelected
DescriptionCloud send on behalf - eq, room and shared mailboxes
DestinationOperatorSource
Resource business keyExpressionExchangeGuid + "_SendOnBehalf"
Account - CBKLookupBusinessKey=GrantSendOnBehalfTo
Target - CBKExpressionstring.Format("{0}_<exchangeguid>{1}</exchangeguid>", BuiltIn.SourceSystemID, ExchangeGuid)
Business keyExpressionstring.Format("<account>{0}</account><resource>{1}</resource><target>{2}</target>", GrantSendOnBehalfTo, Type, ExchangeGuid)
PRIMARY_EMAILMapPrimarySmtpAddress
IdentityMapIdentity
RecipientTypeDetailsMapRecipientTypeDetails
ExternalDirectoryObjectIDMapExternalDirectoryObjectID
GrantSendOnBehalfToMapGrantSendOnBehalfTo
MAILBOXREFExpressionstring.Format("{0}_<exchangeguid>{1}</exchangeguid>", BuiltIn.SourceSystemID, ExchangeGuid)
  1. Create a Resource assignment for Local Mailbox access:
SourceMailbox access
Query scopeLocal
Mailbox subtypeEquipmentMailbox, RoomMailbox, SharedMailbox
DistinctYes
FilterLinkedMasterAccount != null && LinkedMasterAccount != "NT AUTHORITY" && Type == "Full access"
EnabledSelected
DescriptionLocal mailbox access- FullAccess
DestinationOperatorSource
Resource business keyExpressionExchangeGuid + "_FullAccess"
Account - CBKLookupName=LinkedMasterAccount
Target - CBKExpressionstring.Format("{0}_<exchangeguid>{1}</exchangeguid>", BuiltIn.SourceSystemID, ExchangeGuid)
Business keyExpressionstring.Format("<account>{0}</account><resource>{1}</resource><target>{2}</target>", LinkedMasterAccount, Type, ExchangeGuid)
LinkedMasterAccountMapLinkedMasterAccount
AccessTypeMapType
MAILBOXREFExpressionstring.Format("{0}_<exchangeguid>{1}</exchangeguid>", BuiltIn.SourceSystemID, ExchangeGuid)
  1. Create a Resource assignment for Local Mailbox access (Send as):
SourceMailbox access
Query scopeLocal
Mailbox subtypeEquipmentMailbox, RoomMailbox, SharedMailbox
DistinctYes
FilterLinkedMasterAccount != null && LinkedMasterAccount != "NT AUTHORITY" && Type == "Send as"
EnabledSelected
DescriptionLocal mailbox access- SendAs
DestinationOperatorSource
Resource business keyExpressionExchangeGuid + "_SendAs"
Account - CBKLookupName=LinkedMasterAccount
Target - CBKExpressionstring.Format("{0}_<exchangeguid>{1}</exchangeguid>", BuiltIn.SourceSystemID, ExchangeGuid)
Business keyExpressionstring.Format("<account>{0}</account><resource>{1}</resource><target>{2}</target>", LinkedMasterAccount, Type, ExchangeGuid)
LinkedMasterAccountMapLinkedMasterAccount
AccessTypeMapType
MAILBOXREFExpressionstring.Format("{0}_<exchangeguid>{1}</exchangeguid>", BuiltIn.SourceSystemID, ExchangeGuid)
  1. Create a Resource assignment for Cloud Mailbox access:
SourceMailbox access
Query scopeCloud
Mailbox subtypeEquipmentMailbox, RoomMailbox, SharedMailbox
DistinctYes
FilterLinkedMasterAccount != null && LinkedMasterAccount != "NT AUTHORITY" && Type == "Full access"
EnabledSelected
DescriptionOnline mailbox access - FullAccess
DestinationOperatorSource
Resource business keyExpressionExchangeGuid + "_FullAccess"
Account - CBKLookupDistinguishedName=LinkedMasterAccount
Target - CBKExpressionstring.Format("{0}_<exchangeguid>{1}</exchangeguid>", BuiltIn.SourceSystemID, ExchangeGuid)
Business keyExpressionstring.Format("<account>{0}</account><resource>{1}</resource><target>{2}</target>", LinkedMasterAccount, Type, ExchangeGuid)
LinkedMasterAccountMapLinkedMasterAccount
AccessTypeMapType
MAILBOXREFExpressionstring.Format("{0}_<exchangeguid>{1}</exchangeguid>", BuiltIn.SourceSystemID, ExchangeGuid)
  1. Create a Resource assignment for Cloud Mailbox access (Send as):
SourceMailbox access
Query scopeCloud
Mailbox subtypeEquipmentMailbox, RoomMailbox, SharedMailbox
DistinctYes
FilterLinkedMasterAccount != null && LinkedMasterAccount != "NT AUTHORITY" && Type == "Send as"
EnabledSelected
DescriptionOnline mailbox access - SendAs
DestinationOperatorSource
Resource business keyExpressionExchangeGuid + "_SendAs"
Account - CBKLookupDistinguishedName=LinkedMasterAccount
Target - CBKExpressionstring.Format("{0}_<exchangeguid>{1}</exchangeguid>", BuiltIn.SourceSystemID, ExchangeGuid)
Business keyExpressionstring.Format("<account>{0}</account><resource>{1}</resource><target>{2}</target>", LinkedMasterAccount, Type, ExchangeGuid)
LinkedMasterAccountMapLinkedMasterAccount
AccessTypeMapType
IdentityMapIdentity
MAILBOXREFExpressionstring.Format("{0}_<exchangeguid>{1}</exchangeguid>", BuiltIn.SourceSystemID, ExchangeGuid)
  1. Run an import.

Event definitions

Create the following event definitions:

Event Exchange Hybrid – Shared, Equipment, Room - Create

  1. Go to Setup > Administration > Process configuration > Event definitions. Click New. Enter the following details:

    • Name: Event Exchange Hybrid – Shared, Equipment, Room - Create
    • Event is triggered when: A new object is created
    • Triggers on objects of type: Resources
  2. Click Apply and then New.

  3. Select Execute code method and click OK.

  4. Enter the following configuration:

    Event definition
  5. Click OK.

  6. Select Execute code method and click OK.

  7. Enter the following details:

    Event definition
  8. Click Filter and then Filter expressions. Click New.

  9. Enter the following details:

    Event definition
  10. Click New and enter the following details:

    Event definition
  11. Click OK.

Event Exchange Hybrid – Shared, Equipment, Room – Delete

  1. Go to Setup > Administration > Process configuration > Event definitions. Click New. Enter the following details:

    • Name: Event Exchange Hybrid – Shared, Equipment, Room - Delete
    • Event is triggered when: An existing object is deleted
    • Triggers on objects of type: Resources
  2. Click Apply and then New.

  3. Select Execute code method and click OK.

  4. Enter the following configuration:

    Event definition
  5. Click Filter and then Filter expressions. Click New.

  6. Enter the following details:

    Event definition
  7. Click New and enter the following details:

    Event definition
  8. Click OK.

Event Exchange Hybrid – Distribution Group - Create

  1. Go to Setup > Administration > Process configuration > Event definitions. Click New. Enter the following details:

    • Name: Event Exchange Hybrid – Distribution Group - Create
    • Event is triggered when: A new object is created
    • Triggers on objects of type: Resources
  2. Click Apply and then New.

  3. Select Execute code method and click OK.

  4. Enter the following configuration:

    Event definition
  5. Click Filter and then Filter expressions. Click New.

  6. Enter the following details:

    Event definition
  7. Click OK. Click Filter and then Filter expressions. Click New.

  8. Enter the following details:

    Event definition
  9. Click OK.

Event Exchange Hybrid – Distribution Group - Delete

  1. Go to Setup > Administration > Process configuration > Event definitions. Click New. Enter the following details:

    • Name: Event Exchange Hybrid – Distribution Group - Delete
    • Event is triggered when: An existing object is deleted
    • Triggers on objects of type: Resources
  2. Click Apply and then New.

  3. Select Execute code method and click OK.

  4. Enter the following configuration:

    Event definition
  5. Click OK. Click Filter and then Filter expressions. Click New.

  6. Enter the following details:

    Event definition
  7. Click OK.

Provisioning

Task mappings

The following task mappings should be available as the starting point:

Mappings

Equipment Resource Type

  1. Go to Task mappings. Click New and select EquipmentMailbox.
  2. Enter the following details:
Configuration
  1. Click Mappings. Enter the following details:
DestinationOperatorSource
Object IdMapObjectId
Object typeConstantEquipmentMailbox
OperationMapOperation
IdentityExpressionRLM_NAME.Replace("_SendOnBehalf", "").Replace("_SendAs", "").Replace("_FullAccess", "").Replace("_Local", "").Replace("_Cloud", "")
NameExpressionOperation == "CreateIfNotExists" ? RLM_NAME.Replace("_SendOnBehalf", "").Replace("_SendAs", "").Replace("_FullAccess", "").Replace("_Local", "").Replace("_Cloud", "") : null
DisplayNameExpressionRLM_NAME.Replace("_SendOnBehalf", "").Replace("_SendAs", "").Replace("_FullAccess", "").Replace("_Local", "").Replace("_Cloud", "")
AliasExpressionRLM_NAME.Replace(" ", "").Replace("_SendOnBehalf", "").Replace("_SendAs", "").Replace("_FullAccess", "").Replace("_Local", "").Replace("_Cloud", "")
MailboxLocationMapRLM_MAILBOXLOCATIONSET
  1. Click OK and then New.
  2. Select MailboxAccess and click OK.
  3. Enter the following details:
Configuration
  1. Click Mappings. Enter the following details:
DestinationOperatorSource
Object IdMapObjectId
Object typeConstantMailboxAccess
OperationMapOperation
IdentityMapROPE_DistinguisedName
mailboxPermissionExpressionROPE_ResourceIdentifier.Contains("FULLACCESS") ? "Full Access" : ROPE_ResourceIdentifier.Contains("SENDAS") ? "Send As" : ROPE_ResourceIdentifier.Contains("SENDONBEHALF") ? "Send on Behalf" : null
userMailboxGuidExpressionROPE_ResourceCBK.Substring(ROPE_ResourceCBK.IndexOf("_") + 1, ROPE_ResourceCBK.LastIndexOf("_") - ROPE_ResourceCBK.IndexOf("_") - 1)
  1. Click OK.

Room Resource Type

  1. Go to Task mappings. Click New and select RoomMailbox.
  2. Enter the following details:
Configuration
  1. Click Mappings. Enter the following details:
DestinationOperatorSource
Object IdMapObjectId
Object typeConstantRoomMailbox
OperationMapOperation
IdentityExpressionRLM_NAME.Replace("_SendOnBehalf", "").Replace("_SendAs", "").Replace("_FullAccess", "").Replace("_Local", "").Replace("_Cloud", "")
NameExpressionOperation == "CreateIfNotExists" ? RLM_NAME.Replace("_SendOnBehalf", "").Replace("_SendAs", "").Replace("_FullAccess", "").Replace("_Local", "").Replace("_Cloud", "") : null
DisplayNameExpressionRLM_NAME.Replace("_SendOnBehalf", "").Replace("_SendAs", "").Replace("_FullAccess", "").Replace("_Local", "").Replace("_Cloud", "")
AliasExpressionRLM_NAME.Replace(" ", "").Replace("_SendOnBehalf", "").Replace("_SendAs", "").Replace("_FullAccess", "").Replace("_Local", "").Replace("_Cloud", "")
MailboxLocationMapRLM_MAILBOXLOCATIONSET
  1. Click OK and then New.
  2. Select MailboxAccess and click OK.
  3. Enter the following details:
Configuration
  1. Click Mappings. Enter the following details:
DestinationOperatorSource
Object IdMapObjectId
Object typeConstantMailboxAccess
OperationMapOperation
IdentityMapROPE_DistinguisedName
mailboxPermissionExpressionROPE_ResourceIdentifier.Contains("FULLACCESS") ? "Full Access" : ROPE_ResourceIdentifier.Contains("SENDAS") ? "Send As" : ROPE_ResourceIdentifier.Contains("SENDONBEHALF") ? "Send on Behalf" : null
userMailboxGuidExpressionROPE_ResourceCBK.Substring(ROPE_ResourceCBK.IndexOf("_") + 1, ROPE_ResourceCBK.LastIndexOf("_") - ROPE_ResourceCBK.IndexOf("_") - 1)
  1. Click OK.

Shared Resource Type

  1. Go to Task mappings. Click New and select SharedMailbox.
  2. Enter the following details:
Configuration
  1. Click Mappings. Enter the following details:
DestinationOperatorSource
Object IdMapObjectId
Object typeConstantSharedMailbox
OperationMapOperation
IdentityExpressionRLM_NAME.Replace("_SendOnBehalf", "").Replace("_SendAs", "").Replace("_FullAccess", "").Replace("_Local", "").Replace("_Cloud", "")
NameExpressionOperation == "CreateIfNotExists" ? RLM_NAME.Replace("_SendOnBehalf", "").Replace("_SendAs", "").Replace("_FullAccess", "").Replace("_Local", "").Replace("_Cloud", "") : null
DisplayNameExpressionRLM_NAME.Replace("_SendOnBehalf", "").Replace("_SendAs", "").Replace("_FullAccess", "").Replace("_Local", "").Replace("_Cloud", "")
AliasExpressionRLM_NAME.Replace(" ", "").Replace("_SendOnBehalf", "").Replace("_SendAs", "").Replace("_FullAccess", "").Replace("_Local", "").Replace("_Cloud", "")
MailboxLocationMapRLM_MAILBOXLOCATIONSET
  1. Click OK and then New.
  2. Select MailboxAccess and click OK.
  3. Enter the following details:
Configuration
  1. Click Mappings. Enter the following details:
DestinationOperatorSource
Object IdMapObjectId
Object typeConstantMailboxAccess
OperationMapOperation
IdentityMapROPE_DistinguisedName
mailboxPermissionExpressionROPE_ResourceIdentifier.Contains("FULLACCESS") ? "Full Access" : ROPE_ResourceIdentifier.Contains("SENDAS") ? "Send As" : ROPE_ResourceIdentifier.Contains("SENDONBEHALF") ? "Send on Behalf" : null
userMailboxGuidExpressionROPE_ResourceCBK.Substring(ROPE_ResourceCBK.IndexOf("_") + 1, ROPE_ResourceCBK.LastIndexOf("_") - ROPE_ResourceCBK.IndexOf("_") - 1)
  1. Click OK.

Distribution Resource Type

  1. Go to Task mappings. Open DistributionGroup and click Mappings.
  2. Modify/add the following items to the already existing task mapping:
DestinationOperatorSource
NameExpressionOperation == "CreateIfNotExists" ? RLM_NAME : null
AliasMapRLM_NAME
bundledAttributesExpressionstring.Format("CustomAttribute1=0", RLM_ODWLOGICKEY)
  1. Click OK and then New.
  2. Select DistributionGroupAssignment and click OK. Enter the following details:
Configuration
  1. Click Mappings. Enter the following details:
DestinationOperatorSource
Object IdMapObjectId
Object typeConstantDistributionGroupAssignment
OperationMapOperation
IdentityMapROPE_DistinguisedName
distributionGroupGuidExpressionROPE_ResourceCBK.Substring(ROPE_ResourceCBK.IndexOf("_") + 1, ROPE_ResourceCBK.LastIndexOf("<") - ROPE_ResourceCBK.IndexOf("_") - 1)
DistributionGroupLocationConstantCloud
  1. Click OK.

MailboxAccess Resource Type

  1. Go to Task mappings. Click New and select MailboxAccess.
  2. Enter the following details:
Configuration
  1. Click Mappings. Enter the following details:
DestinationOperatorSource
Object IdMapObjectId
Object typeConstantMailboxAccess
OperationMapOperation
IdentityMapROPE_DistinguisedName
mailboxPermissionExpressionROPE_ResourceIdentifier.Contains("FULLMAILBOXACCESS") ? "Full Access" : ROPE_ResourceIdentifier.Contains("SENDAS") ? "Send As" : ROPE_ResourceIdentifier.Contains("SENDONBEHALF") ? "Send on Behalf" : null
userMailboxGuidExpressionROPE_ATTR_MAILBOXREF.Remove(0, ROPE_ATTR_MAILBOXREF.IndexOf('>') + 1).Remove(ROPE_ATTR_MAILBOXREF.Remove(0, ROPE_ATTR_MAILBOXREF.IndexOf('>') + 1).IndexOf('<'))
MailboxLocationMapROPE_ATTR_MAILBOXLOCATION

Click OK.

Attribute sets

  1. Go to Setup > Attribute sets
  2. Click Exchange User Mailbox Attributes and then the Mailbox Location attribute.
  3. Disable the Hide Attribute option.
  4. Click OK.