Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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
- Generazione di indirizzi di posta elettronica
- Logica di gestione degli account
- Funzioni di data e scadenza dell'account
- Assegnazione di unità organizzativa
- Elaborazione dei nomi e nomi visualizzati
- Generazione di SamAccountName
- Configurazione di ProxyAddresses
- Elaborazione dei numeri di telefono
- Logica basata sul paese e sulla posizione
- Classificazione dei dipendenti e lavoratori contingenti
- Scenari avanzati
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(ojohn.m.smith@contoso.comse 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(oJose A Garciase viene eseguita la prima opzione oJose Antonio Garciase 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(oGarcia2, Mikese viene eseguita la prima opzione e così via) - Input alternativo: [lastName] = "Smith", [preferredName] = "", [firstName] = "John"
-
Output alternativo:
Smith, John(oSmith2, Johnse 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(ojgarcialopez1se viene eseguita la prima opzione ojgarcialopez2se 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(ochandersonse viene eseguita la prima opzione ochrandersonse vengono eseguite le prime due opzioni) - Input alternativo: [firstName] = "María", [lastName] = "Rodrídevice-Santos"
-
Output alternativo:
mrodriguezsantos(omarodriguezsantosse viene eseguita la prima opzione omarrodriguezsantosse 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(oSMTP:trinidad.j.williams@contoso.comse viene eseguita la prima opzione) - Input alternativo: [company] = "National Energy", [firstName] = "Rebecca", [lastName] = "Thompson", [middleName] = "Marie"
-
Output alternativo:
SMTP:r.thompson@fabrikam.com(oSMTP:r.m.thompson@fabrikam.comse 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 oSMTP:david.p.jones@contoso.comse 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(o1raj.patel@fabrikam.comse viene eseguita la prima opzione) - Input alternativo: [country] = "Netherlands", [firstName] = "Jan", [lastName] = "van der Berg"
-
Output alternativo:
jan.vanderberg@contoso.com(o1jan.vanderberg@contoso.comse viene eseguita la prima opzione) - Input alternativo: [country] = "Germania", [firstName] = "Klaus", [lastName] = "Müller"
-
Output alternativo:
klaus.muller@fabrikam.com(dominio predefinito o1klaus.muller@fabrikam.comse 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(o01anna.johnson@fabrikam.comse 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(osip:01david.wilson@contoso.comse viene eseguita la prima opzione) - Input alternativo: [firstName] = "María José", [lastName] = "González-Pérez"
-
Output alternativo:
sip:mariajose.gonzalezperez@contoso.com(osip:01mariajose.gonzalezperez@contoso.comse viene eseguita la prima opzione osip:02mariajose.gonzalezperez@contoso.comse 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,SwitchoCoalesce.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.