Funções de mapeamento de expressão do Workday para provisionamento de ID do Microsoft Entra

Este artigo fornece um guia abrangente para funções de mapeamento de expressão comumente usadas ao configurar o Workday para o provisionamento de usuário do Active Directory/Microsoft Entra ID local. Essas funções ajudam a transformar e mapear dados do Workday para criar atributos de usuário apropriados na ID do Microsoft Entra.

Sumário

Funções de manipulação de cadeia de caracteres

Operações básicas de cadeia de caracteres

Cenário 1: você deseja limpar um valor de número de telefone proveniente do Workday removendo espaços, colchetes e traços.

Atributo de destino: telephoneNumber, mobile

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

Exemplo:

  • Valores de entrada: [PrimaryWorkTelephone] = "+1 (555) 123-4567"
  • Saída da expressão: +15551234567

Cenário 2: você precisa extrair o sobrenome de um PreferredNameData campo que contenha "NomeDoQuivoDoQuivo".

Atributo de destino: sn no Active Directory local, surname na ID do Microsoft Entra

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

Exemplo:

  • Valores de entrada: [PreferredNameData] = "John Smith"
  • Saída da expressão: Smith

Cenário 3: você deseja remover zeros à esquerda de uma ID de Trabalho antes de correspondê-la com uma ID de funcionário no Active Directory local ou na ID do Microsoft Entra.

Atributo de destino: employeeId

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

Exemplo:

  • Valores de entrada: [WorkerID] = "00012345"
  • Saída da expressão: 12345

Cenário 4: O HereditarySuffix atributo contém informações de sufixo marcadas com o código ISO do país e você deseja extrair apenas as informações do sufixo e anexá-la ao sobrenome.

Atributo de destino: sn no Active Directory local, surname na ID do Microsoft Entra

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

Exemplo:

  • Valores de entrada: [HereditarySuffix] = "NLD_Van_der3", [PreferredLastName] = "Hof"
  • Saída da expressão: Van der Hof

Conversão de maiúsculas e minúsculas

Cenário 1: você precisa converter texto em caso adequado, mas tratar apóstrofos corretamente (por exemplo, "hospital st john" deve se tornar "Hospital São João").

Atributo de destino: empresa

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

Exemplo:

  • Valores de entrada: texto estático "hospital st john's"
  • Saída da expressão: St John's Hospital

Cenário 2: você deseja criar um nome de usuário minúsculo com base no nome e sobrenome.

Atributo de destino: mailNickname

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

Exemplo:

  • Valores de entrada: [PreferredFirstName] = "José", [PreferredLastName] = "García-López"
  • Saída da expressão: jose.garcia-lopez

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

Cenário 1: você precisa aplicar diferentes convenções de nomenclatura com base no país do usuário (por exemplo, "Último, Primeiro" 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])
)

Exemplo:

  • Valores de entrada: [CountryReferenceTwoLetter] = "JP", [PreferredFirstName] = "Hiroshi", [PreferredLastName] = "Tanaka"
  • Saída da expressão: Tanaka,Hiroshi (convenção de nomenclatura japonesa)
  • Entrada alternativa: [CountryReferenceTwoLetter] = "US", [PreferredFirstName] = "John", [PreferredLastName] = "Smith"
  • Saída alternativa: John Smith (convenção de nomenclatura ocidental padrão)

Geração de endereços de email

Geração básica de email

Cenário 1: você deseja construir um endereço de email ingressando no nome e sobrenome, removendo espaços e caracteres especiais e acrescentando um domínio.

Atributo de destino: email

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

Exemplo:

  • Valores de entrada: [PreferredFirstName] = "María", [PreferredLastName] = "José González"
  • Saída da expressão: maria.josegonzalez@contoso.com

Cenário 2: você precisa lidar com caracteres especiais, como aspas e vírgulas em nomes ao gerar endereços de email.

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

Exemplo:

  • Valores de entrada: [PreferredFirstName] = "Mary-Ann", [PreferredLastName] = "O'Connor"
  • Saída da expressão: maryann.oconnor@contoso.com (ou m.oconnor@contoso.com se a primeira opção for tomada ou ma.oconnor@contoso.com se as duas primeiras forem tomadas)

Domínios de email específicos da empresa

Cenário 1: você tem várias empresas e precisa gerar endereços de email com sufixos de domínio diferentes com base na empresa.

Atributo de destino: email

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

Exemplo:

  • Valores de entrada: [Empresa] = "Fabrikam", [FirstName] = "John", [LastName] = "Smith"
  • Saída da expressão: john.smith@fabrikam.com
  • Entrada alternativa: [Empresa] = "Woodgrove", [FirstName] = "Sarah", [LastName] = "Johnson"
  • Saída alternativa: s.johnson@woodgrove.com

Configuração de ProxyAddresses

Cenário 1: você precisa definir vários endereços proxy para o Exchange, incluindo endereços SMTP primários e secundários.

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

Exemplo:

  • Valores de entrada: [PreferredFirstName] = "Michael", [PreferredLastName] = "Brown"
  • Saída da expressão: ["smtp:michael.brown@contoso.mail.onmicrosoft.com", "smtp:michael.brown@contoso.onmicrosoft.com", "SMTP:michael.brown@contoso.com"]

Processamento de número de telefone

Esses mapeamentos de expressão podem ser usados no aplicativo write-back do Workday.

Análise de número de telefone internacional

Cenário 1: você tem números de telefone em formato internacional (+1 737-626-8331) e precisa extrair apenas o número de telefone sem o código do país.

Atributo de destino: telephoneNumber

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

Exemplo:

  • Valores de entrada: [telefoneNumber] = "+1 737-626-8331"
  • Saída da expressão: 7376268331

Cenário 2: você precisa extrair o código do país de um número de telefone para determinar o país para fins de diretório.

Atributo de destino: c

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

Exemplo:

  • Valores de entrada: [telefoneNumber] = "+44 20 7946 0958"
  • Saída da expressão: GBR
  • Entrada alternativa: [telefoneNumber] = "+1 555-123-4567"
  • Saída alternativa: USA

Cenário 3: você precisa fazer write-back do número de telefone que o Microsoft Teams gera e define na ID do Microsoft Entra (por exemplo, +4926180001111). Neste número de telefone, não há espaço entre o CountryCode e o número de telefone real. Você pode usar o seguinte mecanismo de análise regex para extrair códigos de país relevantes para sua organização e usá-los para definir o 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")

Exemplo:

  • Valores de entrada: [telephoneNumber] = "+493012345678"
  • Saída da expressão: GER
  • Entrada alternativa: [telephoneNumber] = "+919876543210"
  • Saída alternativa: IND
  • Entrada alternativa: [telephoneNumber] = "+15551234567"
  • Saída alternativa: USA

Formatação de número de telefone para sistemas diferentes

Cenário 1: você precisa processar números de telefone que incluem extensões (por exemplo, "+1 (206) 291-8163 x8125").

Atributo de destino: telephoneNumber

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

Exemplo:

  • Valores de entrada: [telephoneNumber] = "+1 (206) 291-8163 x8125"
  • Saída da expressão: 2062918163

Cenário 2: você deseja extrair apenas a extensão de um número de telefone.

Atributo de destino: extensionAttribute1

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

Exemplo:

  • Valores de entrada: [telephoneNumber] = "+1 (206) 291-8163 x8125"
  • Saída da expressão: 8125

Lógica de status da conta para o Active Directory

As expressões nesta seção são aplicáveis ao accountDisabled atributo que faz parte do "Workday para o aplicativo de provisionamento de usuários do Active Directory local". Para definir o accountEnabled atributo que faz parte do "Aplicativo de provisionamento de usuário do Workday to Microsoft Entra ID", consulte a seção Lógica de Status da Conta para a ID do Microsoft Entra.

Gerenciamento básico de status da conta

Cenário 1: você deseja desabilitar contas do Active Directory local para usuários que não estão ativos no Workday.

Atributo de destino: accountDisabled

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

Exemplo:

  • Valores de entrada: [Ativo] = "1"
  • Saída da expressão: False (conta habilitada)
  • Entrada alternativa: [Ativo] = "0"
  • Saída alternativa: True (conta desabilitada)

Recontrata o processamento

Cenário 1: Você precisa do Cenário 1: você precisa lidar com cenários de recontratação em que as contas só devem ser habilitadas na data de contratação ou após a data de contratação.

Atributo de destino: accountDisabled

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

Exemplo:

  • Valores de entrada: [Ativo] = "1", [StatusRehire] = "1", [StatusHireDate] = "2025-08-15" (data atual: 2025-07-30)
  • Saída da expressão: True (conta desabilitada até a data de contratação)
  • Entrada alternativa: [Ativo] = "1", [StatusRehire] = "1", [StatusHireDate] = "2025-07-15"
  • Saída alternativa: False (a conta habilitada como data de contratação foi aprovada)

Criação de conta de pré-contratação

Cenário 1: você deseja criar contas para contratações futuras, mas mantê-las desabilitadas até 14 dias antes da data de início.

Atributo de destino: accountDisabled

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

Exemplo:

  • Valores de entrada: [Ativo] = "1", [StatusHireDate] = "2025-08-10" (data atual: 2025-07-30)
  • Saída da expressão: False (a conta habilitada como data de contratação está dentro de 14 dias)
  • Entrada alternativa: [Ativo] = "1", [StatusHireDate] = "2025-09-15"
  • Saída alternativa: True (a conta desabilitada como data de contratação está a mais de 14 dias de distância)

Manipulação de rescindimentos de contratação

Cenário 1: você precisa lidar com cenários de rescisão de contratação ao definir o accountDisabled atributo. Você deseja implementar a lógica:

  • Se Encerrado = 1 no workday, em seguida, accountDisabled = True
  • Se Rescindido = 1 no workday, em seguida, accountDisabled = True
  • Se Active =1 no workday, então
    • se
      • HireDate tem mais de sete dias no futuro e, em seguida, accountDisabled = True (desabilitar a conta)
      • HireDate é <= sete dias no futuro, em seguida, accountDisabled = False (habilitar a conta)
  • Se Ativo = 0, em seguida, conta Desabilitada = 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"
         )
    )
)

Exemplo:

  • Valores de entrada: [Encerrado] = "1", [Ativo] = "1", [StatusHireDate] = "2025-08-15"
  • Saída da expressão: True (conta desabilitada devido ao encerramento)
  • Entrada alternativa: [Encerrado] = "0", [Rescindido] = "1", [Ativo] = "1"
  • Saída alternativa: True (conta desabilitada devido a rescindir)
  • Entrada alternativa: [Encerrado] = "0", [Rescindido] = "0", [Ativo] = "1", [StatusHireDate] = "2025-08-15" (data atual: 2025-07-30)
  • Saída alternativa: True (a conta desabilitada como data de contratação está a mais de 7 dias de distância)
  • Entrada alternativa: [Encerrado] = "0", [Rescindido] = "0", [Ativo] = "1", [StatusHireDate] = "2025-08-05"
  • Saída alternativa: False (a conta habilitada como data de contratação é dentro de 7 dias)

Lógica de status da conta para a ID do Microsoft Entra

As expressões nesta seção são aplicáveis ao accountEnabled atributo que faz parte do "Workday to Microsoft Entra ID user provisioning app". Para definir o accountDisabled atributo que faz parte do "Aplicativo de provisionamento de usuário do Workday para o Active Directory local", consulte a seção Lógica de Status da Conta do Active Directory.

Gerenciamento básico de status da conta

Cenário 1: você deseja desabilitar contas da ID do Microsoft Entra para usuários que não estão ativos no Workday.

Atributo de destino: accountEnabled

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

Exemplo:

  • Valores de entrada: [Ativo] = "1"
  • Saída da expressão: True (conta habilitada)
  • Entrada alternativa: [Ativo] = "0"
  • Saída alternativa: False (conta desabilitada)

Recontrata o processamento

Cenário 1: você precisa lidar com cenários de recontratação em que as contas só devem ser habilitadas na data de contratação ou após a data de contratação.

Atributo de destino: accountEnabled

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

Exemplo:

  • Valores de entrada: [Ativo] = "1", [StatusRehire] = "1", [StatusHireDate] = "2025-08-15" (data atual: 2025-07-30)
  • Saída da expressão: False (conta desabilitada até a data de contratação)
  • Entrada alternativa: [Ativo] = "1", [StatusRehire] = "1", [StatusHireDate] = "2025-07-15"
  • Saída alternativa: True (a conta habilitada como data de contratação foi aprovada)

Criação de conta de pré-contratação

Cenário 1: você deseja criar contas para contratações futuras, mas mantê-las desabilitadas até 14 dias antes da data de início.

Atributo de destino: accountEnabled

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

Exemplo:

  • Valores de entrada: [Ativo] = "1", [StatusHireDate] = "2025-08-10" (data atual: 2025-07-30)
  • Saída da expressão: True (a conta habilitada como data de contratação está dentro de 14 dias)
  • Entrada alternativa: [Ativo] = "1", [StatusHireDate] = "2025-09-15"
  • Saída alternativa: False (a conta desabilitada como data de contratação está a mais de 14 dias de distância)

Funções de data

Formatação e conversão de data

Cenário 1: você precisa converter uma data de término do contrato do Workday no formato Active Directory para o atributo accountExpires, de modo que a conta expire na data de término do contrato.

Atributo de destino: accountExpires

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

Exemplo:

  • Valores de entrada: [StatusHireDate] = "2025-12-31"
  • Saída da expressão: 133835135990000000 (representação numérica de 2025-12-31T23:59:59-07:00)

Cenário 2: você deseja definir uma data de validade da conta cinco anos a partir da data de contratação.

Atributo de destino: accountExpires

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

Exemplo:

  • Valores de entrada: [StatusHireDate] = "2025-01-15"
  • Saída da expressão: 139418879990000000 (representação numérica de 2030-01-15 23:59:59-05:00)

Lógica baseada em data condicional

Cenário 1: você deseja fluir informações do departamento somente se o funcionário tiver iniciado o trabalho (a data de contratação foi aprovada).

Atributo de destino: departamento

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

Exemplo:

  • Valores de entrada: [StatusHireDate] = "2025-07-15", [Departamento] = "Engenharia" (data atual: 2025-07-30)
  • Saída da expressão: Engineering (a data de contratação foi aprovada)
  • Entrada alternativa: [StatusHireDate] = "2025-08-15", [Departamento] = "Marketing"
  • Saída alternativa: IgnoreAttributeFlow (a data de contratação é no futuro)

Cenário 2: você precisa criar objetos de usuário somente se a data de contratação estiver dentro de 14 dias.

Atributo de destino: objectFilter

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

Exemplo:

  • Valores de entrada: [StatusHireDate] = "2025-08-10" (data atual: 2025-07-30)
  • Saída da expressão: False (criar objeto de usuário como data de contratação é dentro de 14 dias)
  • Entrada alternativa: [StatusHireDate] = "2025-09-15"
  • Saída alternativa: IgnoreObjectFlow (não crie objeto de usuário, pois a data de contratação é de mais de 14 dias)

Atribuição da UO (Unidade Organizacional)

Atribuição de UO simples

Cenário 1: você deseja colocar usuários em diferentes UOs com base em sua cidade.

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

Exemplo:

  • Valores de entrada: [Cidade] = "Seattle"
  • Saída da expressão: OU=Seattle,OU=Users,DC=contoso,DC=com
  • Entrada alternativa: [Cidade] = "Chicago"
  • Saída alternativa: OU=Default,OU=Users,DC=contoso,DC=com (padrão para cidades não especificadas)

Estrutura de UO complexa

Cenário 1: você precisa criar uma estrutura de UO complexa com base no departamento, no centro de custos e no 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"
)

Exemplo:

  • Valores de entrada: [SupervisoryOrganization] = "Engineering", [CostCenter] = "Modern Workplace", [CountryReferenceTwoLetter] = "US"
  • Saída da expressão: OU=Engineering,OU=Modern Workplace,OU=USA,OU=Users,DC=contoso,DC=com
  • Entrada alternativa: [SupervisoryOrganization] = "Sales", [CostCenter] = "Marketing", [CountryReferenceTwoLetter] = "UK"
  • Saída alternativa: OU=Users,DC=contoso,DC=com (padrões quando os valores não correspondem)

Atribuição de UO de usuário encerrada

Cenário 1: você deseja mover usuários encerrados para uma UO especial na data de término.

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

Exemplo:

  • Valores de entrada: [StatusTerminationLastDayOfWork] = "2025-07-25", [Cidade] = "Seattle" (data atual: 2025-07-30)
  • Saída da expressão: OU=Leavers,OU=Users,DC=contoso,DC=com (movida para a UO do Leavers conforme a data de término passou)
  • Entrada alternativa: [StatusTerminationLastDayOfWork] = "2025-08-15", [Cidade] = "Dallas"
  • Saída alternativa: OU=Dallas,OU=Users,DC=contoso,DC=com (permanece na UO normal, pois a data de término é futura)

Geração de ID aleatória

Geração aleatória baseada em GUID

Cenário 1: você precisa gerar uma cadeia de caracteres aleatória de 5 caracteres que não contém 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", , )
)

Exemplo:

  • Valores de entrada: GUID gerado convertido em Base64 (por exemplo, "mV8dXr...")
  • Saída da expressão: mVAdX (dígitos substituídos por 'A' ou por 'B'/'C' se a primeira opção for tomada)

Cenário 2: você deseja gerar uma cadeia de caracteres aleatória que começa com "D" seguido por 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}", ,))
)

Exemplo:

  • Valores de entrada: GUID gerado convertido em Base64 contendo a sequência alfabética "mVdX"
  • Saída da expressão: DMVDX (ou diferente se a primeira opção for tomada)

Geração de ID numérica

Cenário 1: você precisa gerar um número aleatório de 4 dígitos de um 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}", ,)
)

Exemplo:

  • Valores de entrada: GUID gerado como "a1b2c3d4-e5f6-7890-1234-567890abcdef"
  • Saída da expressão: D7890 (ou D1234, D5678etc. dependendo de qual sequência de 4 dígitos é correspondida primeiro)

Processamento de nomes

Geração de nome de exibição

Cenário 1: você deseja criar um nome de exibição no formato "Last, First".

Atributo de destino: displayName

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

Exemplo:

  • Valores de entrada: [PreferredLastName] = "Smith", [PreferredFirstName] = "John"
  • Saída da expressão: Smith, John

Cenário 2: você precisa criar um nome de exibição que inclua a inicial intermediária e a ID do funcionário.

Atributo de destino: displayName

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

Exemplo:

  • Valores de entrada: [PreferredLastName] = "Johnson", [PreferredFirstName] = "Sarah", [PreferredMiddleName] = "Elizabeth", [WorkerID] = "12345"
  • Saída da expressão: Johnson,Sarah E-12345

Geração cn (nome comum) com exclusividade

Cenário 1: você deseja gerar um nome comum exclusivo com opções de fallback para duplicatas.

Atributo de destino: cn

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

Exemplo:

  • Valores de entrada: [PreferredFirstName] = "José", [PreferredLastName] = "García", [PreferredMiddleName] = "Antonio"
  • Saída da expressão: Jose Garcia (ou Jose A Garcia se a primeira opção for tomada ou Jose Antonio Garcia se as duas primeiras forem tomadas)

Geração de SamAccountName

Cenário 1: você deseja criar um samAccountName de 20 caracteres usando o nome inicial e o sobrenome com sufixos numéricos para duplicatas.

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

Exemplo:

  • Valores de entrada: [FirstName] = "María José", [LastName] = "González-López"
  • Saída da expressão: mgonzalezlopez (ou mgonzalezlopez1 se a primeira opção for tomada ou mgonzalezlopez2 se as duas primeiras forem tomadas)

Cenários avançados

Ocultar da lógica de listas de endereços

Esta seção descreve como definir o atributo booliano msExchHideFromAddressLists. Use todas as tampas "TRUE" ou "FALSE" para definir o atributo booliano. O uso de qualquer outro valor resulta em um HybridSynchronizationActiveDirectoryInvalidParameter erro.

Cenário 1: você deseja definir msExchHideFromAddressLists com base no status da conta ativa do usuário do Workday.

Atributo de destino: msExchHideFromAddressLists

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

Exemplo:

  • Valores de entrada: [Ativo] = "0"
  • Saída da expressão: TRUE (ocultar de listas de endereços enquanto o usuário está inativo no Workday)
  • Entrada alternativa: [Ativo] = "1"
  • Saída alternativa: FALSE (mostrar em listas de endereços como o usuário está ativo no Workday)

Cenário 2: você deseja definir msExchHideFromAddressLists com base na data de contratação do trabalhador. Mostrar o usuário na lista de endereços do Exchange somente após a data de contratação.

Atributo de destino: msExchHideFromAddressLists

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

Exemplo:

  • Valores de entrada: [StatusHireDate] = "2025-07-31" (data atual: 2025-07-30)
  • Saída da expressão: TRUE (ocultar de listas de endereços como a data de contratação é no futuro)
  • Entrada alternativa: [StatusHireDate] = "2025-07-31" (data atual: 2025-08-01)
  • Saída alternativa: FALSE (mostrar em listas de endereços como a data de contratação está no passado)

Configuração de atributo com vários valores

Cenário 1: você precisa definir vários valores para o atributo msExchPoliciesExcluded no Active Directory.

Atributo de destino: msExchPoliciesExcluded

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

Exemplo:

  • Valores de entrada: valores guid estáticos
  • Saída da expressão: ["a8cccada-a108-47ae-bf9a-f130499aa4cb", "{26491cfc-9e50-4857-861b-0cb8df22b5d7}"]

Cenários de write-back

Cenário 1: você deseja gravar de volta o nome de usuário no Workday somente se a data de contratação do funcionário tiver passado.

Atributo de destino: Nome de usuário

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

Exemplo:

  • Valores de entrada: [employeeHireDate] = "2025-07-15", [userPrincipalName] = "user@contoso.com" (data atual: 2025-07-30)
  • Saída da expressão: user@contoso.com (a data de contratação passou, escreva o nome de usuário)
  • Entrada alternativa: [employeeHireDate] = "2025-08-15", [userPrincipalName] = "future@contoso.com"
  • Saída alternativa: (vazia – ignorada, a data de contratação é futura)

Práticas recomendadas

  • Sempre use SelectUniqueValue para atributos que exigem exclusividade (como UPN, samAccountName, email).

  • Manipule valores nulos e vazios usando funções como IsNullOrEmpty, IsPresentou Switch instruções.

  • Use NormalizeDiacritics ao processar nomes com caracteres especiais para garantir a compatibilidade.

  • Testar completamente a lógica de data como diferentes fusos horários e formatos de data podem afetar os resultados.

  • Use IgnoreFlowIfNullOrEmpty quando quiser ignorar atualizações de atributo para valores vazios.

  • Considere usar o Switch em vez de instruções IIF aninhadas para melhor legibilidade.

  • Sempre valide expressões regulares em um testador regex online antes de implementar.

Mais recursos