通过


用于Microsoft Entra ID 预配的 SuccessFactors 表达式映射函数

本文提供了在将 SuccessFactors 配置为Microsoft Entra ID 用户预配时常用的表达式映射函数的综合指南。 这些函数有助于转换和映射 SuccessFactors 中的数据,以便在 Microsoft Entra ID 中创建适当的用户属性。

目录

字符串作函数

基本字符串作

方案 1:需要填充一个包含前导零的人员 ID,以创建一个 8 个字符的字符串。

目标属性:employeeId

Replace(Join("","00000000",[personIdExternal]), ,"(.*?)(?<id>.{0,8})$", ,"${id}", ,)

例:

  • 输入值:[personIdExternal] = “12345”
  • 表达式输出00012345

方案 2:需要使用前导零填充成本中心,使其包含 10 个字符。

目标属性:extensionAttribute1

Replace(Join("","0000000000",[costCenterId]), ,"(.*?)(?<id>.{0,10})$", ,"${id}", ,)

例:

  • 输入值:[costCenterId] = “567”
  • 表达式输出0000000567

方案 3:你想要通过将前缀追加到填充的员工编号来创建员工 ID。

目标属性:employeeId

Append("05",Replace(Join("","000000",[employeeId]), ,"(.*?)(?<id>.{0,6})$", ,"${id}", ,))

例:

  • 输入值:[employeeId] = “789”
  • 表达式输出05000789

文本大小写转换

方案 1:需要将所有大写的名称转换为正确的大小写(标题大小写)。

目标属性:sn

Join("",Mid([lastName],1,1),ToLower(Mid([lastName],2,64)))

例:

  • 输入值:[lastName] = “JOHNSON”
  • 表达式输出Johnson

方案 2:你想要创建具有正确大小写格式的显示名称。

目标属性:displayName

Join(", ", Join("",Mid([lastName],1,1),ToLower(Mid([lastName],2,64))), Join("",Mid([firstName],1,1),ToLower(Mid([firstName],2,64))))

例:

  • 输入值:[lastName] = “SMITH”, [firstName] = “JOHN”
  • 表达式输出Smith, John

方案 3:需要通过将空格替换为句点来处理具有空格的名称。

目标属性:givenName

Replace([firstName]," ", , ,".", , )

例:

  • 输入值:[firstName] = “Mary Ann”
  • 表达式输出Mary.Ann

电子邮件地址生成

基本电子邮件生成

方案 1:你想要使用名字和姓氏和公司特定的域生成电子邮件地址。

目标属性:邮件

SelectUniqueValue(
    Switch([company], 
        Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com"),
        "Contoso", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com"),
        "Fabrikam", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "fabrikam.com"),
        "Woodgrove", Join("@", NormalizeDiacritics(StripSpaces(Join(".", Mid([firstName],1,1), [lastName]))), "woodgrove.com")
    ),
    Switch([company], 
        Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], Mid([middleName],1,1), [lastName]))), "contoso.com"), 
        "Contoso", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], Mid([middleName],1,1), [lastName]))), "contoso.com"), 
        "Fabrikam", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], Mid([middleName],1,1), [lastName]))), "fabrikam.com"), 
        "Woodgrove", Join("@", NormalizeDiacritics(StripSpaces(Join(".", Mid([firstName],1,1), Mid([middleName],1,1), [lastName]))), "woodgrove.com")
    )
)

例:

  • 输入值:[company] = “Contoso”, [firstName] = “John”, [lastName] = “Smith”, [middleName] = “Michael”
  • 表达式的输出john.smith@contoso.com (或者 john.m.smith@contoso.com 如果采用第一个选项)

基于员工组的电子邮件生成

方案 1:你想要基于员工分类生成不同的电子邮件格式(永久的与临时的)。

目标属性:userPrincipalName

StripSpaces(NormalizeDiacritics(Switch([custom06], 
    Join("", [firstName], ".", [lastName], "@ltts.com"), 
    "Temporary", Join("", [firstName], ".", [lastName], "_ext@ltts.com"), 
    "External", Join("", [firstName], ".", [lastName], "_ext@ltts.com"), 
    "Permanent", Join("", [firstName], ".", [lastName], "@ltts.com")
)))

例:

  • 输入值:[custom06] = “Temporary”, [firstName] = “Sarah”, [lastName] = “Wilson”
  • 表达式输出sarah.wilson_ext@ltts.com

公司域验证

方案 1:仅希望流式处理属于特定公司域的电子邮件地址。

目标属性:邮件

IgnoreFlowIfNullOrEmpty(IIF(InStr([emailAddress],"@contoso.com")=0,"",[emailAddress]))

例:

  • 输入值:[emailAddress] = “john.doe@contoso.com”
  • 表达式输出john.doe@contoso.com
  • 可选输入:[emailAddress] = “john.doe@external.com”
  • 备用输出(空 - 忽略)

现有电子邮件保留

方案 1:你希望对某些部门使用 SuccessFactors 中的现有电子邮件,但为其他部门生成新电子邮件。

目标属性:userPrincipalName

SelectUniqueValue(
    Switch([divisionId], 
        Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com"), 
        "8900", [email]
    ), 
    Join("1@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com"), 
    Join("2@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com")
)

例:

  • 输入值:[divisionId] = “8900”, [email] = “existing.user@company.com”, [firstName] = “Mike”, [lastName] = “Brown”
  • 表达式输出existing.user@company.com
  • 可选输入:[divisionId] = “1200”, [firstName] = “Mike”, [lastName] = “Brown”
  • 备用输出mike.brown@contoso.com

帐户管理逻辑

基本帐户状态

方案 1:你希望根据就业状态确定是否应禁用帐户。

目标属性:accountDisabled

Switch([emplStatus], "False", "741", "False", "749", "True", "746", "True")

例:

  • 输入值:[emplStatus] = “741”
  • 表达式输出False (已启用帐户)
  • 可选输入:[emplStatus] = “746”
  • 备用输出True (帐户已禁用)

隐藏地址列表逻辑

方案 1:需要基于开始日期和结束日期设置 msExchHideFromAddressLists 属性。

目标属性:msExchHideFromAddressLists

IIF(DateDiff("d", CDate(IIF(IsPresent([startDate]), [startDate], DateAdd("d", "10", Now()))), Now()) >= -1, IIF(DateDiff("d", Now(), CDate(IIF(IsPresent([endDate]), [endDate], DateAdd("d", "1", Now())))) >= 0, "FALSE", "TRUE"), "TRUE")

例:

  • 输入值:[startDate] = “2025-01-15”, [endDate] = “2025-12-31” (当前日期:2025-07-30)
  • 表达式输出FALSE (地址列表中未隐藏)
  • 可选输入:[startDate] = “2025-01-15”, [endDate] = “2025-06-30”
  • 备用输出TRUE (隐藏在地址列表中)

复杂的员工状态逻辑

方案 1:需要根据自定义字段和雇用日期禁用帐户。

目标属性:accountEnabled

Switch([empNavCustomString3], "True",
"62220", Switch([cust_hiredate], 
    IIF(DateDiff("d", CDate([cust_hiredate]), Now()) = 3, 
        Switch([cust_customDate67], 
            IIF(DateDiff("d", CDate([cust_customDate67]), Now())=0, "False", "True"),
            "", "False" 
        ), "True"
    ),
    "", "True"
))

例:

  • 输入值:[empNavCustomString3] = “62220”, [cust_hiredate] = “2025-07-27”, [cust_customDate67] = “2025-07-30” (当前日期:2025-07-30)
  • 表达式输出False (已启用帐户)
  • 可选输入:[empNavCustomString3] = “62220”, [cust_hiredate] = “2025-07-27”, [cust_customDate67] = “2025-07-29”
  • 备用输出True (帐户已禁用)

日期函数和帐户过期

基本帐户过期

方案 1:你想要根据 SuccessFactors 的结束日期设置帐户过期时间。

目标属性:accountExpires

Switch([endDate], 
    NumFromDate(Join("", FormatDateTime([endDate], "M/d/yyyy hh:mm:ss tt", "yyyy-MM-dd"), " 23:59:59-05:00")), 
    "", "9223372036854775807"
)

例:

  • 输入值:[endDate] = “2025/12/31 12:00:00 AM”
  • 表达式输出133835135990000000 (2025-12-31 23:59:59-05:00 的数字表示形式)
  • 可选输入:[endDate] = “” (空)
  • 备用输出9223372036854775807 (永不过期)

基于就业类型的到期时间

方案 1:你需要根据雇佣类型(永久与承包商)设置不同的帐户到期规则。

目标属性:accountExpires

Switch([employmentType], 
    NumFromDate(Join("",FormatDateTime([endDate], ,"M/d/yyyy hh:mm:ss tt","yyyy-MM-dd")," 23:59:59-05:00")),
    "PM", NumFromDate(Join("",FormatDateTime(DateAdd("yyyy", 60, CDate([DOB])), ,"M/d/yyyy hh:mm:ss tt","yyyy-MM-dd")," 23:59:59-05:00")),
    "CON", NumFromDate(Join("",FormatDateTime([endDate], ,"M/d/yyyy hh:mm:ss tt","yyyy-MM-dd")," 23:59:59-05:00"))
)

例:

  • 输入值:[employmentType] = “PM”, [DOB] = “1/15/1990 12:00:00 AM”
  • 表达式输出158488415990000000 (2050-01-15 23:59:59-05:00,出生后60年的数字表示形式)
  • 可选输入:[employmentType] = “CON”, [endDate] = “2025/12/31 12:00:00 AM”
  • 可选输出133835135990000000 (2025-12-31 23:59:59-05:00 的数字表示形式)

基于事件原因的帐户过期

方案 1:你想要根据特定的终止事件和断期日期设置帐户过期时间。

目标属性:accountExpires

Switch([event], 
    IIF(IsPresent([latestTerminationDate]), NumFromDate(Join("", FormatDateTime([latestTerminationDate], , "M/d/yyyy hh:mm:ss tt", "yyyy-MM-dd"), " 23:59:59-08:00")), "9223372036854775807"), 
    "SEVUNSATP", NumFromDate(Join("", FormatDateTime([severanceStartDate], , "M/d/yyyy hh:mm:ss tt", "yyyy-MM-dd"), " 23:59:59-08:00")), 
    "SEVPOSELIM", NumFromDate(Join("", FormatDateTime([severanceStartDate], , "M/d/yyyy hh:mm:ss tt", "yyyy-MM-dd"), " 23:59:59-08:00")), 
    "POSELIM", NumFromDate(Join("", FormatDateTime([severanceStartDate], , "M/d/yyyy hh:mm:ss tt", "yyyy-MM-dd"), " 23:59:59-08:00"))
)

例:

  • 输入值:[event] = “SEVUNSATP”, [severanceStartDate] = “8/15/2025 12:00:00 AM”
  • 表达式输出133877247990000000 (2025-08-15 23:59:59-08:00 的数字表示形式)
  • 可选输入:[event] = “REGULAR”, [latestTerminationDate] = “9/30/2025 12:00:00 AM”
  • 可选输出133886207990000000 (2025-09-30 23:59:59-08:00 的数字表示形式)

日期格式处理

方案 1:需要处理导致 NumFromDate 中的错误的日期,例如“12/31/9999”。

目标属性:accountExpires

Switch([endDate],
    NumFromDate(Join("", FormatDateTime([endDate], "M/d/yyyy hh:mm:ss tt", "yyyy-MM-dd"), "T23:59:59-04:00")),
    "12/31/9999 12:00:00 AM", NumFromDate("2099-12-31T23:59:59-04:00")
)

例:

  • 输入值:[endDate] = “12/31/9999 12:00:00 AM”
  • 表达式输出441481535990000000 (2099-12-31T23:59:59-04:00 的数字表示形式)
  • 可选输入:[endDate] = “8/15/2025 12:00:00 AM”
  • 可选输出133877283990000000 (2025-08-15T23:59:59-04:00 的数字表示形式)

组织单位(OU)分配

基于部门的 OU 分配

方案 1:你希望基于其部门将用户放置在不同的 OU 中。

目标属性:parentDistinguishedName

Switch([department], "OU=SuccessFactors,DC=contoso,DC=com", 
    "Engineering SG", "OU=Engineering,OU=SuccessFactors,DC=contoso,DC=com", 
    "Shared Services", "OU=Shared Services,OU=SuccessFactors,DC=contoso,DC=com", 
    "Retail - Finance", "OU=Retail Finance,OU=SuccessFactors,DC=contoso,DC=com", 
    "Information Technology BR", "OU=Information Technology,OU=SuccessFactors,DC=contoso,DC=com", 
    "Development", "OU=Development,OU=SuccessFactors,DC=contoso,DC=com"
)

例:

  • 输入值:[department] = “Engineering SG”
  • 表达式输出OU=Engineering,OU=SuccessFactors,DC=contoso,DC=com
  • 可选输入:[department] = “Marketing”
  • 备用输出OU=SuccessFactors,DC=contoso,DC=com (默认值)

基于就业状态的 OU 分配

方案 1:需要根据用户就业状态和位置将用户分配到不同的 OU。

目标属性:parentDistinguishedName

Join("",
Switch([emplStatus], "OU=SFProvisoinngUsers", 
"741", Switch([empJobNavCustomString13],
    "OU=SFProvisoinngUsers",
    "LOC1016", "OU=Mysore",
    "LOC1019", "OU=Baroda",
    "LOC1015", Switch([departmentId],
        "OU=Bangalore",
        "DU1026","OU=IT,OU=Bangalore",
        "DU1025","OU=IT,OU=Bangalore"
        )
    ), 
"749", Switch([empJobNavCustomString13],
    "OU=O365-NoSYNC,OU=SFProvisoinngUsers",
    "LOC1016", "OU=O365-NoSYNC,OU=Mysore",
    "LOC1019", "OU=O365-NoSYNC,OU=Baroda",
    "LOC1015", "OU=O365-NoSYNC,OU=Bangalore"
    )
),
",DC=contoso,DC=com")

例:

  • 输入值:[emplStatus] = “741”, [empJobNavCustomString13] = “LOC1015”, [departmentId] = “DU1026”
  • 表达式输出OU=IT,OU=Bangalore,DC=contoso,DC=com
  • 可选输入:[emplStatus] = “749”, [empJobNavCustomString13] = “LOC1016”
  • 备用输出OU=O365-NoSYNC,OU=Mysore,DC=contoso,DC=com
  • 可选输入:[emplStatus] = “741”, [empJobNavCustomString13] = “LOC9999” (未定义)
  • 备用输出OU=SFProvisoinngUsers,DC=contoso,DC=com (默认值)

基于国家/地区的 OU 分配

方案 1:你希望基于其所在国家/地区为非活动用户放置禁用的 OU 的不同 OU。

目标属性:parentDistinguishedName

Switch([activeEmploymentsCount],
    Switch([country], "OU=Accounts,DC=corp,DC=contoso,DC=com", 
        "Mexico", "OU=Mexico,OU=Accounts,DC=corp,DC=contoso,DC=com", 
        "Sweden", "OU=Sweden,OU=Accounts,DC=corp,DC=contoso,DC=com", 
        "Colombia", "OU=Internal Accounts,OU=Colombia,OU=Accounts,DC=corp,DC=contoso,DC=com", 
        "Brazil", "OU=Internal Accounts,OU=Brazil,OU=Accounts,DC=corp,DC=contoso,DC=com"
    ),
    "0", "OU=DisabledAccounts,OU=Accounts,DC=corp,DC=contoso,DC=com"
)

例:

  • 输入值:[activeEmploymentsCount] = “1”, [country] = “墨西哥”
  • 表达式输出OU=Mexico,OU=Accounts,DC=corp,DC=contoso,DC=com
  • 可选输入:[activeEmploymentsCount] = “0”, [country] = “瑞典”
  • 备用输出OU=DisabledAccounts,OU=Accounts,DC=corp,DC=contoso,DC=com (无论国家/地区,禁用的用户都转到特殊 OU)
  • 可选输入:[activeEmploymentsCount] = “1”, [country] = “Germany”
  • 备用输出OU=Accounts,DC=corp,DC=contoso,DC=com (未明确定义的国家/地区的默认 OU)

名称处理和显示名称

公用名 (CN) 生成

方案 1:需要为重复项生成具有回退选项的唯一公用名。

目标属性:cn

SelectUniqueValue(
    NormalizeDiacritics(Join(" ", [firstName], [lastName])),
    NormalizeDiacritics(Join(" ", [firstName], Mid([middleName],1,1), [lastName])),
    NormalizeDiacritics(Join(" ", [firstName], [middleName], [lastName]))
)

例:

  • 输入值:[firstName] = “Jose”, [lastName] = “García”, [middleName] = “Antonio”
  • 表达式输出Jose Garcia (或者 Jose A Garcia 采用第一个选项,或者 Jose Antonio Garcia 采用前两个选项)

具有首选名称的显示名称

方案 1:需要在可用时创建使用首选名称的显示名称,否则回退到名字。

目标属性:displayName

Join(", ", Join("", Mid([lastName], 1, 1), ToLower(Mid([lastName], 2, 64), )), Join("", Mid(Coalesce([preferredName], [firstName]), 1, 1), ToLower(Mid(Coalesce([preferredName], [firstName]), 2, 64), )))

例:

  • 输入值:[lastName] = “JOHNSON”, [preferredName] = “Mike”, [firstName] = “Michael”
  • 表达式输出Johnson, Mike
  • 可选输入:[lastName] = “SMITH”, [preferredName] = “”, [firstName] = “Robert”
  • 备用输出Smith, Robert

带数字后缀的显示名称

方案 1:你想要为重复项生成具有数字后缀的唯一显示名称。

目标属性:displayName

SelectUniqueValue(
    Join("", NormalizeDiacritics(Join("", [lastName], ", ")), NormalizeDiacritics(Switch([preferredName], [preferredName], "", [firstName]))), 
    Join("", NormalizeDiacritics(Join("", [lastName], "2, ")), NormalizeDiacritics(Switch([preferredName], [preferredName], "", [firstName]))), 
    Join("", NormalizeDiacritics(Join("", [lastName], "3, ")), NormalizeDiacritics(Switch([preferredName], [preferredName], "", [firstName]))), 
    Join("", NormalizeDiacritics(Join("", [lastName], "4, ")), NormalizeDiacritics(Switch([preferredName], [preferredName], "", [firstName])))
)

例:

  • 输入值:[lastName] = “García”, [preferredName] = “Mike”, [firstName] = “Michael”
  • 表达式输出Garcia, Mike (或者 Garcia2, Mike 采用第一个选项等)
  • 可选输入:[lastName] = “Smith”, [preferredName] = “”, [firstName] = “John”
  • 备用输出Smith, John (或者 Smith2, John 如果采用第一个选项等)

SamAccountName 生成

基本 samAccountName 生成

方案 1:你想要使用具有正确字符清理的第一个名字和姓氏创建 samAccountName。

目标属性:sAMAccountName

SelectUniqueValue(
    Replace(Mid(Replace(NormalizeDiacritics(StripSpaces(Join("", Mid([firstName],1,1), [lastName]))), , "([\\/\\\\\\[\\]\\:\\;\\|\\=\\,\\+\\*\\?\\<\\>])", , "", , ), 1, 20), , "(\\.)*$", , "", , ),
    Join("",Replace(Mid(Replace(NormalizeDiacritics(StripSpaces(Join("", Mid([firstName],1,1), [lastName]))), , "([\\/\\\\\\[\\]\\:\\;\\|\\=\\,\\+\\*\\?\\<\\>])", , "", , ), 1, 19), , "(\\.)*$", , "", , ),"1"),
    Join("",Replace(Mid(Replace(NormalizeDiacritics(StripSpaces(Join("", Mid([firstName],1,1), [lastName]))), , "([\\/\\\\\\[\\]\\:\\;\\|\\=\\,\\+\\*\\?\\<\\>])", , "", , ), 1, 19), , "(\\.)*$", , "", , ),"2")
)

例:

  • 输入值:[firstName] = “Jose”, [lastName] = “García-López”
  • 表达式输出jgarcialopez (或者 jgarcialopez1 采用第一个选项,或者 jgarcialopez2 采用前两个选项)

具有变量名字长度的 SamAccountName

方案 1:希望通过增加名字中的字符数来处理重复项。

目标属性:sAMAccountName

SelectUniqueValue(
    Replace(Mid(Replace(NormalizeDiacritics(StripSpaces(Join("", Mid([firstName],1,1), [lastName]))), , "([\\/\\\\\\[\\]\\:\\;\\|\\=\\,\\+\\*\\?\\<\\>])", , "", , ), 1, 20), , "(\\.)*$", , "", , ),
    Replace(Mid(Replace(NormalizeDiacritics(StripSpaces(Join("", Mid([firstName],1,2), [lastName]))), , "([\\/\\\\\\[\\]\\:\\;\\|\\=\\,\\+\\*\\?\\<\\>])", , "", , ), 1, 20), , "(\\.)*$", , "", , ),
    Replace(Mid(Replace(NormalizeDiacritics(StripSpaces(Join("", Mid([firstName],1,3), [lastName]))), , "([\\/\\\\\\[\\]\\:\\;\\|\\=\\,\\+\\*\\?\\<\\>])", , "", , ), 1, 20), , "(\\.)*$", , "", , )
)

例:

  • 输入值:[firstName] = “Christopher”, [lastName] = “Anderson”
  • 表达式输出canderson (或者 chanderson 采用第一个选项,或者 chranderson 采用前两个选项)
  • 可选输入:[firstName] = “María”, [lastName] = “Rodríguez-Santos”
  • 备用输出mrodriguezsantos (或者 marodriguezsantos 采用第一个选项,或者 marrodriguezsantos 采用前两个选项)

来自外部用户名的 SamAccountName

方案 1:你想要从电子邮件样式的外部用户名中提取用户名部分。

目标属性:sAMAccountName

Replace(Mid(Replace(Replace([username],,"(?<id>.*)@(?<domain>.*)",,"${id}",,), , "([\\/\\\\\\[\\]\\:\\;\\|\\=\\,\\+\\*\\?\\<\\>])", , "", , ), 1, 20), , "(\\.)*$", , "", , )

例:

  • 输入值:[username] = “john.smith@external.com”
  • 表达式输出johnsmith

ProxyAddresses 配置

基本 proxyAddresses 设置

方案 1:你想要设置多个代理地址,包括主要和辅助 SMTP 地址。

目标属性:proxyAddresses

Split(
    Join(",", 
        Append("smtp:", Join("@", NormalizeDiacritics(StripSpaces(Join("", "A", [personIdExternal]))), "contoso.mail.onmicrosoft.com")), 
        Append("smtp:", Join("@", NormalizeDiacritics(StripSpaces(Join("", "A", [personIdExternal]))), "contoso.com")), 
        Append("SMTP:", Join("@", Join(".", StripSpaces([firstName]), StripSpaces([lastName])), "contoso.com"))
    ), 
    ","
)

例:

  • 输入值:[personIdExternal] = “12345”, [firstName] = “John”, [lastName] = “Smith”
  • 表达式输出["smtp:A12345@contoso.mail.onmicrosoft.com", "smtp:A12345@contoso.com", "SMTP:John.Smith@contoso.com"]

基于分区的 proxyAddresses

方案 1:需要基于员工部门的不同代理地址配置。

目标属性:proxyAddresses

Split(
    Switch([divisionId], 
        Join(",", 
            Append("smtp:", Join("@", NormalizeDiacritics(StripSpaces(Join("", "A", [personIdExternal]))), "woodgrove.mail.onmicrosoft.com")), 
            Append("smtp:", Join("@", NormalizeDiacritics(StripSpaces(Join("", "A", [personIdExternal]))), "woodgrove.com")), 
            Append("SMTP:", Join("@", Join(".", StripSpaces([firstName]), StripSpaces([lastName])), "woodgrove.com"))
        ),			
        "EXEC", Join(",", 
            Append("smtp:", Join("@", Join(".", StripSpaces([firstName]), StripSpaces([lastName])), "contoso.com")), 
            Append("SMTP:", [email])
        )
    ),
    ","	
)

例:

  • 输入值:[divisionId] = “STANDARD”, [personIdExternal] = “67890”, [firstName] = “Sarah”, [lastName] = “Johnson”
  • 表达式输出["smtp:A67890@woodgrove.mail.onmicrosoft.com", "smtp:A67890@woodgrove.com", "SMTP:Sarah.Johnson@woodgrove.com"]
  • 可选输入:[divisionId] = “EXEC”, [firstName] = “Michael”, [lastName] = “Brown”, [email] = “mbrown@fabrikam.com”
  • 备用输出["smtp:Michael.Brown@contoso.com", "SMTP:mbrown@fabrikam.com"]

特定于公司的 proxyAddresses

方案 1:你想要基于公司附属关系生成代理地址。

目标属性:proxyAddresses

SelectUniqueValue (
    Switch([company], 
        Append ("SMTP:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com")),
        "NGC", Append ("SMTP:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com")),
        "CNG", Append ("SMTP:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com")),
        "National Energy", Append ("SMTP:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", Mid([firstName],1,1), [lastName]))), "fabrikam.com"))
    ),
    Switch([company], 
        Append ("SMTP:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], Mid([middleName],1,1), [lastName]))), "contoso.com")), 
        "NGC", Append ("SMTP:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], Mid([middleName],1,1), [lastName]))), "contoso.com")), 
        "CNG", Append ("SMTP:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], Mid([middleName],1,1), [lastName]))), "contoso.com")), 
        "National Energy", Append ("SMTP:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", Mid([firstName],1,1), Mid([middleName],1,1), [lastName]))), "fabrikam.com"))
    )
)

例:

  • 输入值:[company] = “NGC”, [firstName] = “特立尼达”, [lastName] = “Williams”, [middleName] = “James”
  • 表达式的输出SMTP:trinidad.williams@contoso.com (或者 SMTP:trinidad.j.williams@contoso.com 如果采用第一个选项)
  • 可选输入:[company] = “National Energy”, [firstName] = “Rebecca”, [lastName] = “Thompson”, [middleName] = “Marie”
  • 备用输出SMTP:r.thompson@fabrikam.com (或者 SMTP:r.m.thompson@fabrikam.com 如果采用第一个选项)
  • 可选输入:[company] = “Other Company”, [firstName] = “David”, [lastName] = “Jones”, [middleName] = “Paul”
  • 备用输出SMTP:david.jones@contoso.com (默认域,或者 SMTP:david.p.jones@contoso.com 采用第一个选项)

电话号码处理

基本电话号码提取

方案 1:需要提取电话号码部分,而无需国家/地区代码。

目标属性:telephoneNumber

Replace(Replace([mobile], , "\\+(?<isdCode>\\d* )(?<phoneNumber>.*)", , "${phoneNumber}", , ), ,"[()\\s-]+", ,"", , )

例:

  • 输入值:[mobile] = “+1 (555) 123-4567”
  • 表达式输出5551234567

方案 2:只需从电话号码中提取国家/地区代码。

目标属性: c

Replace(Replace([mobile], , "\\+(?<isdCode>\\d* )(?<phoneNumber>.*)", , "${isdCode}", , ), ,"[()\\s-]+", ,"", , )

例:

  • 输入值:[mobile] = “+44 20 7946 0958”
  • 表达式输出44

电话号码默认值

方案 1:当字段为空时,需要提供默认电话号码。

目标属性:telephoneNumber

IIF(IsNullOrEmpty([telephoneNumber]),"000-000-0000",[telephoneNumber])
Switch([mobile],[mobile],"","000-000-0000")

例:

  • 输入值:[telephoneNumber] = “”
  • 表达式输出000-000-0000
  • 可选输入:[mobile] = “555-123-4567”
  • 备用输出555-123-4567

主要电话逻辑

方案 1:需要确定应将哪个电话号码标记为主要电话号码。

目标属性:extensionAttribute2

Switch(Join("+",Switch([businessPhoneIsPrimary],[businessPhoneIsPrimary],"","other"),Switch([cellPhoneIsPrimary],[cellPhoneIsPrimary],"","other")), "no primary phone", 
"false+false", "no primary phone",
"true+false", "business phone is primary",
"false+true", "cell phone is primary",
"true+true", "business phone is primary, cell phone is primary",
"other+true", "cell phone is primary",
"other+false", "no primary phone",
"true+other", "business phone is primary",
"false+other", "no primary phone")

例:

  • 输入值:[businessPhoneIsPrimary] = “true”, [cellPhoneIsPrimary] = “false”
  • 表达式输出business phone is primary
  • 可选输入:[businessPhoneIsPrimary] = “false”, [cellPhoneIsPrimary] = “true”
  • 备用输出cell phone is primary
  • 可选输入:[businessPhoneIsPrimary] = “”,[cellPhoneIsPrimary] = “true”
  • 备用输出cell phone is primary

国家/地区和基于位置的逻辑

国家/地区代码映射

方案 1:你想要将国家/地区名称映射到 ISO 国家/地区代码。

目标属性: c

Switch([country], ,
  "Trinidad and Tobago", "TT",
  "Barbados", "BB"
)

例:

  • 输入值:[country] = “特立尼达和多巴哥”
  • 表达式输出TT

方案 2:需要将国家/地区映射到数字国家/地区代码。

目标属性:countryCode

Switch([country], ,
  "Trinidad and Tobago", "780",
  "Barbados", "52"
)

例:

  • 输入值:[country] = “巴巴多斯”
  • 表达式输出52

基于位置的电子邮件域

方案 1:你想要根据地理位置分配不同的电子邮件域。

目标属性:邮件

SelectUniqueValue (
    Switch([country], 
        Join("@", NormalizeDiacritics(StripSpaces(Join("", [firstName], [lastName]))), "fabrikam.com"),
        "India", Join("@", NormalizeDiacritics(StripSpaces(Join("", [firstName], [lastName]))), "fabrikam.com"),
        "Netherlands", Join("@", NormalizeDiacritics(StripSpaces(Join("", [firstName], [lastName]))), "contoso.com")
    ),
    Switch([country], 
        Join("1@", NormalizeDiacritics(StripSpaces(Join("", [firstName], [lastName]))), "fabrikam.com"),
        "India", Join("1@", NormalizeDiacritics(StripSpaces(Join("", [firstName], [lastName]))), "fabrikam.com"),
        "Netherlands", Join("1@", NormalizeDiacritics(StripSpaces(Join("", [firstName], [lastName]))), "contoso.com")
    )
)

例:

  • 输入值:[country] = “India”, [firstName] = “Raj”, [lastName] = “Patel”
  • 表达式的输出raj.patel@fabrikam.com (或者 1raj.patel@fabrikam.com 如果采用第一个选项)
  • 可选输入:[country] = “荷兰”, [firstName] = “Jan”, [lastName] = “van der Berg”
  • 备用输出jan.vanderberg@contoso.com (或者 1jan.vanderberg@contoso.com 如果采用第一个选项)
  • 可选输入:[country] = “Germany”, [firstName] = “Klaus”, [lastName] = “Müller”
  • 备用输出klaus.muller@fabrikam.com (默认域,或者 1klaus.muller@fabrikam.com 采用第一个选项)

员工分类和临时员工

就业类型分类

方案 1:你想要将员工类型代码映射到可读说明。

目标属性:extensionAttribute3

Switch([employeeType],"Default-value",
    "31202","Employee",
    "31230","Contractor"
)

例:

  • 输入值:[employeeType] = “31202”
  • 表达式输出Employee
  • 可选输入:[employeeType] = “99999”
  • 备用输出Default-value

临时辅助角色标识

方案 1:需要以不同的方式识别和处理临时工。

目标属性:extensionAttribute4

Switch([isContingentWorker], "N/A", "True", "Contractor", "False", "Employee")

例:

  • 输入值:[isContingentWorker] = “True”
  • 表达式输出Contractor

个人游戏映射

方案 1:你想要将个人游戏代码映射到适当的游戏。

IgnoreFlowIfNullOrEmpty(Switch([personalTitle], "", "4443", "Dr.", "4444", "Prof.", "4445", "Prof. Dr."))

例:

  • 输入值:[personalTitle] = “4443”
  • 表达式输出Dr.
  • 可选输入:[personalTitle] = “”
  • 备用输出(空 - 忽略)

高级方案

条件部门处理

方案 1:希望在可用时使用全局分配部门,否则请回退到常规部门。

目标属性:部门

Switch([globalAssignmentDepartment],[globalAssignmentDepartment],
"",[department])

例:

  • 输入值:[globalAssignmentDepartment] = “Global IT”, [department] = “Local IT”
  • 表达式输出Global IT
  • 可选输入:[globalAssignmentDepartment] = “”, [department] = “Sales”
  • 备用输出Sales

软删除电子邮件处理

方案 1:对于写回方案,需要修改用户软删除的电子邮件地址。

目标属性:邮件

IIF([IsSoftDeleted]="True", Join("_",FormatDateTime(Now(), , "M/d/yyyy h:mm:ss tt", "yyyy-MM-dd"),[mail]), [mail])

例:

  • 输入值:[IsSoftDeleted] = “True”, [mail] = “john.smith@company.com” (当前日期:2025-07-30)
  • 表达式输出2025-07-30_john.smith@company.com
  • 可选输入:[IsSoftDeleted] = “False”, [mail] = “jane.doe@company.com”
  • 备用输出jane.doe@company.com

使用终止逻辑的复杂 OU 分配

方案 1:想要在特定天数后将终止的用户移动到特殊 OU。

目标属性:parentDistinguishedName

IIF(DateDiff("d", Now(), CDate(Switch([latestTerminationDate], [latestTerminationDate], "", "9999-01-01"))) <= -14,
    "OU=DELETED,DC=company,DC=com",
    Switch([department], "OU=Default,DC=company,DC=com", 
        "Engineering", "OU=Engineering,DC=company,DC=com", 
        "Finance", "OU=Finance,DC=company,DC=com"
    )
)

例:

  • 输入值:[latestTerminationDate] = “2025-07-10”, [department] = “Engineering” (当前日期: 2025-07-30)
  • 表达式输出OU=DELETED,DC=company,DC=com (终止时间超过 14 天)
  • 可选输入:[latestTerminationDate] = “2025-07-25”, [department] = “Finance”
  • 备用输出OU=Finance,DC=company,DC=com (在 14 天前终止)

带员工类的多公司 UPN 代系

方案 1:需要基于公司和员工类信息生成 UPN。

目标属性:userPrincipalName

SelectUniqueValue (
    Switch([employeeClass], 
        Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com"),
        "1916", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com"),
        "1915", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "fabrikam.com"),
        "1917", Join("@", NormalizeDiacritics(StripSpaces(Join(".", Mid([firstName],1,1), [lastName]))), "woodgrove.com")
    ),
    Switch([employeeClass], 
        Join("01@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com"),
        "1916", Join("01@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com"),
        "1915", Join("01@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "fabrikam.com"),
        "1917", Join("01@", NormalizeDiacritics(StripSpaces(Join(".", Mid([firstName],1,1), [lastName]))), "woodgrove.com")
    )
)

例:

  • 输入值:[employeeClass] = “1915”, [firstName] = “Anna”, [lastName] = “Johnson”
  • 表达式的输出anna.johnson@fabrikam.com (或者 01anna.johnson@fabrikam.com 如果采用第一个选项)

撇号和特殊字符处理

方案 1:需要从电子邮件地址中删除撇号和短划线,以便实现 Azure AD Connect 兼容性。

目标属性:邮件

SelectUniqueValue(
  Switch ([divisionId], 
    Replace(Join("@", NormalizeDiacritics(StripSpaces(Join(".", Coalesce([preferredName], [firstName]), [lastName]))), "contoso.com"), , "['-]+", , "", , ), 
    "8900", [email]
  ), 
  Replace(Join("1@", NormalizeDiacritics(StripSpaces(Join(".", Coalesce([preferredName], [firstName]), [lastName]))), "contoso.com"), , "['-]+", , "", , ), 
  Replace(Join("2@", NormalizeDiacritics(StripSpaces(Join(".", Coalesce([preferredName], [firstName]), [lastName]))), "contoso.com"), , "['-]+", , "", , )
)

例:

  • 输入值:[divisionId] = “1200”, [preferredName] = “Mary-Ann”, [firstName] = “Mary”, [lastName] = “O'Connor”
  • 表达式输出maryann.oconnor@contoso.com (已删除撇号和短划线)
  • 可选输入:[divisionId] = “8900”, [email] = “existing.user@company.com”
  • 备用输出existing.user@company.com

SIP 地址生成

方案 1:你想要为 Skype for Business/Teams 集成生成 SIP 地址。

目标属性:proxyAddresses

SelectUniqueValue( 
    Append("sip:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com")),
    Append("sip:", Join("01@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com")),
    Append("sip:", Join("02@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com"))
)

例:

  • 输入值:[firstName] = “David”, [lastName] = “Wilson”
  • 表达式的输出sip:david.wilson@contoso.com (或者 sip:01david.wilson@contoso.com 如果采用第一个选项)
  • 可选输入:[firstName] = “María Jose”, [lastName] = “González-Pérez”
  • 备用输出sip:mariajose.gonzalezperez@contoso.com (或者 sip:01mariajose.gonzalezperez@contoso.com 采用第一个选项,或者 sip:02mariajose.gonzalezperez@contoso.com 采用前两个选项)

写回条件逻辑

方案 1:你想要根据特定日期条件有条件地写回电子邮件地址。

目标属性:mailNickname

IgnoreFlowIfNullOrEmpty(IIF(DateDiff("d", Now(), CDate([extensionAttribute9])) <> 1, "", [mail]))

例:

  • 输入值:[extensionAttribute9] = “2025-07-31”, [mail] = “user@company.com” (当前日期:2025-07-30)
  • 表达式输出(空 - 忽略,因为日期差异为 1 天)
  • 可选输入:[extensionAttribute9] = “2025-08-01”, [mail] = “user@company.com”
  • 备用输出user@company.com

方案 2:需要在写回方案中处理缺少的属性。

目标属性:mailNickname

IgnoreFlowIfNullOrEmpty(IIF(IsPresent([extensionAttribute9]),IIF(DateDiff("d", Now(), CDate([extensionAttribute9])) <> 1, "", [mail]),"noemail@contoso.com"))

例:

  • 输入值:[extensionAttribute9] = “” (空), [mail] = “user@company.com”
  • 表达式输出noemail@contoso.com
  • 可选输入:[extensionAttribute9] = “2025-08-01”, [mail] = “user@company.com” (当前日期:2025-07-30)
  • 备用输出user@company.com

最佳做法

  • 对需要唯一性的所有属性使用 SelectUniqueValue(UPN、samAccountName、email)。

  • 使用函数(如IsNullOrEmptyIsPresentSwitchCoalesce处理 null 值和空值

  • 在处理名称时使用 NormalizeDiacritics 和 StripSpaces,以确保跨系统兼容。

  • 在生产环境中实现之前,在 JSONPath 测试器中验证 JSONPath 表达式

  • 使用 SuccessFactors 日期字段时,请使用正确的日期格式以避免转换错误。

  • 使用日期比较和帐户过期逻辑时,请考虑时区

  • 对条件属性流和写回方案使用 IgnoreFlowIfNullOrEmpty

  • 全面测试复杂的 Switch 语句,因为它们可能变得难以调试。

  • 明确记录业务逻辑,尤其是对于复杂的就业状态和帐户管理规则。

  • 在实现之前,请仔细使用正则表达式模式,并在联机正则表达式测试人员中对其进行验证。

更多资源