Microsoft Entra ID 프로비저닝을 위한 Workday 식 매핑 함수

이 문서에서는 Workday를 온-프레미스 Active Directory/Microsoft Entra ID 사용자 프로비저닝으로 구성할 때 일반적으로 사용되는 식 매핑 함수에 대한 포괄적인 가이드를 제공합니다. 이러한 함수는 Workday에서 데이터를 변환하고 매핑하여 Microsoft Entra ID에서 적절한 사용자 특성을 만드는 데 도움이 됩니다.

목차

문자열 조작 함수

기본 문자열 작업

시나리오 1: 공백, 대괄호 및 대시를 제거하여 Workday에서 오는 전화 번호 값을 정리하려고 합니다.

대상 특성: phoneNumber, mobile

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

본보기:

  • 입력 값: [PrimaryWorkTelephone] = "+1 (555) 123-4567"
  • 식의 출력: +15551234567

시나리오 2: "FirstName LastName"이 포함된 필드에서 성을 추출 PreferredNameData 해야 합니다.

대상 특성: 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 또는 Microsoft Entra ID의 직원 ID와 일치하기 전에 작업자 ID에서 선행 0을 제거하려고 합니다.

대상 특성: 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: 텍스트를 적절한 사례로 변환해야 하지만 아포스트로피를 올바르게 처리해야 합니다(예: "st john's Hospital"은 "St John's Hospital"이 되어야 함).

대상 특성: 회사

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] = "José", [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] = "José 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
  • 대체 입력: [회사] = "Woodgrove", [FirstName] = "Sarah", [LastName] = "Johnson"
  • 대체 출력: s.johnson@woodgrove.com

ProxyAddresses 구성

시나리오 1: 기본 및 보조 SMTP 주소를 포함하여 Exchange에 대해 여러 프록시 주소를 설정해야 합니다.

대상 특성: 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에 대한 계정 상태 논리

이 섹션의 식은 "Workday에서 accountDisabled 온-프레미스 Active Directory 사용자 프로비저닝 앱"의 일부인 특성에 적용할 수 있습니다. "Workday에서 Microsoft Entra ID 사용자 프로비저닝 앱"의 일부인 특성을 설정 accountEnabled 하려면 Microsoft Entra ID에 대한 계정 상태 논리 섹션을 참조하세요.

기본 계정 상태 관리

시나리오 1: Workday에서 활성화되지 않은 사용자에 대해 온-프레미스 Active Directory 계정을 사용하지 않도록 설정하려고 합니다.

대상 특성: accountDisabled

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

본보기:

  • 입력 값: [활성] = "1"
  • 식 출력: False (계정 사용)
  • 대체 입력: [활성] = "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 = workday에서 1이면 accountDisabled = True
  • Rescinded = workday에서 1이면 accountDisabled = True
  • Workday에서 활성 =1이면
      • HireDate가 7일 이상 지난 후 accountDisabled = True(계정 사용 안 함)
      • HireDate는 <= 7일 후 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에 대한 계정 상태 논리

이 섹션의 식은 "Workday to accountEnabled Microsoft Entra ID 사용자 프로비저닝 앱"의 일부인 특성에 적용할 수 있습니다. "Workday에서 온-프레미스 Active Directory 사용자 프로비저닝 앱으로"의 일부인 특성을 설정 accountDisabled 하려면 Active Directory에 대한 계정 상태 논리 섹션을 참조하세요.

기본 계정 상태 관리

시나리오 1: Workday에서 활성화되지 않은 사용자에 대해 Microsoft Entra ID 계정을 사용하지 않도록 설정하려고 합니다.

대상 특성: accountEnabled

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

본보기:

  • 입력 값: [활성] = "1"
  • 식 출력: True (계정 사용)
  • 대체 입력: [활성] = "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: 채용 날짜로부터 5년 후에 계정 만료 날짜를 설정하려고 합니다.

대상 특성: 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] = "Engineering"(현재 날짜: 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", , )
)

본보기:

  • 입력 값: Base64로 변환된 생성된 GUID(예: "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}", ,))
)

본보기:

  • 입력 값: 알파벳 시퀀스 "mVdX"를 포함하는 Base64로 변환된 생성된 GUID
  • 식 출력: 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}", ,)
)

본보기:

  • 입력 값: "a1b2c3d4-e5f6-7890-1234-567890abcdef"와 같은 생성된 GUID
  • 식의 출력: D7890 (또는 D1234, D5678등 4자리 시퀀스가 먼저 일치하는지 여부에 따라 다름)

이름 처리

표시 이름 생성

시나리오 1: "마지막, 첫 번째" 형식으로 표시 이름을 만들려고 합니다.

대상 특성: displayName

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

본보기:

  • 입력 값: [PreferredLastName] = "Smith", [PreferredFirstName] = "John"
  • 식의 출력: Smith, John

시나리오 2: 중간 초기 및 직원 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] = "José", [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 José", [LastName] = "González-López"
  • 식 출력: mgonzalezlopez (또는 mgonzalezlopez1 첫 번째 옵션을 사용하거나 mgonzalezlopez2 처음 두 옵션을 사용할 경우)

고급 시나리오

주소 목록 논리에서 숨기기

이 섹션에서는 부울 특성을 설정하는 방법을 설명합니다 msExchHideFromAddressLists. 모든 대문자 "TRUE" 또는 "FALSE"를 사용하여 부울 특성을 설정합니다. 다른 값을 사용하면 오류가 발생합니다 HybridSynchronizationActiveDirectoryInvalidParameter .

시나리오 1: Workday 사용자의 활성 계정 상태에 따라 설정 msExchHideFromAddressLists 하려고 합니다.

대상 특성: msExchHideFromAddressLists

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

본보기:

  • 입력 값: [활성] = "0"
  • 식 출력: TRUE (사용자가 Workday에서 비활성 상태이므로 주소 목록에서 숨기기)
  • 대체 입력: [활성] = "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를 사용합니다.

  • 또는 문과 같은 IsNullOrEmptyIsPresentSwitch 함수를 사용하여 null 및 빈 값을 처리합니다.

  • 특수 문자로 이름을 처리할 때 NormalizeDiacritics를 사용하여 호환성을 보장합니다.

  • 서로 다른 표준 시간대 및 날짜 형식이 결과에 영향을 줄 수 있으므로 날짜 논리를 철저히 테스트합니다.

  • 빈 값에 대한 특성 업데이트를 건너뛰려면 IgnoreFlowIfNullOrEmpty를 사용합니다.

  • 가독성을 높이기 위해 중첩된 IIF 문 대신 Switch를 사용하는 것이 좋습니다.

  • 구현하기 전에 항상 온라인 정규식 테스터에서 정규식의 유효성을 검사합니다.

추가 리소스