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

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

목차

문자열 조작 함수

기본 문자열 작업

시나리오 1: 앞에 오는 0으로 사용자 ID를 채워 8자 문자열을 만들려고 합니다.

대상 특성: employeeId

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

본보기:

  • 입력 값: [personIdExternal] = "12345"
  • 식의 출력: 00012345

시나리오 2: 10자로 만들려면 앞에 오는 0으로 비용 센터를 채워야 합니다.

대상 특성: 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] = "12/31/2025 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] = "1990/1/15 12:00:00 AM"
  • 식 출력: 158488415990000000 (출생 후 60년 후 2050-01-15 23:59:59-05:00의 숫자 표현)
  • 대체 입력: [employmentType] = "CON", [endDate] = "12/31/2025 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
  • 대체 입력: [부서] = "마케팅"
  • 대체 출력: 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] = "Mexico"
  • 식의 출력: 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] = "José", [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] = "José", [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] = "Trinidad", [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] = "Trinidad and Tobago"
  • 식의 출력: TT

시나리오 2: 국가를 숫자 국가 코드에 매핑해야 합니다.

대상 특성: countryCode

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

본보기:

  • 입력 값: [country] = "Barbados"
  • 식의 출력: 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/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 José", [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

모범 사례

  • 고유성이 필요한 모든 특성(UPN, samAccountName, email)에 SelectUniqueValue를 사용합니다.

  • , CoalesceIsPresentSwitch또는 .와 같은 IsNullOrEmpty함수를 사용하여 null 및 빈 값 처리

  • 시스템 간 호환성을 보장하기 위해 이름을 처리할 때 NormalizeDiacritics 및 StripSpaces를 사용합니다.

  • 프로덕션 환경에서 구현하기 전에 JSONPath 테스터에서 JSONPath 식의 유효성을 검사합니다.

  • 변환 오류를 방지하려면 SuccessFactors 날짜 필드를 사용할 때 적절한 날짜 서식을 사용합니다.

  • 날짜 비교 및 계정 만료 논리를 사용할 때 표준 시간대를 고려합니다.

  • 조건부 특성 흐름 및 쓰기 저장 시나리오에는 IgnoreFlowIfNullOrEmpty를 사용합니다.

  • 복잡한 Switch 문은 디버그하기 어려울 수 있으므로 철저히 테스트합니다.

  • 특히 복잡한 고용 상태 및 계정 관리 규칙의 경우 비즈니스 논리를 명확하게 문서화합니다.

  • regex 패턴을 신중하게 사용하고 구현하기 전에 온라인 정규식 테스터에서 유효성을 검사합니다.

추가 리소스