Compartilhar via


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