通过


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

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

目录

字符串作函数

基本字符串作

方案 1:你希望通过删除空格、方括号和短划线来清理来自 Workday 的电话号码值。

目标属性:telephoneNumber、mobile

Replace([PrimaryWorkTelephone], , "[()\\s-]+", , "", , )
Replace([Mobile], , "[()\\s-]+", , "", , )

例:

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

方案 2:需要从 PreferredNameData 包含“FirstName LastName”的字段中提取姓氏。

目标属性sn 在本地 Active Directory 中, surname 在 Microsoft Entra ID 中

Replace([PreferredNameData], , "(?<firstName>[a-zA-Z]+ )(?<lastName>[a-zA-Z]+)", ,"${lastName}", ,)

例:

  • 输入值:[PreferredNameData] = “John Smith”
  • 表达式输出Smith

方案 3:在将前导零与本地 Active Directory 中的员工 ID 匹配或Microsoft Entra ID 之前,需要从辅助角色 ID 中删除前导零。

目标属性:employeeId

Replace([WorkerID], , "(?<leadingZeros>^0+)(?<actualValue>[a-zA-Z0-9]+)", , "${actualValue}", ,)

例:

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

方案 4:该 HereditarySuffix 属性包含用国家/地区 ISO 代码标记的后缀信息,并且你只想提取后缀信息并将其追加到姓氏。

目标属性sn 在本地 Active Directory 中, surname 在 Microsoft Entra ID 中

Join(" ",Replace([HereditarySuffix], ,"(?<CountryISOCode>.*)_(?<suffix1>.*)_(?<suffix2>.*)[0-9]", ,"${suffix1} ${suffix2}", , ),[PreferredLastName])

例:

  • 输入值:[HereditarySuffix] = “NLD_Van_der3”, [PreferredLastName] = “Hof”
  • 表达式输出Van der Hof

文本大小写转换

方案 1:需要将文本转换为正确的大小写,但正确处理撇号(例如,“圣约翰医院”应成为“圣约翰医院”)。

目标属性:公司

Replace(PCase("st john's hospital"),"'S", , ,"'s", , )

例:

  • 输入值:静态文本“st john's hospital”
  • 表达式输出St John's Hospital

方案 2:要从名字和姓氏创建小写用户名。

目标属性:mailNickname

ToLower(NormalizeDiacritics(StripSpaces(Join(".", [PreferredFirstName], [PreferredLastName]))))

例:

  • 输入值:[PreferredFirstName] = “Jose”, [PreferredLastName] = “García-López”
  • 表达式输出jose.garcia-lopez

特定于国家/地区的命名逻辑

方案 1:需要根据用户的国家/地区应用不同的命名约定(例如,某些国家/地区的“最后一个,第一个” )。

目标属性:displayName、cn

Switch([CountryReferenceTwoLetter], 
    Join(" ", [PreferredFirstName], [PreferredLastName]),  
    "HU", Join(",", [PreferredLastName], [PreferredFirstName]), 
    "JP", Join(",", [PreferredLastName], [PreferredFirstName]), 
    "KR", Join(",", [PreferredLastName], [PreferredFirstName])
)

例:

  • 输入值:[CountryReferenceTwoLetter] = “JP”, [PreferredFirstName] = “Hiroshi”, [PreferredLastName] = “Tanaka”
  • 表达式输出Tanaka,Hiroshi (日语命名约定)
  • 可选输入:[CountryReferenceTwoLetter] = “US”, [PreferredFirstName] = “John”, [PreferredLastName] = “Smith”
  • 备用输出John Smith (默认的西部命名约定)

电子邮件地址生成

基本电子邮件生成

方案 1:你想要通过加入名字和姓氏、删除空格和特殊字符以及追加域来构造电子邮件地址。

目标属性:邮件

Join("@", NormalizeDiacritics(StripSpaces(Join(".", [PreferredFirstName], [PreferredLastName]))), "contoso.com")

例:

  • 输入值:[PreferredFirstName] = “María”, [PreferredLastName] = “Jose González”
  • 表达式输出maria.josegonzalez@contoso.com

方案 2:生成电子邮件地址时,需要在名称中处理特殊字符(如引号和逗号)。

目标属性:userPrincipalName

SelectUniqueValue(
    Join("@", Replace(NormalizeDiacritics(StripSpaces(Join(".", [PreferredFirstName], [PreferredLastName]))), , "[\"',]+", , "", , ), "contoso.com"), 
    Join("@", Replace(NormalizeDiacritics(StripSpaces(Join(".", Mid([PreferredFirstName], "1", "1"), [PreferredLastName]))), , "[\"',]+", , "", , ), "contoso.com"), 
    Join("@", Replace(NormalizeDiacritics(StripSpaces(Join(".", Mid([PreferredFirstName], "1", "2"), [PreferredLastName]))), , "[\"',]+", , "", , ), "contoso.com")
)

例:

  • 输入值:[PreferredFirstName] = “Mary-Ann”, [PreferredLastName] = “O'Connor”
  • 表达式输出maryann.oconnor@contoso.com (或者 m.oconnor@contoso.com 采用第一个选项,或者 ma.oconnor@contoso.com 采用前两个选项)

公司特定的电子邮件域

方案 1:有多个公司,需要基于公司生成具有不同域后缀的电子邮件地址。

目标属性:邮件

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")
)

例:

  • 输入值:[Company] = “Fabrikam”, [FirstName] = “John”, [LastName] = “Smith”
  • 表达式输出john.smith@fabrikam.com
  • 可选输入:[Company] = “Woodgrove”, [FirstName] = “Sarah”, [LastName] = “Johnson”
  • 备用输出s.johnson@woodgrove.com

ProxyAddresses 配置

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

目标属性:proxyAddresses

Split(
    Join(",",
        Append("smtp:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [PreferredFirstName], [PreferredLastName]))), "contoso.mail.onmicrosoft.com")),
        Append("smtp:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [PreferredFirstName], [PreferredLastName]))), "contoso.onmicrosoft.com")),
        Append("SMTP:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [PreferredFirstName], [PreferredLastName]))), "contoso.com"))
    ), ","
)

例:

  • 输入值:[PreferredFirstName] = “Michael”, [PreferredLastName] = “Brown”
  • 表达式输出["smtp:michael.brown@contoso.mail.onmicrosoft.com", "smtp:michael.brown@contoso.onmicrosoft.com", "SMTP:michael.brown@contoso.com"]

电话号码处理

这些表达式映射可在 Workday 写回应用程序中使用。

国际电话号码分析

方案 1:具有国际格式(+1 737-626-8331)的电话号码,并且只需提取电话号码而不使用国家/地区代码。

目标属性:telephoneNumber

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

例:

  • 输入值:[telephoneNumber] = “+1 737-626-8331”
  • 表达式输出7376268331

方案 2:需要从电话号码中提取国家/地区代码,以确定用于目录的国家/地区。

目标属性: c

Switch(Replace([telephoneNumber], , "\\+(?<isdCode>\\d* )(?<phoneNumber>.*)", , "${isdCode}", , ), "USA",
  "1", "USA",
  "44", "GBR", 
  "49", "DEU"
)

例:

  • 输入值:[telephoneNumber] = “+44 20 7946 0958”
  • 表达式输出GBR
  • 可选输入:[telephoneNumber] = “+1 555-123-4567”
  • 备用输出USA

方案 3:需要写回 Microsoft Teams 在 Microsoft Entra ID(例如 +4926180001111)中生成和设置的电话号码。 在此电话号码中,CountryCode 与实际电话号码之间没有空格。 可以使用以下正则表达式分析机制提取与组织相关的国家/地区代码,并使用它来设置 Workday CountryCodeName

目标属性:CountryCodeName

Switch(Replace([telephoneNumber], , "\+(?<isdCode>49|44|43|1|352|91|31|32|55|237|420|45|20|212|216|234|263|27|30|33|34|351|352|36|372|380|381|383|39|40|41|421|46|47|48|58|60|7|90|91|92|94|961|971|98|995)(?<phoneNumber>.*)", , "${isdCode}", , ), , "43", "AUT", "32", "BEL", "1", "USA", "420", "CZE", "45", "DNK", "372", "EST", "33", "FRA", "49", "GER", "30", "GRC", "36", "HUN", "91", "IND", "39", "ITA", "352", "LUX", "31", "NLD", "47", "NOR", "48", "POL", "40", "ROU", "421", "SVK", "27", "ZAF", "34", "ESP", "46", "SWE", "41", "CHE", "90", "TUR")

例:

  • 输入值:[telephoneNumber] = “+493012345678”
  • 表达式输出GER
  • 可选输入:[telephoneNumber] = “+919876543210”
  • 备用输出IND
  • 可选输入:[telephoneNumber] = “+15551234567”
  • 备用输出USA

不同系统的电话号码格式

方案 1:需要处理包括扩展(例如“+1(206)291-8163 x8125”的电话号码。

目标属性:telephoneNumber

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

例:

  • 输入值:[telephoneNumber] = “+1 (206) 291-8163 x8125”
  • 表达式输出2062918163

方案 2:只想从电话号码中提取扩展插件。

目标属性:extensionAttribute1

Replace([telephoneNumber], , "\\+(?<isdCode>\\d* )(?<phoneNumber>.* )[x](?<extension>.*)", , "${extension}", , )

例:

  • 输入值:[telephoneNumber] = “+1 (206) 291-8163 x8125”
  • 表达式输出8125

Active Directory 的帐户状态逻辑

本节中的表达式适用于 accountDisabled 属于“Workday 到本地 Active Directory 用户预配应用”的属性。 有关设置 accountEnabled “Workday to Microsoft Entra ID 用户预配应用的一部分”的属性,请参阅 Microsoft Entra ID 的帐户状态逻辑部分。

基本帐户状态管理

方案 1:想要为未在 Workday 中处于活动状态的用户禁用本地 Active Directory 帐户。

目标属性:accountDisabled

Switch([Active], , "1", "False", "0", "True")

例:

  • 输入值:[Active] = “1”
  • 表达式输出False (已启用帐户)
  • 备用输入:[Active] = “0”
  • 备用输出True (帐户已禁用)

重新使用处理

方案 1:需要 方案 1:需要处理仅应在雇用日期或之后启用帐户的重新注册方案。

目标属性:accountDisabled

Switch([Active], , 
"1", IIF([StatusRehire]=1, IIF(DateDiff("d", Now(), CDate([StatusHireDate])) >= 0, "False", "True"), "False"), 
"0", "True")

例:

  • 输入值:[Active] = “1”, [StatusRehire] = “1”, [StatusHireDate] = “2025-08-15” (当前日期: 2025-07-30)
  • 表达式输出True (在雇用日期之前禁用的帐户)
  • 可选输入:[Active] = “1”, [StatusRehire] = “1”, [StatusHireDate] = “2025-07-15”
  • 备用输出False (启用为雇用日期的帐户已通过)

预先雇用帐户创建

方案 1:你想要为未来的员工创建帐户,但将其禁用,直到开始日期之前的 14 天。

目标属性:accountDisabled

Switch([Active], , "1", IIF(DateDiff("d", Now(), CDate([StatusHireDate])) <= 14, "False", "True"), "0", "True")

例:

  • 输入值:[Active] = “1”, [StatusHireDate] = “2025-08-10” (当前日期:2025-07-30)
  • 表达式输出False (启用为雇用日期的帐户在 14 天内)
  • 可选输入:[Active] = “1”, [StatusHireDate] = “2025-09-15”
  • 替代输出True (由于雇用日期被禁用的帐户距离超过 14 天)

处理员工撤销

方案 1:设置 accountDisabled 属性时,需要处理雇用撤销的方案。 想要实现逻辑:

  • 如果 Terminated = 1 in workday,则 accountDisabled = True
  • 如果 Rescinded = 1 在工作日,则 accountDisabled = True
  • 如果工作日中的 Active =1,则
    • 如果
      • HireDate 在未来超过七天,然后 accountDisabled = True (禁用帐户)
      • HireDate 在将来为 <七天,然后 accountDisabled = False (启用帐户)
  • 如果 Active = 0,则 accountDisabled = True

目标属性:accountDisabled

Switch([StatusTerminated], "False", "1", "True", "0",
  Switch([StatusHireRescinded], "False", "1", "True", "0",
     Switch([Active], "False", 
         "1", IIF(DateDiff("d", Now(), CDate(IIF(IsNullOrEmpty([StatusHireDate]), "9999-01-01", [StatusHireDate]))) < 7, "False", "True"), 
         "0", "True"
         )
    )
)

例:

  • 输入值:[Terminated] = “1”, [Active] = “1”, [StatusHireDate] = “2025-08-15”
  • 表达式输出True (由于终止而禁用的帐户)
  • 可选输入:[Terminated] = “0”, [Rescinded] = “1”, [Active] = “1”
  • 备用输出True (因撤销而禁用帐户)
  • 可选输入:[Terminated] = “0”, [Rescinded] = “0”, [Active] = “1”, [StatusHireDate] = “2025-08-15” (当前日期: 2025-07-30)
  • 可选输出True (帐户被禁用为雇用日期超过 7 天)
  • 可选输入:[Terminated] = “0”, [Rescinded] = “0”, [Active] = “1”, [StatusHireDate] = “2025-08-05”
  • 备用输出False (启用为雇用日期的帐户在 7 天内)

Microsoft Entra ID 的帐户状态逻辑

本节中的表达式适用于 accountEnabled “Workday to Microsoft Entra ID 用户预配应用的一部分”的属性。 若要设置 accountDisabled 属于“Workday 到本地 Active Directory 用户预配应用的一部分”的属性,请参阅 Active Directory 的帐户状态逻辑部分。

基本帐户状态管理

方案 1:你希望为未在 Workday 中处于活动状态的用户禁用 Microsoft Entra ID 帐户。

目标属性:accountEnabled

Switch([Active], , "1", "True", "0", "False")

例:

  • 输入值:[Active] = “1”
  • 表达式输出True (已启用帐户)
  • 备用输入:[Active] = “0”
  • 备用输出False (帐户已禁用)

重新使用处理

方案 1:需要处理仅应在雇用日期或之后启用帐户的重新使用方案。

目标属性:accountEnabled

Switch([Active], , 
"1", IIF([StatusRehire]=1, IIF(DateDiff("d", Now(), CDate([StatusHireDate])) >= 0, "True", "False"), "True"), 
"0", "False")

例:

  • 输入值:[Active] = “1”, [StatusRehire] = “1”, [StatusHireDate] = “2025-08-15” (当前日期: 2025-07-30)
  • 表达式输出False (在雇用日期之前禁用的帐户)
  • 可选输入:[Active] = “1”, [StatusRehire] = “1”, [StatusHireDate] = “2025-07-15”
  • 备用输出True (启用为雇用日期的帐户已通过)

预先雇用帐户创建

方案 1:你想要为未来的员工创建帐户,但将其禁用,直到开始日期之前的 14 天。

目标属性:accountEnabled

Switch([Active], , "1", IIF(DateDiff("d", Now(), CDate([StatusHireDate])) <= 14, "True", "False"), "0", "False")

例:

  • 输入值:[Active] = “1”, [StatusHireDate] = “2025-08-10” (当前日期:2025-07-30)
  • 表达式输出True (启用为雇用日期的帐户在 14 天内)
  • 可选输入:[Active] = “1”, [StatusHireDate] = “2025-09-15”
  • 替代输出False (由于雇用日期被禁用的帐户距离超过 14 天)

日期函数

日期格式和转换

方案 1:需要将 Workday 合同结束日期转换为 accountExpires 属性的 Active Directory 格式,因此帐户将在合同结束日期过期。

目标属性:accountExpires

NumFromDate(Join("", FormatDateTime([ContractEndDate], ,"yyyy-MM-ddzzz", "yyyy-MM-dd"), "T23:59:59-08:00"))

例:

  • 输入值:[StatusHireDate] = “2025-12-31”
  • 表达式输出133835135990000000 (2025-12-31T23:59:59-07:00 的数字表示形式)

方案 2:你希望设置从雇用日期开始五年的帐户到期日期。

目标属性:accountExpires

NumFromDate(Join("",FormatDateTime(DateAdd("yyyy", 5, CDate([StatusHireDate])), , "yyyy-MM-dd", "yyyy-MM-dd")," 23:59:59-05:00"))

例:

  • 输入值:[StatusHireDate] = “2025-01-15”
  • 表达式输出139418879990000000 (2030-01-15 23:59:59-05:00 的数字表示形式)

基于日期的条件逻辑

方案 1:仅当员工已开始工作(雇用日期已过)时,才希望流出部门信息。

目标属性:部门

IIF(DateDiff("d", Now(), CDate([StatusHireDate])) >= 0, [Department], IgnoreAttributeFlow)

例:

  • 输入值:[StatusHireDate] = “2025-07-15”, [Department] = “工程” (当前日期: 2025-07-30)
  • 表达式输出Engineering (已通过雇用日期)
  • 可选输入:[StatusHireDate] = “2025-08-15”, [Department] = “Marketing”
  • 备用输出IgnoreAttributeFlow (雇佣日期为将来)

方案 2:仅当雇用日期在 14 天内时,才需要创建用户对象。

目标属性:objectFilter

IIF(DateDiff("d", Now(), CDate([StatusHireDate])) <= 14, "False", IgnoreObjectFlow)

例:

  • 输入值:[StatusHireDate] = “2025-08-10” (当前日期:2025-07-30)
  • 表达式输出False (创建用户对象作为雇用日期在 14 天内)
  • 可选输入:[StatusHireDate] = “2025-09-15”
  • 备用输出IgnoreObjectFlow (不创建用户对象,因为雇用日期超过 14 天)

组织单位(OU) 分配

简单 OU 分配

方案 1:你希望根据用户所在城市将用户放置在不同的 OU 中。

目标属性:parentDistinguishedName

Switch([City], "OU=Default,OU=Users,DC=contoso,DC=com", 
"Dallas", "OU=Dallas,OU=Users,DC=contoso,DC=com", 
"Austin", "OU=Austin,OU=Users,DC=contoso,DC=com", 
"Seattle", "OU=Seattle,OU=Users,DC=contoso,DC=com", 
"London", "OU=London,OU=Users,DC=contoso,DC=com" 
)

例:

  • 输入值:[City] = “Seattle”
  • 表达式输出OU=Seattle,OU=Users,DC=contoso,DC=com
  • 可选输入:[City] = “Chicago”
  • 备用输出OU=Default,OU=Users,DC=contoso,DC=com (未指定城市的默认值)

复杂 OU 结构

方案 1:需要基于部门、成本中心和国家/地区创建复杂的 OU 结构。

目标属性:parentDistinguishedName

Join("", 
    Switch([SupervisoryOrganization],"",
        "Engineering", "OU=Engineering,",
        "Shared Services", "OU=Shared Services,",
        "Information Technology", "OU=Information Technology,",
        "Development", "OU=Development,"
        ),
    Switch([CostCenter],"",
        "Finance and Info. Mgmt.","OU=Finance and Information Management,",
        "Modern Workplace","OU=Modern Workplace,",
        "Green Energy","OU=Green Energy,"
        ),
    Switch([CountryReferenceTwoLetter],"",
        "US","OU=USA,",
        "UK","OU=UK,",
        "IN","OU=IN,"
        ),
    "OU=Users,DC=contoso,DC=com"
)

例:

  • 输入值:[SupervisoryOrganization] = “Engineering”, [CostCenter] = “Modern Workplace”, [CountryReferenceTwoLetter] = “US”
  • 表达式输出OU=Engineering,OU=Modern Workplace,OU=USA,OU=Users,DC=contoso,DC=com
  • 可选输入:[SupervisoryOrganization] = “Sales”, [CostCenter] = “Marketing”, [CountryReferenceTwoLetter] = “UK”
  • 备用输出OU=Users,DC=contoso,DC=com (值不匹配时的默认值)

终止的用户 OU 分配

方案 1:想要在其终止日期将终止的用户移动到特殊 OU。

目标属性:parentDistinguishedName

IIF(DateDiff("d", Now(),CDate(Switch([StatusTerminationLastDayOfWork],[StatusTerminationLastDayOfWork],
        "","9999-12-31"
        ))
    ) <= 0, 
    "OU=Leavers,OU=Users,DC=contoso,DC=com", 
    Switch([City], "OU=Default,OU=Users,DC=contoso,DC=com", 
        "Dallas", "OU=Dallas,OU=Users,DC=contoso,DC=com", 
        "Austin", "OU=Austin,OU=Users,DC=contoso,DC=com", 
        "Seattle", "OU=Seattle,OU=Users,DC=contoso,DC=com", 
        "London", "OU=London,OU=Users,DC=contoso,DC=com" 
    ) 
)

例:

  • 输入值:[StatusTerminationLastDayOfWork] = “2025-07-25”, [City] = “Seattle” (当前日期:2025-07-30)
  • 表达式输出OU=Leavers,OU=Users,DC=contoso,DC=com (随着终止日期已传递到 Leavers OU)
  • 可选输入:[StatusTerminationLastDayOfWork] = “2025-08-15”, [City] = “Dallas”
  • 备用输出OU=Dallas,OU=Users,DC=contoso,DC=com (在终止日期为将来时仍为正常 OU)

随机 ID 生成

基于 GUID 的随机生成

方案 1:需要生成不包含数字的随机 5 个字符字符串。

目标属性:extensionAttribute15

SelectUniqueValue (
   Replace(Mid(ConvertToBase64(Guid()), 1, 5 ), ,"[0-9]", ,"A", , ),
   Replace(Mid(ConvertToBase64(Guid()), 1, 5 ), ,"[0-9]", ,"B", , ),
   Replace(Mid(ConvertToBase64(Guid()), 1, 5 ), ,"[0-9]", ,"C", , )
)

例:

  • 输入值:生成的 GUID 转换为 Base64(例如“mV8dXr...”)
  • 表达式输出mVAdX (使用“A”替换的数字;如果采用第一个选项,则替换为“B”/“C)

方案 2:需要生成以“D”开头的随机字符串,后跟 4 个字母字符。

目标属性:extensionAttribute14

SelectUniqueValue(
    ToUpper(Replace(ConvertToBase64(Guid()), , "(.*?)(?<id>[a-zA-Z]{4})(.*)", , "D${id}", ,)),
    ToUpper(Replace(ConvertToBase64(Guid()), , "(.*?)(?<id>[a-zA-Z]{4})(.*)", , "D${id}", ,)),
    ToUpper(Replace(ConvertToBase64(Guid()), , "(.*?)(?<id>[a-zA-Z]{4})(.*)", , "D${id}", ,))
)

例:

  • 输入值:生成的 GUID 转换为 Base64,其中包含字母顺序“mVdX”
  • 表达式的输出DMVDX (如果采用第一个选项,则不同)

数字 ID 生成

方案 1:需要从 GUID 生成随机 4 位数字。

目标属性:extensionAttribute13

SelectUniqueValue(
    Replace(Replace(Guid(), ,"-", ,"", , ), ,"(.*?)(?<id>[0-9]{4})(.*)", , "D${id}", ,),
    Replace(Replace(Guid(), ,"-", ,"", , ), ,"(.*?)(?<id>[0-9]{4})(.*)", , "D${id}", ,),
    Replace(Replace(Guid(), ,"-", ,"", , ), ,"(.*?)(?<id>[0-9]{4})(.*)", , "D${id}", ,)
)

例:

  • 输入值:生成的 GUID 类似于“a1b2c3d4-e5f6-7890-1234-567890abcdef”
  • 表达式的输出D7890 (或 D1234D5678等等),具体取决于第一个匹配的 4 位序列)

名称处理

显示名称生成

方案 1:你想要以“最后一个”格式创建显示名称。

目标属性:displayName

Join(", ", [PreferredLastName], [PreferredFirstName])

例:

  • 输入值:[PreferredLastName] = “Smith”, [PreferredFirstName] = “John”
  • 表达式输出Smith, John

方案 2:需要创建包含中间初始 ID 和员工 ID 的显示名称。

目标属性:displayName

Join("", [PreferredLastName], ",", [PreferredFirstName], " ", Mid([PreferredMiddleName],1,1), "-", [WorkerID])

例:

  • 输入值:[PreferredLastName] = “Johnson”, [PreferredFirstName] = “Sarah”, [PreferredMiddleName] = “Elizabeth”, [WorkerID] = “12345”
  • 表达式输出Johnson,Sarah E-12345

具有唯一性的公用名 (CN) 生成

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

目标属性:cn

SelectUniqueValue(
    NormalizeDiacritics(Join(" ", [PreferredFirstName], [PreferredLastName])),
    NormalizeDiacritics(Join(" ", [PreferredFirstName], Mid([PreferredMiddleName],1,1), [PreferredLastName])),
    NormalizeDiacritics(Join(" ", [PreferredFirstName], [PreferredMiddleName], [PreferredLastName]))
)

例:

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

SamAccountName 生成

方案 1:你想要使用第一个名字和姓氏创建一个 20 个字符的 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] = “María Jose”, [LastName] = “González-López”
  • 表达式输出mgonzalezlopez (或者 mgonzalezlopez1 采用第一个选项,或者 mgonzalezlopez2 采用前两个选项)

高级方案

隐藏地址列表逻辑

本部分介绍如何设置布尔属性 msExchHideFromAddressLists。 使用所有上限“TRUE”或“FALSE”设置布尔属性。 使用任何其他值会导致 HybridSynchronizationActiveDirectoryInvalidParameter 错误。

方案 1:你想要根据 Workday 用户的活动帐户状态进行设置 msExchHideFromAddressLists

目标属性:msExchHideFromAddressLists

Switch([Active], , "1", "FALSE", "0", "TRUE")

例:

  • 输入值:[Active] = “0”
  • 表达式输出TRUE (当用户在 Workday 中处于非活动状态时隐藏地址列表)
  • 可选输入:[Active] = “1”
  • 备用输出FALSE (当用户在 Workday 中处于活动状态时显示在地址列表中)

方案 2:你想要根据工人的雇用日期设置 msExchHideFromAddressLists 。 仅在雇用日期之后,才会在 Exchange 地址列表中显示用户。

目标属性:msExchHideFromAddressLists

IIF(DateDiff("d", Now(), CDate([StatusHireDate])) >= 0, "TRUE", "FALSE")

例:

  • 输入值:[StatusHireDate] = “2025-07-31” (当前日期:2025-07-30)
  • 表达式输出TRUE (在雇佣日期为将来时隐藏地址列表)
  • 可选输入:[StatusHireDate] = “2025-07-31” (当前日期:2025-08-01)
  • 备用输出FALSE (如过去雇用日期在地址列表中显示)

多值属性设置

方案 1:需要在 Active Directory 中为 msExchPoliciesExcluded 属性设置多个值。

目标属性:msExchPoliciesExcluded

Split(
    Join(",","a8cccada-a108-47ae-bf9a-f130499aa4cb","{26491cfc-9e50-4857-861b-0cb8df22b5d7}"),
    ","
)

例:

  • 输入值:静态 GUID 值
  • 表达式输出["a8cccada-a108-47ae-bf9a-f130499aa4cb", "{26491cfc-9e50-4857-861b-0cb8df22b5d7}"]

写回方案

方案 1:仅当员工雇佣日期通过时,才要将用户名写回 Workday。

目标属性:用户名

IgnoreFlowIfNullOrEmpty(IIF(DateDiff("d", Now(), CDate([employeeHireDate])) > 0, "", [userPrincipalName]))

例:

  • 输入值:[employeeHireDate] = “2025-07-15”, [userPrincipalName] = “user@contoso.com” (当前日期:2025-07-30)
  • 表达式输出user@contoso.com (雇用日期已传递,写回用户名)
  • 可选输入:[employeeHireDate] = “2025-08-15”, [userPrincipalName] = “future@contoso.com”
  • 备用输出(空 - 忽略,雇佣日期为将来)

最佳做法

  • 对于需要唯一性(例如 UPN、samAccountName、email)的属性,请始终使用 SelectUniqueValue

  • 使用函数(如、IsPresentSwitch语句)IsNullOrEmpty处理 null 值和空值

  • 使用 NormalizeDiacritics 处理具有特殊字符的名称以确保兼容性。

  • 测试日期逻辑, 因为不同的时区和日期格式可能会影响结果。

  • 如果要跳过空值的属性更新,请使用 IgnoreFlowIfNullOrEmpty

  • 请考虑使用 Switch 而不是嵌套 IIF 语句来提高可读性。

  • 在实现之前,始终在联机正则表达式测试器中验证正则表达式

更多资源