Funzioni di mapping delle espressioni SuccessFactors per il provisioning di Microsoft Entra ID

Questo articolo fornisce una guida completa alle funzioni di mapping delle espressioni di uso comune durante la configurazione del provisioning utenti di SuccessFactors in Microsoft Entra ID. Queste funzioni consentono di trasformare e mappare i dati da SuccessFactors per creare attributi utente appropriati in Microsoft Entra ID.

Sommario

Funzioni di manipolazione delle stringhe

Operazioni di base su stringhe

Scenario 1: si vuole aggiungere un ID persona con zeri iniziali per creare una stringa di 8 caratteri.

Attributo di destinazione: employeeId

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

Esempio:

  • Valori di input: [personIdExternal] = "12345"
  • Output dell'espressione: 00012345

Scenario 2: è necessario riempire il centro di costo con zeri iniziali per renderlo 10 caratteri.

Attributo di destinazione: extensionAttribute1

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

Esempio:

  • Valori di input: [costCenterId] = "567"
  • Output dell'espressione: 0000000567

Scenario 3: si vuole creare un ID dipendente aggiungendo un prefisso a un numero di dipendente riempito.

Attributo di destinazione: employeeId

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

Esempio:

  • Valori di input: [employeeId] = "789"
  • Output dell'espressione: 05000789

Conversione di maiuscole/minuscole

Scenario 1: è necessario convertire i nomi da tutte le lettere maiuscole a maiuscole e minuscole appropriate (titolo maiuscolo).

Attributo di destinazione: sn

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

Esempio:

  • Valori di input: [lastName] = "JOHNSON"
  • Output dell'espressione: Johnson

Scenario 2: si vuole creare un nome visualizzato con la formattazione corretta delle maiuscole e minuscole.

Attributo di destinazione: displayName

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

Esempio:

  • Valori di input: [lastName] = "SMITH", [firstName] = "JOHN"
  • Output dell'espressione: Smith, John

Scenario 3: è necessario gestire i nomi con spazi sostituendo gli spazi con i punti.

Attributo di destinazione: givenName

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

Esempio:

  • Valori di input: [firstName] = "Mary Ann"
  • Output dell'espressione: Mary.Ann

Generazione di indirizzi di posta elettronica

Generazione di posta elettronica di base

Scenario 1: si vogliono generare indirizzi di posta elettronica usando il nome e il cognome con domini specifici della società.

Attributo di destinazione: posta elettronica

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

Esempio:

  • Valori di input: [company] = "Contoso", [firstName] = "John", [lastName] = "Smith", [middleName] = "Michael"
  • Output dell'espressione: john.smith@contoso.com (o john.m.smith@contoso.com se viene eseguita la prima opzione)

Generazione di messaggi di posta elettronica basati sui gruppi di dipendenti

Scenario 1: si vogliono generare formati di posta elettronica diversi in base alla classificazione dei dipendenti (permanente e temporanea).

Attributo di destinazione: 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")
)))

Esempio:

  • Valori di input: [custom06] = "Temporary", [firstName] = "Sarah", [lastName] = "Wilson"
  • Output dell'espressione: sarah.wilson_ext@ltts.com

Convalida del dominio aziendale

Scenario 1: si vuole solo inviare indirizzi di posta elettronica appartenenti a un dominio aziendale specifico.

Attributo di destinazione: posta elettronica

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

Esempio:

  • Valori di input: [emailAddress] = "john.doe@contoso.com"
  • Output dell'espressione: john.doe@contoso.com
  • Input alternativo: [emailAddress] = "john.doe@external.com"
  • Output alternativo: (vuoto - ignorato)

Conservazione della posta elettronica esistente

Scenario 1: si vuole usare la posta elettronica esistente da SuccessFactors per determinate divisioni, ma generarne di nuove per altre.

Attributo di destinazione: 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")
)

Esempio:

  • Valori di input: [divisionId] = "8900", [email] = "existing.user@company.com", [firstName] = "Mike", [lastName] = "Brown"
  • Output dell'espressione: existing.user@company.com
  • Input alternativo: [divisionId] = "1200", [firstName] = "Mike", [lastName] = "Brown"
  • Output alternativo: mike.brown@contoso.com

Logica di gestione degli account

Stato dell'account di base

Scenario 1: si vuole determinare se un account deve essere disabilitato in base allo stato di occupazione.

Attributo di destinazione: accountDisabled

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

Esempio:

  • Valori di input: [emplStatus] = "741"
  • Output dell'espressione: False (account abilitato)
  • Input alternativo: [emplStatus] = "746"
  • Output alternativo: True (account disabilitato)

Nascondi dalla logica degli elenchi di indirizzi

Scenario 1: è necessario impostare l'attributo msExchHideFromAddressLists in base alle date di inizio e fine.

Attributo di destinazione: 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")

Esempio:

  • Valori di input: [startDate] = "2025-01-15", [endDate] = "2025-12-31" (data corrente: 2025-07-30)
  • Output dell'espressione: FALSE (non nascosto dagli elenchi di indirizzi)
  • Input alternativo: [startDate] = "2025-01-15", [endDate] = "2025-06-30"
  • Output alternativo: TRUE (nascosto dagli elenchi di indirizzi)

Logica di stato dei dipendenti complessa

Scenario 1: è necessario disabilitare gli account in base a campi personalizzati e date di assunzione.

Attributo di destinazione: 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"
))

Esempio:

  • Valori di input: [empNavCustomString3] = "62220", [cust_hiredate] = "2025-07-27", [cust_customDate67] = "2025-07-30" (data corrente: 2025-07-30)
  • Output dell'espressione: False (account abilitato)
  • Input alternativo: [empNavCustomString3] = "62220", [cust_hiredate] = "2025-07-27", [cust_customDate67] = "2025-07-29"
  • Output alternativo: True (account disabilitato)

Funzioni di data e scadenza dell'account

Scadenza dell'account di base

Scenario 1: impostare la scadenza dell'account in base alla data di fine di SuccessFactors.

Attributo di destinazione: accountExpires

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

Esempio:

  • Valori di input: [endDate] = "31/12/2025 12:00:00 AM"
  • Output dell'espressione: 133835135990000000 (rappresentazione numerica di 2025-12-31 23:59:59-05:00)
  • Input alternativo: [endDate] = "" (vuoto)
  • Output alternativo: 9223372036854775807 (non scade mai)

Scadenza basata sul tipo di impiego

Scenario 1: è necessario impostare regole di scadenza dell'account diverse in base al tipo di impiego (permanente o terzista).

Attributo di destinazione: 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"))
)

Esempio:

  • Valori di input: [employmentType] = "PM", [DOB] = "1/15/1990 12:00:00 AM"
  • Output dell'espressione: 158488415990000000 (rappresentazione numerica di 2050-01-15 23:59:59-05:00, 60 anni dopo la nascita)
  • Input alternativo: [employmentType] = "CON", [endDate] = "12/31/2025 12:00:00 AM"
  • Output alternativo: 133835135990000000 (rappresentazione numerica di 2025-12-31 23:59:59-05:00)

Scadenza dell'account basato sul motivo dell'evento

Scenario 1: si vuole impostare la scadenza dell'account in base a specifici eventi di terminazione e date di scadenza.

Attributo di destinazione: 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"))
)

Esempio:

  • Valori di input: [event] = "SEVUNSATP", [severanceStartDate] = "8/15/2025 12:00:00 AM"
  • Output dell'espressione: 133877247990000000 (rappresentazione numerica 2025-08-15 23:59:59-08:00)
  • Input alternativo: [event] = "REGULAR", [latestTerminationDate] = "9/30/2025 12:00:00 AM"
  • Output alternativo: 133886207990000000 (rappresentazione numerica 2025-09-30 23:59:59-08:00)

Gestione del formato data

Scenario 1: è necessario gestire date non valide come "31/12/9999" che causano errori in NumFromDate.

Attributo di destinazione: 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")
)

Esempio:

  • Valori di input: [endDate] = "31/12/9999 12:00:00 AM"
  • Output dell'espressione: 441481535990000000 (rappresentazione numerica di 2099-12-31T23:59:59-04:00)
  • Input alternativo: [endDate] = "15/8/2025 12:00:00 AM"
  • Output alternativo: 133877283990000000 (rappresentazione numerica di 2025-08-15T23:59:59-04:00)

Assegnazione di unità organizzativa

Assegnazione di unità organizzative basate sul reparto

Scenario 1: si vuole inserire gli utenti in unità organizzative diverse in base al reparto.

Attributo di destinazione: 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"
)

Esempio:

  • Valori di input: [reparto] = "Engineering SG"
  • Output dell'espressione: OU=Engineering,OU=SuccessFactors,DC=contoso,DC=com
  • Input alternativo: [reparto] = "Marketing"
  • Output alternativo: OU=SuccessFactors,DC=contoso,DC=com (impostazione predefinita)

Assegnazione dell'unità organizzativa basata sullo stato dell'occupazione

Scenario 1: è necessario assegnare utenti a unità organizzative diverse in base allo stato di occupazione e alla posizione.

Attributo di destinazione: 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")

Esempio:

  • Valori di input: [emplStatus] = "741", [empJobNavCustomString13] = "LOC1015", [departmentId] = "DU1026"
  • Output dell'espressione: OU=IT,OU=Bangalore,DC=contoso,DC=com
  • Input alternativo: [emplStatus] = "749", [empJobNavCustomString13] = "LOC1016"
  • Output alternativo: OU=O365-NoSYNC,OU=Mysore,DC=contoso,DC=com
  • Input alternativo: [emplStatus] = "741", [empJobNavCustomString13] = "LOC9999" (non definito)
  • Output alternativo: OU=SFProvisoinngUsers,DC=contoso,DC=com (impostazione predefinita)

Assegnazione di unità organizzative basate sul paese

Scenario 1: si vuole inserire gli utenti in unità organizzative diverse in base al proprio paese con un'unità organizzativa disabilitata per gli utenti inattivi.

Attributo di destinazione: 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"
)

Esempio:

  • Valori di input: [activeEmploymentsCount] = "1", [country] = "Mexico"
  • Output dell'espressione: OU=Mexico,OU=Accounts,DC=corp,DC=contoso,DC=com
  • Input alternativo: [activeEmploymentsCount] = "0", [country] = "Svezia"
  • Output alternativo: OU=DisabledAccounts,OU=Accounts,DC=corp,DC=contoso,DC=com (gli utenti disabilitati passano a un'unità organizzativa speciale indipendentemente dal paese)
  • Input alternativo: [activeEmploymentsCount] = "1", [country] = "Germania"
  • Output alternativo: OU=Accounts,DC=corp,DC=contoso,DC=com (unità organizzativa predefinita per i paesi non definiti in modo specifico)

Elaborazione dei nomi e nomi visualizzati

Generazione di nomi comuni (CN)

Scenario 1: si vuole generare un nome comune univoco con opzioni di fallback per i duplicati.

Attributo di destinazione: cn

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

Esempio:

  • Valori di input: [firstName] = "José", [lastName] = "Garciaía", [middleName] = "Antonio"
  • Output dell'espressione: Jose Garcia (o Jose A Garcia se viene eseguita la prima opzione o Jose Antonio Garcia se vengono eseguite le prime due opzioni)

Nome visualizzato con nomi preferiti

Scenario 1: è necessario creare un nome visualizzato che usa il nome preferito quando disponibile. In caso contrario, viene eseguito il fallback al nome.

Attributo di destinazione: 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), )))

Esempio:

  • Valori di input: [lastName] = "JOHNSON", [preferredName] = "Mike", [firstName] = "Michael"
  • Output dell'espressione: Johnson, Mike
  • Input alternativo: [lastName] = "SMITH", [preferredName] = "", [firstName] = "Robert"
  • Output alternativo: Smith, Robert

Nome visualizzato con suffissi numerici

Scenario 1: si vogliono generare nomi visualizzati univoci con suffissi numerici per i duplicati.

Attributo di destinazione: 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])))
)

Esempio:

  • Valori di input: [lastName] = "Garciaía", [preferredName] = "Mike", [firstName] = "Michael"
  • Output dell'espressione: Garcia, Mike (o Garcia2, Mike se viene eseguita la prima opzione e così via)
  • Input alternativo: [lastName] = "Smith", [preferredName] = "", [firstName] = "John"
  • Output alternativo: Smith, John (o Smith2, John se viene eseguita la prima opzione e così via)

Generazione di SamAccountName

Generazione samAccountName di base

Scenario 1: si vuole creare un samAccountName usando il nome iniziale e il cognome con la corretta purificazione dei caratteri.

Attributo di destinazione: 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")
)

Esempio:

  • Valori di input: [firstName] = "José", [lastName] = "Garciaía-López"
  • Output dell'espressione: jgarcialopez (o jgarcialopez1 se viene eseguita la prima opzione o jgarcialopez2 se vengono eseguite le prime due opzioni)

SamAccountName con lunghezza del nome variabile

Scenario 1: gestire i duplicati aumentando il numero di caratteri dal nome.

Attributo di destinazione: 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), , "(\\.)*$", , "", , )
)

Esempio:

  • Valori di input: [firstName] = "Christopher", [lastName] = "Anderson"
  • Output dell'espressione: canderson (o chanderson se viene eseguita la prima opzione o chranderson se vengono eseguite le prime due opzioni)
  • Input alternativo: [firstName] = "María", [lastName] = "Rodrídevice-Santos"
  • Output alternativo: mrodriguezsantos (o marodriguezsantos se viene eseguita la prima opzione o marrodriguezsantos se vengono prese le prime due opzioni)

SamAccountName da nome utente esterno

Scenario 1: estrarre la parte del nome utente da un nome utente esterno di tipo posta elettronica.

Attributo di destinazione: sAMAccountName

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

Esempio:

  • Valori di input: [username] = "john.smith@external.com"
  • Output dell'espressione: johnsmith

Configurazione di ProxyAddresses

Configurazione di base di proxyAddresses

Scenario 1: si desidera impostare più indirizzi proxy, inclusi gli indirizzi SMTP primari e secondari.

Attributo di destinazione: 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"))
    ), 
    ","
)

Esempio:

  • Valori di input: [personIdExternal] = "12345", [firstName] = "John", [lastName] = "Smith"
  • Output dell'espressione: ["smtp:A12345@contoso.mail.onmicrosoft.com", "smtp:A12345@contoso.com", "SMTP:John.Smith@contoso.com"]

ProxyAddresses basato su divisione

Scenario 1: sono necessarie configurazioni di indirizzi proxy diverse in base alla divisione dei dipendenti.

Attributo di destinazione: 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])
        )
    ),
    ","	
)

Esempio:

  • Valori di input: [divisionId] = "STANDARD", [personIdExternal] = "67890", [firstName] = "Sarah", [lastName] = "Johnson"
  • Output dell'espressione: ["smtp:A67890@woodgrove.mail.onmicrosoft.com", "smtp:A67890@woodgrove.com", "SMTP:Sarah.Johnson@woodgrove.com"]
  • Input alternativo: [divisionId] = "EXEC", [firstName] = "Michael", [lastName] = "Brown", [email] = "mbrown@fabrikam.com"
  • Output alternativo: ["smtp:Michael.Brown@contoso.com", "SMTP:mbrown@fabrikam.com"]

ProxyAddresses specifico della società

Scenario 1: si vogliono generare indirizzi proxy in base all'affiliazione aziendale.

Attributo di destinazione: 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"))
    )
)

Esempio:

  • Valori di input: [company] = "NGC", [firstName] = "Trinidad", [lastName] = "Williams", [middleName] = "James"
  • Output dell'espressione: SMTP:trinidad.williams@contoso.com (o SMTP:trinidad.j.williams@contoso.com se viene eseguita la prima opzione)
  • Input alternativo: [company] = "National Energy", [firstName] = "Rebecca", [lastName] = "Thompson", [middleName] = "Marie"
  • Output alternativo: SMTP:r.thompson@fabrikam.com (o SMTP:r.m.thompson@fabrikam.com se viene eseguita la prima opzione)
  • Input alternativo: [company] = "Other Company", [firstName] = "David", [lastName] = "Jones", [middleName] = "Paul"
  • Output alternativo: SMTP:david.jones@contoso.com (dominio predefinito o SMTP:david.p.jones@contoso.com se viene eseguita la prima opzione)

Elaborazione dei numeri di telefono

Estrazione dei numeri di telefono di base

Scenario 1: estrarre la parte del numero di telefono senza il codice paese.

Attributo di destinazione: telephoneNumber

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

Esempio:

  • Valori di input: [mobile] = "+1 (555) 123-4567"
  • Output dell'espressione: 5551234567

Scenario 2: è necessario estrarre solo il codice paese da un numero di telefono.

Attributo di destinazione: c

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

Esempio:

  • Valori di input: [mobile] = "+44 20 7946 0958"
  • Output dell'espressione: 44

Valori predefiniti per il numero di telefono

Scenario 1: specificare i numeri di telefono predefiniti quando il campo è vuoto.

Attributo di destinazione: telephoneNumber

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

Esempio:

  • Valori di input: [telephoneNumber] = ""
  • Output dell'espressione: 000-000-0000
  • Input alternativo: [mobile] = "555-123-4567"
  • Output alternativo: 555-123-4567

Logica del telefono principale

Scenario 1: è necessario determinare quale numero di telefono deve essere contrassegnato come primario.

Attributo di destinazione: 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")

Esempio:

  • Valori di input: [businessPhoneIsPrimary] = "true", [cellPhoneIsPrimary] = "false"
  • Output dell'espressione: business phone is primary
  • Input alternativo: [businessPhoneIsPrimary] = "false", [cellPhoneIsPrimary] = "true"
  • Output alternativo: cell phone is primary
  • Input alternativo: [businessPhoneIsPrimary] = "", [cellPhoneIsPrimary] = "true"
  • Output alternativo: cell phone is primary

Logica basata sul paese e sulla posizione

Mapping del codice paese

Scenario 1: si vuole eseguire il mapping dei nomi dei paesi ai codici paese ISO.

Attributo di destinazione: c

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

Esempio:

  • Valori di input: [country] = "Trinidad and Tobago"
  • Output dell'espressione: TT

Scenario 2: è necessario eseguire il mapping dei paesi ai codici paese numerici.

Attributo di destinazione: countryCode

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

Esempio:

  • Valori di input: [country] = "Destinazioni"
  • Output dell'espressione: 52

Domini di posta elettronica basati sulla posizione

Scenario 1: si vogliono assegnare domini di posta elettronica diversi in base alla posizione geografica.

Attributo di destinazione: posta elettronica

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

Esempio:

  • Valori di input: [country] = "India", [firstName] = "Raj", [lastName] = "Patel"
  • Output dell'espressione: raj.patel@fabrikam.com (o 1raj.patel@fabrikam.com se viene eseguita la prima opzione)
  • Input alternativo: [country] = "Netherlands", [firstName] = "Jan", [lastName] = "van der Berg"
  • Output alternativo: jan.vanderberg@contoso.com (o 1jan.vanderberg@contoso.com se viene eseguita la prima opzione)
  • Input alternativo: [country] = "Germania", [firstName] = "Klaus", [lastName] = "Müller"
  • Output alternativo: klaus.muller@fabrikam.com (dominio predefinito o 1klaus.muller@fabrikam.com se viene eseguita la prima opzione)

Classificazione dei dipendenti e lavoratori contingenti

Classificazione dei tipi di occupazione

Scenario 1: si vuole eseguire il mapping dei codici dei tipi di dipendente alle descrizioni leggibili.

Attributo di destinazione: extensionAttribute3

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

Esempio:

  • Valori di input: [employeeType] = "31202"
  • Output dell'espressione: Employee
  • Input alternativo: [employeeType] = "99999"
  • Output alternativo: Default-value

Identificazione dei lavoratori contingenti

Scenario 1: è necessario identificare e gestire i lavoratori contingenti in modo diverso.

Attributo di destinazione: extensionAttribute4

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

Esempio:

  • Valori di input: [isContingentWorker] = "True"
  • Output dell'espressione: Contractor

Mapping del titolo personale

Scenario 1: si vuole eseguire il mapping dei codici titolo personali ai titoli appropriati.

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

Esempio:

  • Valori di input: [personalTitle] = "4443"
  • Output dell'espressione: Dr.
  • Input alternativo: [personalTitle] = ""
  • Output alternativo: (vuoto - ignorato)

Scenari avanzati

Gestione del reparto condizionale

Scenario 1: si vuole usare il reparto di assegnazione globale quando disponibile; in caso contrario, eseguire il fallback al reparto normale.

Attributo di destinazione: reparto

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

Esempio:

  • Valori di input: [globalAssignmentDepartment] = "It globale", [reparto] = "IT locale"
  • Output dell'espressione: Global IT
  • Input alternativo: [globalAssignmentDepartment] = "", [department] = "Sales"
  • Output alternativo: Sales

Gestione della posta elettronica di eliminazione temporanea

Scenario 1: è necessario modificare gli indirizzi di posta elettronica quando gli utenti vengono eliminati soft per scenari di writeback.

Attributo di destinazione: posta elettronica

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

Esempio:

  • Valori di input: [IsSoftDeleted] = "True", [mail] = "john.smith@company.com" (data corrente: 2025-07-30)
  • Output dell'espressione: 2025-07-30_john.smith@company.com
  • Input alternativo: [IsSoftDeleted] = "False", [mail] = "jane.doe@company.com"
  • Output alternativo: jane.doe@company.com

Assegnazione di unità organizzative complesse con logica di terminazione

Scenario 1: spostare gli utenti terminati in un'unità organizzativa speciale dopo un numero specifico di giorni.

Attributo di destinazione: 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"
    )
)

Esempio:

  • Valori di input: [latestTerminationDate] = "2025-07-10", [reparto] = "Engineering" (data corrente: 2025-07-30)
  • Output dell'espressione: OU=DELETED,DC=company,DC=com (terminato più di 14 giorni fa)
  • Input alternativo: [latestTerminationDate] = "2025-07-25", [department] = "Finance"
  • Output alternativo: OU=Finance,DC=company,DC=com (terminato meno di 14 giorni fa)

Generazione UPN multi-azienda con classe employee

Scenario 1: è necessario generare UPN in base alle informazioni sulle classi aziendali e dei dipendenti.

Attributo di destinazione: 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")
    )
)

Esempio:

  • Valori di input: [employeeClass] = "1915", [firstName] = "Anna", [lastName] = "Johnson"
  • Output dell'espressione: anna.johnson@fabrikam.com (o 01anna.johnson@fabrikam.com se viene eseguita la prima opzione)

Apostrofo e gestione dei caratteri speciali

Scenario 1: è necessario rimuovere apostrofi e trattini dagli indirizzi di posta elettronica per la compatibilità di Azure AD Connect.

Attributo di destinazione: posta elettronica

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"), , "['-]+", , "", , )
)

Esempio:

  • Valori di input: [divisionId] = "1200", [preferredName] = "Mary-Ann", [firstName] = "Mary", [lastName] = "O'Connor"
  • Output dell'espressione: maryann.oconnor@contoso.com (apostrofi e trattini rimossi)
  • Input alternativo: [divisionId] = "8900", [email] = "existing.user@company.com"
  • Output alternativo: existing.user@company.com

Generazione di indirizzi SIP

Scenario 1: si vogliono generare indirizzi SIP per l'integrazione di Skype for Business/Teams.

Attributo di destinazione: 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"))
)

Esempio:

  • Valori di input: [firstName] = "David", [lastName] = "Wilson"
  • Output dell'espressione: sip:david.wilson@contoso.com (o sip:01david.wilson@contoso.com se viene eseguita la prima opzione)
  • Input alternativo: [firstName] = "María José", [lastName] = "González-Pérez"
  • Output alternativo: sip:mariajose.gonzalezperez@contoso.com (o sip:01mariajose.gonzalezperez@contoso.com se viene eseguita la prima opzione o sip:02mariajose.gonzalezperez@contoso.com se vengono prese le prime due opzioni)

Logica condizionale writeback

Scenario 1: si vuole scrivere in modo condizionale gli indirizzi di posta elettronica in base a criteri di data specifici.

Attributo di destinazione: mailNickname

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

Esempio:

  • Valori di input: [extensionAttribute9] = "2025-07-31", [mail] = "user@company.com" (data corrente: 2025-07-30)
  • Output dell'espressione: (vuoto - ignorato, perché la differenza di data è 1 giorno)
  • Input alternativo: [extensionAttribute9] = "2025-08-01", [mail] = "user@company.com"
  • Output alternativo: user@company.com

Scenario 2: è necessario gestire gli attributi mancanti negli scenari di writeback.

Attributo di destinazione: mailNickname

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

Esempio:

  • Valori di input: [extensionAttribute9] = "" (vuoto), [mail] = "user@company.com"
  • Output dell'espressione: noemail@contoso.com
  • Input alternativo: [extensionAttribute9] = "2025-08-01", [mail] = "user@company.com" (data corrente: 2025-07-30)
  • Output alternativo: user@company.com

Procedure consigliate

  • Usare SelectUniqueValue per tutti gli attributi che richiedono univocità (UPN, samAccountName, email).

  • Gestire valori Null e vuoti usando funzioni come IsNullOrEmpty, IsPresent, Switcho Coalesce.

  • Usare NormalizeDiacritics e StripSpaces durante l'elaborazione dei nomi per garantire la compatibilità tra sistemi.

  • Convalidare le espressioni JSONPath in un tester JSONPath prima di implementare nell'ambiente di produzione.

  • Usare la formattazione corretta della data quando si usano i campi data successFactors per evitare errori di conversione.

  • Prendere in considerazione i fusi orari quando si lavora con i confronti tra date e la logica di scadenza dell'account.

  • Usare IgnoreFlowIfNullOrEmpty per i flussi di attributi condizionali e gli scenari di writeback.

  • Testare accuratamente istruzioni Switch complesse perché possono diventare difficili da eseguire nel debug.

  • Documentare chiaramente la logica di business , soprattutto per le regole complesse di gestione degli account e dello stato dell'occupazione.

  • Usare i modelli regex con attenzione e convalidarli nei tester regex online prima dell'implementazione.

Altre risorse