Partilhar via


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

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 Ative Directory / Microsoft Entra ID local. Essas funções ajudam a transformar e mapear dados do Workday para criar atributos de usuário apropriados no Microsoft Entra ID.

Índice

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: phoneNumber, mobile

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

Exemplo:

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

Cenário 2: Você precisa extrair o sobrenome de um PreferredNameData campo que contém "FirstName LastName".

Atributo de destino: sn no Ative Directory local, surname no Microsoft Entra ID

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

Exemplo:

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

Cenário 3: Você deseja remover zeros à esquerda de uma ID de Trabalhador antes de combiná-la com uma ID de funcionário no Ative 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 de expressão: 12345

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

Atributo de destino: sn no Ative Directory local, surname no Microsoft Entra ID

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

Exemplo:

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

Conversão de maiúsculas e minú

Cenário 1: Você precisa converter texto para maiúsculas e minúsculas, mas manusear apóstrofos corretamente (por exemplo, "hospital de São João" deve se tornar "Hospital de São João").

Atributo alvo: empresa

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

Exemplo:

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

Cenário 2: Você deseja criar um nome de usuário minúsculo a partir do 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 de 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 de 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 e-mail

Geração básica de e-mails

Cenário 1: Você deseja construir um endereço de e-mail juntando nome e sobrenome, removendo espaços e caracteres especiais e anexando um domínio.

Atributo de destino: mail

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

Exemplo:

  • Valores de entrada: [PreferredFirstName] = "María", [PreferredLastName] = "José González"
  • Saída de 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 e-mail.

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 de 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 e-mail específicos da empresa

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

Atributo de destino: mail

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", [Nome] = "John", [Sobrenome] = "Smith"
  • Saída de expressão: john.smith@fabrikam.com
  • Entrada alternativa: [Empresa] = "Woodgrove", [Nome] = "Sarah", [Sobrenome] = "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 de expressão: ["smtp:michael.brown@contoso.mail.onmicrosoft.com", "smtp:michael.brown@contoso.onmicrosoft.com", "SMTP:michael.brown@contoso.com"]

Processamento do número de telefone

Esses mapeamentos de expressão podem ser usados no aplicativo Workday Writeback.

Análise de números de telefone internacionais

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: phoneNumber

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

Exemplo:

  • Valores de entrada: [phoneNumber] = "+1 737-626-8331"
  • Saída de 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: [phoneNumber] = "+44 20 7946 0958"
  • Saída de expressão: GBR
  • Entrada alternativa: [phoneNumber] = "+1 555-123-4567"
  • Saída alternativa: USA

Cenário 3: Você precisa gravar o número de telefone que o Microsoft Teams gera e define no Microsoft Entra ID (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 de regex para extrair códigos de país relevantes para sua organização e usá-lo para definir o Dia CountryCodeNamede Trabalho.

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: [phoneNumber] = "+493012345678"
  • Saída de expressão: GER
  • Entrada alternativa: [phoneNumber] = "+919876543210"
  • Saída alternativa: IND
  • Entrada alternativa: [phoneNumber] = "+15551234567"
  • Saída alternativa: USA

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

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

Atributo de destino: phoneNumber

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

Exemplo:

  • Valores de entrada: [phoneNumber] = "+1 (206) 291-8163 x8125"
  • Saída de 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: [phoneNumber] = "+1 (206) 291-8163 x8125"
  • Saída de expressão: 8125

Lógica de status da conta para o Ative Directory

As expressões nesta seção são aplicáveis ao accountDisabled atributo que faz parte de "Workday to on-premises user user provisioning app". Para definir o accountEnabled atributo que faz parte do "Workday to Microsoft Entra ID user provisioning app", consulte a seção Account Status Logic for Microsoft Entra ID.

Gestão básica do estado da conta

Cenário 1: Você deseja desabilitar contas locais do Ative Directory 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 de expressão: False (conta habilitada)
  • Entrada alternativa: [Ativo] = "0"
  • Saída alternativa: True (conta desativada)

Recontratar 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 ela.

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: [Ative] = "1", [StatusRehire] = "1", [StatusHireDate] = "2025-08-15" (data atual: 2025-07-30)
  • Saída de expressão: True (conta desativada até a data de contratação)
  • Entrada alternativa: [Ative] = "1", [StatusRehire] = "1", [StatusHireDate] = "2025-07-15"
  • Saída alternativa: False (conta ativada à medida que a data de contratação já passou)

Criação de Conta Pré-Contratação

Cenário 1: Você deseja criar contas para futuras contratações, mas mantê-las desativadas 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: [Ative] = "1", [StatusHireDate] = "2025-08-10" (data atual: 2025-07-30)
  • Saída de expressão: False (conta ativada como data de contratação é dentro de 14 dias)
  • Entrada alternativa: [Ativo] = "1", [StatusHireDate] = "2025-09-15"
  • Saída alternativa: True (conta desativada como data de contratação é mais de 14 dias de distância)

Rescindir a contratação de manuseamento

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 Terminated = 1 no dia útil, então accountDisabled = True
  • Se Rescindido = 1 no dia útil, então accountDisabled = True
  • Se Ativo =1 no dia útil, então
    • se
      • HireDate é mais de sete dias no futuro, então accountDisabled = True (desativar a conta)
      • HireDate é <= sete dias no futuro, em seguida, accountDisabled = False (ativar a conta)
  • Se Ative = 0, então 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"
         )
    )
)

Exemplo:

  • Valores de entrada: [Terminated] = "1", [Ative] = "1", [StatusHireDate] = "2025-08-15"
  • Saída de expressão: True (conta desativada devido a rescisão)
  • Entrada alternativa: [terminado] = "0", [rescindido] = "1", [ativo] = "1"
  • Saída alternativa: True (conta desativada devido a rescindir)
  • Entrada alternativa: [Terminado] = "0", [Rescindido] = "0", [Ativo] = "1", [StatusHireDate] = "2025-08-15" (data atual: 2025-07-30)
  • Saída alternativa: (conta desativada, True pois a data de contratação está a mais de 7 dias de distância)
  • Entrada alternativa: [terminado] = "0", [rescindido] = "0", [ativo] = "1", [StatusHireDate] = "2025-08-05"
  • Saída alternativa: False (conta ativada como data de contratação é dentro de 7 dias)

Lógica de status da conta para o Microsoft Entra ID

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 de "Workday to on-premises Ative Directory user provisioning app", consulte a seção Account Status Logic for Ative Directory.

Gestão básica do estado da conta

Cenário 1: Você deseja desabilitar as contas do Microsoft Entra ID 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 de expressão: True (conta habilitada)
  • Entrada alternativa: [Ativo] = "0"
  • Saída alternativa: False (conta desativada)

Recontratar 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 ela.

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: [Ative] = "1", [StatusRehire] = "1", [StatusHireDate] = "2025-08-15" (data atual: 2025-07-30)
  • Saída de expressão: False (conta desativada até a data de contratação)
  • Entrada alternativa: [Ative] = "1", [StatusRehire] = "1", [StatusHireDate] = "2025-07-15"
  • Saída alternativa: True (conta ativada à medida que a data de contratação já passou)

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

Cenário 1: Você deseja criar contas para futuras contratações, mas mantê-las desativadas 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: [Ative] = "1", [StatusHireDate] = "2025-08-10" (data atual: 2025-07-30)
  • Saída de expressão: True (conta ativada como data de contratação é dentro de 14 dias)
  • Entrada alternativa: [Ativo] = "1", [StatusHireDate] = "2025-09-15"
  • Saída alternativa: False (conta desativada como data de contratação é 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 Workday para o formato do Ative Directory para o atributo accountExpires, para 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 de expressão: 133835135990000000 (representação numérica de 2025-12-31T23:59:59-07:00)

Cenário 2: Você deseja definir uma data de expiração 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 de 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 as informações do departamento somente se o funcionário tiver começado a trabalhar (a data de contratação já passou).

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 já passou)
  • 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 de 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: (não crie objeto de usuário, IgnoreObjectFlow pois a data de contratação está a mais de 14 dias de distância)

Atribuição de Unidade Organizacional (UO)

Atribuição simples de UO

Cenário 1: Você deseja colocar os usuários em UOs diferentes 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: [City] = "Seattle"
  • Saída de expressão: OU=Seattle,OU=Users,DC=contoso,DC=com
  • Entrada alternativa: [City] = "Chicago"
  • Saída alternativa: OU=Default,OU=Users,DC=contoso,DC=com (padrão para cidades não especificadas)

Estrutura complexa da UO

Cenário 1: Você precisa criar uma estrutura de UO complexa com base no departamento, centro de custo e 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 de 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ão quando os valores não correspondem)

Atribuição de UO de usuário encerrada

Cenário 1: Você deseja mover os 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", [City] = "Seattle" (data atual: 2025-07-30)
  • Saída de expressão: OU=Leavers,OU=Users,DC=contoso,DC=com (movido para Leavers OU como data de término já passou)
  • Entrada alternativa: [StatusTerminationLastDayOfWork] = "2025-08-15", [City] = "Dallas"
  • Saída alternativa: OU=Dallas,OU=Users,DC=contoso,DC=com (permanece na UO normal como data de término é no futuro)

Geração de ID aleatório

Geração aleatória baseada em GUID

Cenário 1: Você precisa gerar uma cadeia aleatória de 5 caracteres que não contenha 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 para 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 para Base64 contendo sequência alfabética "mVdX"
  • Saída de expressão: DMVDX (ou diferente se a primeira opção for tomada)

Geração de ID numérico

Cenário 1: Você precisa gerar um número aleatório de 4 dígitos a partir 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 de expressão: (ou D1234, D5678, etc., D7890 dependendo de qual sequência de 4 dígitos é correspondida primeiro)

Processamento de nomes

Geração de nomes para exibição

Cenário 1: Você deseja criar um nome de exibição no formato "Último, Primeiro".

Atributo de destino: displayName

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

Exemplo:

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

Cenário 2: Você precisa criar um nome para 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 de expressão: Johnson,Sarah E-12345

Geração de nome comum (NC) 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 de 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 primeiro nome 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 de 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 das listas de endereços

Esta seção descreve como definir o atributo msExchHideFromAddressListsbooleano . Use todas as letras maiúsculas "TRUE" ou "FALSE" para definir o atributo booleano. Usar 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: (ocultar das listas de endereços, TRUE pois 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 de expressão: TRUE (ocultar das listas de endereços como data de contratação é no futuro)
  • Entrada alternativa: [StatusHireDate] = "2025-07-31" (data atual: 2025-08-01)
  • Saída alternativa: FALSE (mostrar nas listas de endereços como 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 Ative 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 de expressão: ["a8cccada-a108-47ae-bf9a-f130499aa4cb", "{26491cfc-9e50-4857-861b-0cb8df22b5d7}"]

Cenários de write-back

Cenário 1: Você deseja reescrever 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 (data de contratação já passou, escreva de volta o nome de usuário)
  • Entrada alternativa: [employeeHireDate] = "2025-08-15", [userPrincipalName] = "future@contoso.com"
  • Saída alternativa: (vazio - ignorado, data de contratação é no futuro)

Melhores práticas

  • 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.

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

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

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

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

Mais recursos