Funciones de asignación de expresiones de Workday para el aprovisionamiento de identificadores de Microsoft Entra

En este artículo se proporciona una guía completa para las funciones de asignación de expresiones que se usan habitualmente al configurar Workday en active Directory local o aprovisionamiento de usuarios de Microsoft Entra ID. Estas funciones ayudan a transformar y asignar datos de Workday para crear atributos de usuario adecuados en el identificador de Microsoft Entra.

Tabla de contenido

Funciones de manipulación de cadenas

Operaciones básicas de cadena

Escenario 1: quiere limpiar un valor de número de teléfono procedente de Workday quitando espacios, corchetes y guiones.

Atributo de destino: telephoneNumber, móvil

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

Ejemplo:

  • Valores de entrada: [PrimaryWorkTelephone] = "+1 (555) 123-4567"
  • Salida de expresión: +15551234567

Escenario 2: debe extraer el apellido de un PreferredNameData campo que contenga "FirstName LastName".

Atributo de destino: sn en Active Directory local, surname en el identificador de Entra de Microsoft

Replace([PreferredNameData], , "(?<firstName>[a-zA-Z]+ )(?<lastName>[a-zA-Z]+)", ,"${lastName}", ,)

Ejemplo:

  • Valores de entrada: [PreferredNameData] = "John Smith"
  • Salida de expresión: Smith

Escenario 3: quiere quitar ceros iniciales de un identificador de trabajo antes de hacer coincidirlo con un identificador de empleado en Active Directory local o microsoft Entra ID.

Atributo de destino: employeeId

Replace([WorkerID], , "(?<leadingZeros>^0+)(?<actualValue>[a-zA-Z0-9]+)", , "${actualValue}", ,)

Ejemplo:

  • Valores de entrada: [WorkerID] = "00012345"
  • Salida de expresión: 12345

Escenario 4: el HereditarySuffix atributo contiene información de sufijo etiquetada con código ISO de país y solo desea extraer la información del sufijo y anexarla al apellido.

Atributo de destino: sn en Active Directory local, surname en el identificador de Entra de Microsoft

Join(" ",Replace([HereditarySuffix], ,"(?<CountryISOCode>.*)_(?<suffix1>.*)_(?<suffix2>.*)[0-9]", ,"${suffix1} ${suffix2}", , ),[PreferredLastName])

Ejemplo:

  • Valores de entrada: [OvarianSuffix] = "NLD_Van_der3", [PreferredLastName] = "Hof"
  • Salida de expresión: Van der Hof

Conversión de mayúsculas y minúsculas de texto

Escenario 1: Debe convertir texto en mayúsculas y minúsculas adecuadas, pero controlar los apóstrofos correctamente (por ejemplo, "hospital de San Juan" debe convertirse en "Hospital de San Juan").

Atributo de destino: company

Replace(PCase("st john's hospital"),"'S", , ,"'s", , )

Ejemplo:

  • Valores de entrada: texto estático "st john's hospital"
  • Salida de expresión: St John's Hospital

Escenario 2: quiere crear un nombre de usuario en minúscula a partir del nombre de usuario y el apellido.

Atributo de destino: mailNickname

ToLower(NormalizeDiacritics(StripSpaces(Join(".", [PreferredFirstName], [PreferredLastName]))))

Ejemplo:

  • Valores de entrada: [PreferredFirstName] = "José", [PreferredLastName] = "García-López"
  • Salida de expresión: jose.garcia-lopez

Lógica de nomenclatura específica del país

Escenario 1: Debe aplicar diferentes convenciones de nomenclatura basadas en el país del usuario (por ejemplo, "Last, First" para determinados países).

Atributo de destino: displayName, cn

Switch([CountryReferenceTwoLetter], 
    Join(" ", [PreferredFirstName], [PreferredLastName]),  
    "HU", Join(",", [PreferredLastName], [PreferredFirstName]), 
    "JP", Join(",", [PreferredLastName], [PreferredFirstName]), 
    "KR", Join(",", [PreferredLastName], [PreferredFirstName])
)

Ejemplo:

  • Valores de entrada: [CountryReferenceTwoLetter] = "JP", [PreferredFirstName] = "Hiroshi", [PreferredLastName] = "Tanaka"
  • Salida de expresión: Tanaka,Hiroshi (convención de nomenclatura japonesa)
  • Entrada alternativa: [CountryReferenceTwoLetter] = "US", [PreferredFirstName] = "John", [PreferredLastName] = "Smith"
  • Salida alternativa: John Smith (convención de nomenclatura occidental predeterminada)

Generación de direcciones de correo electrónico

Generación básica de correo electrónico

Escenario 1: quiere construir una dirección de correo electrónico mediante la combinación de nombre y apellidos, la eliminación de espacios y caracteres especiales y la anexión de un dominio.

Atributo de destino: correo

Join("@", NormalizeDiacritics(StripSpaces(Join(".", [PreferredFirstName], [PreferredLastName]))), "contoso.com")

Ejemplo:

  • Valores de entrada: [PreferredFirstName] = "María", [PreferredLastName] = "José González"
  • Salida de expresión: maria.josegonzalez@contoso.com

Escenario 2: debe controlar caracteres especiales como comillas y comas en nombres al generar direcciones de correo electrónico.

Atributo de destino: userPrincipalName

SelectUniqueValue(
    Join("@", Replace(NormalizeDiacritics(StripSpaces(Join(".", [PreferredFirstName], [PreferredLastName]))), , "[\"',]+", , "", , ), "contoso.com"), 
    Join("@", Replace(NormalizeDiacritics(StripSpaces(Join(".", Mid([PreferredFirstName], "1", "1"), [PreferredLastName]))), , "[\"',]+", , "", , ), "contoso.com"), 
    Join("@", Replace(NormalizeDiacritics(StripSpaces(Join(".", Mid([PreferredFirstName], "1", "2"), [PreferredLastName]))), , "[\"',]+", , "", , ), "contoso.com")
)

Ejemplo:

  • Valores de entrada: [PreferredFirstName] = "Mary-Ann", [PreferredLastName] = "O'Connor"
  • Salida de expresión: maryann.oconnor@contoso.com (o m.oconnor@contoso.com si se toma la primera opción o ma.oconnor@contoso.com si se toman las dos primeras)

Dominios de correo electrónico específicos de la empresa

Escenario 1: tiene varias empresas y necesita generar direcciones de correo electrónico con diferentes sufijos de dominio basados en la empresa.

Atributo de destino: correo

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

Ejemplo:

  • Valores de entrada: [Company] = "Fabrikam", [FirstName] = "John", [LastName] = "Smith"
  • Salida de expresión: john.smith@fabrikam.com
  • Entrada alternativa: [Company] = "Woodgrove", [FirstName] = "Sarah", [LastName] = "Johnson"
  • Salida alternativa: s.johnson@woodgrove.com

Configuración de ProxyAddresses

Escenario 1: debe establecer varias direcciones de proxy para Exchange, incluidas las direcciones SMTP principales y secundarias.

Atributo de destino: proxyAddresses

Split(
    Join(",",
        Append("smtp:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [PreferredFirstName], [PreferredLastName]))), "contoso.mail.onmicrosoft.com")),
        Append("smtp:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [PreferredFirstName], [PreferredLastName]))), "contoso.onmicrosoft.com")),
        Append("SMTP:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [PreferredFirstName], [PreferredLastName]))), "contoso.com"))
    ), ","
)

Ejemplo:

  • Valores de entrada: [PreferredFirstName] = "Michael", [PreferredLastName] = "Brown"
  • Salida de expresión: ["smtp:michael.brown@contoso.mail.onmicrosoft.com", "smtp:michael.brown@contoso.onmicrosoft.com", "SMTP:michael.brown@contoso.com"]

Procesamiento de números de teléfono

Estas asignaciones de expresiones se pueden usar en la aplicación Workday Writeback.

Análisis de números de teléfono internacionales

Escenario 1: Tiene números de teléfono en formato internacional (+1 737-626-8331) y necesita extraer solo el número de teléfono sin el código de país.

Atributo de destino: telephoneNumber

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

Ejemplo:

  • Valores de entrada: [telephoneNumber] = "+1 737-626-8331"
  • Salida de expresión: 7376268331

Escenario 2: debe extraer el código de país de un número de teléfono para determinar el país con fines de directorio.

Atributo de destino: c

Switch(Replace([telephoneNumber], , "\\+(?<isdCode>\\d* )(?<phoneNumber>.*)", , "${isdCode}", , ), "USA",
  "1", "USA",
  "44", "GBR", 
  "49", "DEU"
)

Ejemplo:

  • Valores de entrada: [telephoneNumber] = "+44 20 7946 0958"
  • Salida de expresión: GBR
  • Entrada alternativa: [telephoneNumber] = "+1 555-123-4567"
  • Salida alternativa: USA

Escenario 3: debe escribir el número de teléfono que Microsoft Teams genera y establece en el identificador de Entra de Microsoft (por ejemplo, +4926180001111). En este número de teléfono, no hay espacio entre CountryCode y el número de teléfono real. Puede usar el siguiente mecanismo de análisis de expresiones regulares para extraer códigos de país relevantes para su organización y usarlo para establecer Workday CountryCodeName.

Atributo de destino: CountryCodeName

Switch(Replace([telephoneNumber], , "\+(?<isdCode>49|44|43|1|352|91|31|32|55|237|420|45|20|212|216|234|263|27|30|33|34|351|352|36|372|380|381|383|39|40|41|421|46|47|48|58|60|7|90|91|92|94|961|971|98|995)(?<phoneNumber>.*)", , "${isdCode}", , ), , "43", "AUT", "32", "BEL", "1", "USA", "420", "CZE", "45", "DNK", "372", "EST", "33", "FRA", "49", "GER", "30", "GRC", "36", "HUN", "91", "IND", "39", "ITA", "352", "LUX", "31", "NLD", "47", "NOR", "48", "POL", "40", "ROU", "421", "SVK", "27", "ZAF", "34", "ESP", "46", "SWE", "41", "CHE", "90", "TUR")

Ejemplo:

  • Valores de entrada: [telephoneNumber] = "+493012345678"
  • Salida de expresión: GER
  • Entrada alternativa: [telephoneNumber] = "+919876543210"
  • Salida alternativa: IND
  • Entrada alternativa: [telephoneNumber] = "+15551234567"
  • Salida alternativa: USA

Formato de número de teléfono para diferentes sistemas

Escenario 1: debe procesar números de teléfono que incluyan extensiones (por ejemplo, "+1 (206) 291-8163 x8125").

Atributo de destino: telephoneNumber

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

Ejemplo:

  • Valores de entrada: [telephoneNumber] = "+1 (206) 291-8163 x8125"
  • Salida de expresión: 2062918163

Escenario 2: desea extraer solo la extensión de un número de teléfono.

Atributo de destino: extensionAttribute1

Replace([telephoneNumber], , "\\+(?<isdCode>\\d* )(?<phoneNumber>.* )[x](?<extension>.*)", , "${extension}", , )

Ejemplo:

  • Valores de entrada: [telephoneNumber] = "+1 (206) 291-8163 x8125"
  • Salida de expresión: 8125

Lógica de estado de la cuenta para Active Directory

Las expresiones de esta sección son aplicables al accountDisabled atributo que forma parte de "Workday a la aplicación de aprovisionamiento de usuarios de Active Directory local". Para establecer el accountEnabled atributo que forma parte de "Workday to Microsoft Entra ID user provisioning app", consulte la sección Account Status Logic for Microsoft Entra ID (Lógica de estado de la cuenta para el identificador de Microsoft Entra).

Administración básica del estado de la cuenta

Escenario 1: quiere deshabilitar las cuentas locales de Active Directory para los usuarios que no están activos en Workday.

Atributo de destino: accountDisabled

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

Ejemplo:

  • Valores de entrada: [Activo] = "1"
  • Salida de expresión: False (cuenta habilitada)
  • Entrada alternativa: [Activo] = "0"
  • Salida alternativa: True (cuenta deshabilitada)

Recontratar procesamiento

Escenario 1: Necesita escenario 1: debe controlar escenarios de recontratación en los que las cuentas solo deben habilitarse en o después de la fecha de contratación.

Atributo de destino: accountDisabled

Switch([Active], , 
"1", IIF([StatusRehire]=1, IIF(DateDiff("d", Now(), CDate([StatusHireDate])) >= 0, "False", "True"), "False"), 
"0", "True")

Ejemplo:

  • Valores de entrada: [Active] = "1", [StatusRehire] = "1", [StatusHireDate] = "2025-08-15" (fecha actual: 2025-07-30)
  • Salida de expresión: True (cuenta deshabilitada hasta la fecha de contratación)
  • Entrada alternativa: [Active] = "1", [StatusRehire] = "1", [StatusHireDate] = "2025-07-15"
  • Salida alternativa: False (la cuenta habilitada como fecha de contratación ha pasado)

Creación de cuentas previas a la contratación

Escenario 1: quiere crear cuentas para contrataciones futuras, pero mantenerlas deshabilitadas hasta 14 días antes de su fecha de inicio.

Atributo de destino: accountDisabled

Switch([Active], , "1", IIF(DateDiff("d", Now(), CDate([StatusHireDate])) <= 14, "False", "True"), "0", "True")

Ejemplo:

  • Valores de entrada: [Active] = "1", [StatusHireDate] = "2025-08-10" (fecha actual: 2025-07-30)
  • Salida de la expresión: False (la cuenta habilitada como fecha de contratación está en un plazo de 14 días)
  • Entrada alternativa: [Active] = "1", [StatusHireDate] = "2025-09-15"
  • Salida alternativa: True (la cuenta deshabilitada como fecha de contratación es superior a 14 días)

Control de las rescinciones de contrataciones

Escenario 1: debe controlar los escenarios de rescind de contratación al establecer el accountDisabled atributo . Quiere implementar la lógica:

  • Si Terminated = 1 in workday then accountDisabled = True
  • Si rescinded = 1 en workday, accountDisabled = True
  • Si Activo =1 en workday,
    • si
      • HireDate es más de siete días en el futuro y, a continuación, accountDisabled = True (deshabilitar la cuenta)
      • HireDate es <= siete días en el futuro, accountDisabled = False (habilitar la cuenta)
  • Si Activo = 0, accountDisabled = True

Atributo de destino: accountDisabled

Switch([StatusTerminated], "False", "1", "True", "0",
  Switch([StatusHireRescinded], "False", "1", "True", "0",
     Switch([Active], "False", 
         "1", IIF(DateDiff("d", Now(), CDate(IIF(IsNullOrEmpty([StatusHireDate]), "9999-01-01", [StatusHireDate]))) < 7, "False", "True"), 
         "0", "True"
         )
    )
)

Ejemplo:

  • Valores de entrada: [Terminated] = "1", [Active] = "1", [StatusHireDate] = "2025-08-15"
  • Salida de expresión: True (cuenta deshabilitada debido a la finalización)
  • Entrada alternativa: [Terminated] = "0", [Rescinded] = "1", [Active] = "1"
  • Salida alternativa: True (cuenta deshabilitada debido a la rescinción)
  • Entrada alternativa: [Terminated] = "0", [Rescinded] = "0", [Active] = "1", [StatusHireDate] = "2025-08-15" (fecha actual: 2025-07-30)
  • Salida alternativa: True (la cuenta deshabilitada como fecha de contratación es superior a 7 días)
  • Entrada alternativa: [Terminated] = "0", [Rescinded] = "0", [Active] = "1", [StatusHireDate] = "2025-08-05"
  • Salida alternativa: False (la cuenta habilitada como fecha de contratación está en un plazo de 7 días)

Lógica de estado de la cuenta para microsoft Entra ID

Las expresiones de esta sección son aplicables al accountEnabled atributo que forma parte de "Workday to Microsoft Entra ID user provisioning app". Para establecer el accountDisabled atributo que forma parte de "Workday en una aplicación de aprovisionamiento de usuarios de Active Directory local", consulte la sección Lógica de estado de la cuenta para Active Directory.

Administración básica del estado de la cuenta

Escenario 1: quiere deshabilitar las cuentas de Id. de Entra de Microsoft para los usuarios que no están activos en Workday.

Atributo de destino: accountEnabled

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

Ejemplo:

  • Valores de entrada: [Activo] = "1"
  • Salida de expresión: True (cuenta habilitada)
  • Entrada alternativa: [Activo] = "0"
  • Salida alternativa: False (cuenta deshabilitada)

Recontratar procesamiento

Escenario 1: Debe controlar escenarios de recontratación en los que las cuentas solo deben habilitarse en o después de la fecha de contratación.

Atributo de destino: accountEnabled

Switch([Active], , 
"1", IIF([StatusRehire]=1, IIF(DateDiff("d", Now(), CDate([StatusHireDate])) >= 0, "True", "False"), "True"), 
"0", "False")

Ejemplo:

  • Valores de entrada: [Active] = "1", [StatusRehire] = "1", [StatusHireDate] = "2025-08-15" (fecha actual: 2025-07-30)
  • Salida de expresión: False (cuenta deshabilitada hasta la fecha de contratación)
  • Entrada alternativa: [Active] = "1", [StatusRehire] = "1", [StatusHireDate] = "2025-07-15"
  • Salida alternativa: True (la cuenta habilitada como fecha de contratación ha pasado)

Creación de cuentas previas a la contratación

Escenario 1: quiere crear cuentas para contrataciones futuras, pero mantenerlas deshabilitadas hasta 14 días antes de su fecha de inicio.

Atributo de destino: accountEnabled

Switch([Active], , "1", IIF(DateDiff("d", Now(), CDate([StatusHireDate])) <= 14, "True", "False"), "0", "False")

Ejemplo:

  • Valores de entrada: [Active] = "1", [StatusHireDate] = "2025-08-10" (fecha actual: 2025-07-30)
  • Salida de la expresión: True (la cuenta habilitada como fecha de contratación está en un plazo de 14 días)
  • Entrada alternativa: [Active] = "1", [StatusHireDate] = "2025-09-15"
  • Salida alternativa: False (la cuenta deshabilitada como fecha de contratación es superior a 14 días)

Funciones de fecha

Formato de fecha y conversión

Escenario 1: debe convertir una fecha de finalización del contrato de Workday en formato de Active Directory para el atributo accountExpires, por lo que la cuenta expira en la fecha de finalización del contrato.

Atributo de destino: accountExpires

NumFromDate(Join("", FormatDateTime([ContractEndDate], ,"yyyy-MM-ddzzz", "yyyy-MM-dd"), "T23:59:59-08:00"))

Ejemplo:

  • Valores de entrada: [StatusHireDate] = "2025-12-31"
  • Salida de expresión: 133835135990000000 (representación numérica de 2025-12-31T23:59:59-07:00)

Escenario 2: quiere establecer una fecha de expiración de la cuenta cinco años a partir de la fecha de contratación.

Atributo de destino: accountExpires

NumFromDate(Join("",FormatDateTime(DateAdd("yyyy", 5, CDate([StatusHireDate])), , "yyyy-MM-dd", "yyyy-MM-dd")," 23:59:59-05:00"))

Ejemplo:

  • Valores de entrada: [StatusHireDate] = "2025-01-15"
  • Salida de expresión: 139418879990000000 (representación numérica de 2030-01-15 23:59:59-05:00)

Lógica basada en fechas condicionales

Escenario 1: desea fluir la información del departamento solo si el empleado ha iniciado el trabajo (se ha superado la fecha de contratación).

Atributo de destino: departamento

IIF(DateDiff("d", Now(), CDate([StatusHireDate])) >= 0, [Department], IgnoreAttributeFlow)

Ejemplo:

  • Valores de entrada: [StatusHireDate] = "2025-07-15", [Department] = "Engineering" (fecha actual: 2025-07-30)
  • Salida de expresión: Engineering (se ha superado la fecha de contratación)
  • Entrada alternativa: [StatusHireDate] = "2025-08-15", [Department] = "Marketing"
  • Salida alternativa: IgnoreAttributeFlow (la fecha de contratación está en el futuro)

Escenario 2: solo debe crear objetos de usuario si la fecha de contratación está en un plazo de 14 días.

Atributo de destino: objectFilter

IIF(DateDiff("d", Now(), CDate([StatusHireDate])) <= 14, "False", IgnoreObjectFlow)

Ejemplo:

  • Valores de entrada: [StatusHireDate] = "2025-08-10" (fecha actual: 2025-07-30)
  • Salida de expresión: False (crear objeto de usuario como fecha de contratación está en un plazo de 14 días)
  • Entrada alternativa: [StatusHireDate] = "2025-09-15"
  • Salida alternativa: IgnoreObjectFlow (no cree un objeto de usuario, ya que la fecha de contratación es superior a 14 días)

Asignación de unidad organizativa (OU)

Asignación de unidad organizativa simple

Escenario 1: quiere colocar usuarios en distintas UNIDADES organizativas en función de su ciudad.

Atributo de destino: parentDistinguishedName

Switch([City], "OU=Default,OU=Users,DC=contoso,DC=com", 
"Dallas", "OU=Dallas,OU=Users,DC=contoso,DC=com", 
"Austin", "OU=Austin,OU=Users,DC=contoso,DC=com", 
"Seattle", "OU=Seattle,OU=Users,DC=contoso,DC=com", 
"London", "OU=London,OU=Users,DC=contoso,DC=com" 
)

Ejemplo:

  • Valores de entrada: [City] = "Seattle"
  • Salida de expresión: OU=Seattle,OU=Users,DC=contoso,DC=com
  • Entrada alternativa: [City] = "Chicago"
  • Salida alternativa: OU=Default,OU=Users,DC=contoso,DC=com (valor predeterminado para ciudades no especificadas)

Estructura de unidad organizativa compleja

Escenario 1: debe crear una estructura compleja de unidades organizativas en función del departamento, el centro de costos y el país.

Atributo de destino: parentDistinguishedName

Join("", 
    Switch([SupervisoryOrganization],"",
        "Engineering", "OU=Engineering,",
        "Shared Services", "OU=Shared Services,",
        "Information Technology", "OU=Information Technology,",
        "Development", "OU=Development,"
        ),
    Switch([CostCenter],"",
        "Finance and Info. Mgmt.","OU=Finance and Information Management,",
        "Modern Workplace","OU=Modern Workplace,",
        "Green Energy","OU=Green Energy,"
        ),
    Switch([CountryReferenceTwoLetter],"",
        "US","OU=USA,",
        "UK","OU=UK,",
        "IN","OU=IN,"
        ),
    "OU=Users,DC=contoso,DC=com"
)

Ejemplo:

  • Valores de entrada: [SupervisoryOrganization] = "Engineering", [CostCenter] = "Modern Workplace", [CountryReferenceTwoLetter] = "US"
  • Salida de expresión: OU=Engineering,OU=Modern Workplace,OU=USA,OU=Users,DC=contoso,DC=com
  • Entrada alternativa: [SupervisoryOrganization] = "Sales", [CostCenter] = "Marketing", [CountryReferenceTwoLetter] = "UK"
  • Salida alternativa: OU=Users,DC=contoso,DC=com (valores predeterminados cuando los valores no coinciden)

Asignación de unidades organizativas de usuario terminadas

Escenario 1: quiere mover usuarios terminados a una unidad organizativa especial en su fecha de finalización.

Atributo de destino: parentDistinguishedName

IIF(DateDiff("d", Now(),CDate(Switch([StatusTerminationLastDayOfWork],[StatusTerminationLastDayOfWork],
        "","9999-12-31"
        ))
    ) <= 0, 
    "OU=Leavers,OU=Users,DC=contoso,DC=com", 
    Switch([City], "OU=Default,OU=Users,DC=contoso,DC=com", 
        "Dallas", "OU=Dallas,OU=Users,DC=contoso,DC=com", 
        "Austin", "OU=Austin,OU=Users,DC=contoso,DC=com", 
        "Seattle", "OU=Seattle,OU=Users,DC=contoso,DC=com", 
        "London", "OU=London,OU=Users,DC=contoso,DC=com" 
    ) 
)

Ejemplo:

  • Valores de entrada: [StatusTerminationLastDayOfWork] = "2025-07-25", [City] = "Seattle" (fecha actual: 2025-07-30)
  • Salida de expresión: OU=Leavers,OU=Users,DC=contoso,DC=com (se ha movido a la unidad organizativa Leavers como fecha de finalización ha pasado)
  • Entrada alternativa: [StatusTerminationLastDayOfWork] = "2025-08-15", [City] = "Dallas"
  • Salida alternativa: OU=Dallas,OU=Users,DC=contoso,DC=com (permanece en la unidad organizativa normal, ya que la fecha de finalización está en el futuro)

Generación de identificadores aleatorios

Generación aleatoria basada en GUID

Escenario 1: debe generar una cadena aleatoria de 5 caracteres que no contenga dígitos.

Atributo de destino: extensionAttribute15

SelectUniqueValue (
   Replace(Mid(ConvertToBase64(Guid()), 1, 5 ), ,"[0-9]", ,"A", , ),
   Replace(Mid(ConvertToBase64(Guid()), 1, 5 ), ,"[0-9]", ,"B", , ),
   Replace(Mid(ConvertToBase64(Guid()), 1, 5 ), ,"[0-9]", ,"C", , )
)

Ejemplo:

  • Valores de entrada: GUID generado convertido a Base64 (por ejemplo, "mV8dXr...")
  • Salida de expresión: mVAdX (dígitos reemplazados por "A" o por "B"/"C" si se toma la primera opción)

Escenario 2: quiere generar una cadena aleatoria que comience por "D" seguida de 4 caracteres alfabéticos.

Atributo de destino: extensionAttribute14

SelectUniqueValue(
    ToUpper(Replace(ConvertToBase64(Guid()), , "(.*?)(?<id>[a-zA-Z]{4})(.*)", , "D${id}", ,)),
    ToUpper(Replace(ConvertToBase64(Guid()), , "(.*?)(?<id>[a-zA-Z]{4})(.*)", , "D${id}", ,)),
    ToUpper(Replace(ConvertToBase64(Guid()), , "(.*?)(?<id>[a-zA-Z]{4})(.*)", , "D${id}", ,))
)

Ejemplo:

  • Valores de entrada: GUID generado convertido a Base64 que contiene la secuencia alfabética "mVdX"
  • Salida de expresión: DMVDX (o diferente si se toma la primera opción)

Generación de identificadores numéricos

Escenario 1: debe generar un número aleatorio de 4 dígitos a partir de un GUID.

Atributo de destino: extensionAttribute13

SelectUniqueValue(
    Replace(Replace(Guid(), ,"-", ,"", , ), ,"(.*?)(?<id>[0-9]{4})(.*)", , "D${id}", ,),
    Replace(Replace(Guid(), ,"-", ,"", , ), ,"(.*?)(?<id>[0-9]{4})(.*)", , "D${id}", ,),
    Replace(Replace(Guid(), ,"-", ,"", , ), ,"(.*?)(?<id>[0-9]{4})(.*)", , "D${id}", ,)
)

Ejemplo:

  • Valores de entrada: GUID generado como "a1b2c3d4-e5f6-7890-1234-567890abcdef"
  • Salida de expresión: D7890 (o D1234, D5678, etc. dependiendo de la secuencia de 4 dígitos que coincida primero)

Procesamiento de nombres

Generación de nombres para mostrar

Escenario 1: desea crear un nombre para mostrar en formato "Last, First".

Atributo de destino: displayName

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

Ejemplo:

  • Valores de entrada: [PreferredLastName] = "Smith", [PreferredFirstName] = "John"
  • Salida de expresión: Smith, John

Escenario 2: debe crear un nombre para mostrar que incluya el identificador inicial y del empleado intermedios.

Atributo de destino: displayName

Join("", [PreferredLastName], ",", [PreferredFirstName], " ", Mid([PreferredMiddleName],1,1), "-", [WorkerID])

Ejemplo:

  • Valores de entrada: [PreferredLastName] = "Johnson", [PreferredFirstName] = "Sarah", [PreferredMiddleName] = "Elizabeth", [WorkerID] = "12345"
  • Salida de expresión: Johnson,Sarah E-12345

Generación de nombres comunes (CN) con unicidad

Escenario 1: quiere generar un nombre común único con opciones de reserva para duplicados.

Atributo de destino: cn

SelectUniqueValue(
    NormalizeDiacritics(Join(" ", [PreferredFirstName], [PreferredLastName])),
    NormalizeDiacritics(Join(" ", [PreferredFirstName], Mid([PreferredMiddleName],1,1), [PreferredLastName])),
    NormalizeDiacritics(Join(" ", [PreferredFirstName], [PreferredMiddleName], [PreferredLastName]))
)

Ejemplo:

  • Valores de entrada: [PreferredFirstName] = "José", [PreferredLastName] = "García", [PreferredMiddleName] = "Antonio"
  • Salida de expresión: Jose Garcia (o Jose A Garcia si se toma la primera opción o Jose Antonio Garcia si se toman las dos primeras)

Generación samAccountName

Escenario 1: quiere crear un samAccountName de 20 caracteres con el nombre inicial y el apellido con sufijos numéricos para duplicados.

Atributo de destino: 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")
)

Ejemplo:

  • Valores de entrada: [FirstName] = "María José", [LastName] = "González-López"
  • Salida de expresión: mgonzalezlopez (o mgonzalezlopez1 si se toma la primera opción o mgonzalezlopez2 si se toman las dos primeras)

Escenarios avanzados

Ocultar de la lógica de listas de direcciones

En esta sección se describe cómo establecer el atributo msExchHideFromAddressListsbooleano . Use todos los límites "TRUE" o "FALSE" para establecer el atributo booleano. El uso de cualquier otro valor produce un HybridSynchronizationActiveDirectoryInvalidParameter error.

Escenario 1: quiere establecer msExchHideFromAddressLists en función del estado de la cuenta activa del usuario de Workday.

Atributo de destino: msExchHideFromAddressLists

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

Ejemplo:

  • Valores de entrada: [Activo] = "0"
  • Salida de expresión: TRUE (ocultar de las listas de direcciones a medida que el usuario está inactivo en Workday)
  • Entrada alternativa: [Activo] = "1"
  • Salida alternativa: FALSE (mostrar en las listas de direcciones a medida que el usuario está activo en Workday)

Escenario 2: quiere establecer msExchHideFromAddressLists en función de la fecha de contratación del trabajador. Mostrar al usuario en la lista de direcciones de Exchange solo después de la fecha de contratación.

Atributo de destino: msExchHideFromAddressLists

IIF(DateDiff("d", Now(), CDate([StatusHireDate])) >= 0, "TRUE", "FALSE")

Ejemplo:

  • Valores de entrada: [StatusHireDate] = "2025-07-31" (fecha actual: 2025-07-30)
  • Salida de la expresión: TRUE (ocultar de las listas de direcciones como fecha de contratación está en el futuro)
  • Entrada alternativa: [StatusHireDate] = "2025-07-31" (fecha actual: 2025-08-01)
  • Salida alternativa: FALSE (mostrar en listas de direcciones como fecha de contratación está en el pasado)

Configuración de atributos multivalor

Escenario 1: debe establecer varios valores para el atributo msExchPoliciesExcluded en Active Directory.

Atributo de destino: msExchPoliciesExcluded

Split(
    Join(",","a8cccada-a108-47ae-bf9a-f130499aa4cb","{26491cfc-9e50-4857-861b-0cb8df22b5d7}"),
    ","
)

Ejemplo:

  • Valores de entrada: valores GUID estáticos
  • Salida de expresión: ["a8cccada-a108-47ae-bf9a-f130499aa4cb", "{26491cfc-9e50-4857-861b-0cb8df22b5d7}"]

Escenarios de escritura diferida

Escenario 1: desea volver a escribir el nombre de usuario en Workday solo si se ha superado la fecha de contratación del empleado.

Atributo de destino: Nombre de usuario

IgnoreFlowIfNullOrEmpty(IIF(DateDiff("d", Now(), CDate([employeeHireDate])) > 0, "", [userPrincipalName]))

Ejemplo:

  • Valores de entrada: [employeeHireDate] = "2025-07-15", [userPrincipalName] = "user@contoso.com" (fecha actual: 2025-07-30)
  • Salida de expresión: user@contoso.com (la fecha de contratación ha pasado, el nombre de usuario de escritura diferida)
  • Entrada alternativa: [employeeHireDate] = "2025-08-15", [userPrincipalName] = "future@contoso.com"
  • Salida alternativa: (vacía- omitida, la fecha de contratación está en el futuro)

procedimientos recomendados

  • Use siempre SelectUniqueValue para los atributos que requieren unicidad (como UPN, samAccountName, email).

  • Controle valores NULL y vacíos mediante funciones como IsNullOrEmptyinstrucciones , IsPresento Switch .

  • Use NormalizeDiacritics al procesar nombres con caracteres especiales para garantizar la compatibilidad.

  • La lógica de fecha de prueba exhaustivamente , ya que diferentes zonas horarias y formatos de fecha pueden afectar a los resultados.

  • Use IgnoreFlowIfNullOrEmpty cuando quiera omitir las actualizaciones de atributos para los valores vacíos.

  • Considere la posibilidad de usar Switch en lugar de instrucciones IIF anidadas para mejorar la legibilidad.

  • Valide siempre las expresiones regulares en un evaluador de expresiones regulares en línea antes de implementar.

Más recursos