本文提供了在将 Workday 配置为本地 Active Directory/Microsoft Entra ID 用户预配时常用的表达式映射函数的综合指南。 这些函数可帮助转换和映射 Workday 中的数据,以在 Microsoft Entra ID 中创建适当的用户属性。
目录
- 字符串作函数
- 电子邮件地址生成
- 电话号码处理
- Active Directory 的帐户状态逻辑
- Microsoft Entra ID 的帐户状态逻辑
- 日期函数
- 组织单位(OU)分配
- 随机 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(或D1234,D5678等等),具体取决于第一个匹配的 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。
使用函数(如、
IsPresent或Switch语句)IsNullOrEmpty处理 null 值和空值。使用 NormalizeDiacritics 处理具有特殊字符的名称以确保兼容性。
测试日期逻辑, 因为不同的时区和日期格式可能会影响结果。
如果要跳过空值的属性更新,请使用 IgnoreFlowIfNullOrEmpty。
请考虑使用 Switch 而不是嵌套 IIF 语句来提高可读性。
在实现之前,始终在联机正则表达式测试器中验证正则表达式。