Skip to main content

Migrate to 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.