PowerShell: Propriedades de Get-ADUser com åäö


8

Estou tentando extrair conjuntos de usuários selecionados com Get-ADUser. Os usuários pertencem a empresas cujos nomes incluem caracteres não ASCII, por exemplo "Gåäördet". Infelizmente, precisamos usar a propriedade da empresa para esta tarefa e também precisamos que ela funcione a partir de um script.

O seguinte funciona muito bem em uma sessão interativa, mas não retorna dados quando executado em um script:

$Company = "Gåäördet"
Get-ADUser -Filter "company -eq '$Company'"

As soluções alternativas que encontrei funcionam, mas não são confiáveis ​​o suficiente (corre o risco de selecionar objetos errados):

# Work-around 1:
$Company = "Gaaordet" # Replace åäö with aao in the variable
Get-ADUser -Filter "company -eq '$Company'" # Matches the company "Gåäördet", but why?

...ou...

# Work-around 2: 
$Company = "G...rdets" # Use regex for åäö
Get-ADUser -Filter * -Properties Company | ? Company -match "$Company"

Para observação adicional: a codificação de caracteres pode não ser o problema aqui. Como sugerido em um comentário, coloquei isso em um script. Leia o comentário para cada linha Get-ADUser:

$OutputEncoding = [Console]::OutputEncoding

$Company = "aao"
Get-ADUser -Filter "company -eq '$Company'" # Matches company "åäö"

$Company = "åäö"
Get-ADUser -Filter "company -eq '$Company'" # No matches

Eu esperava que alguns de vocês pudessem oferecer uma solução melhor para esse enigma.


Obrigado @RyanRies, infelizmente não pareceu ajudar. Leia minha edição para mais informações.
Tanel Rebane

1
Para que eu possa (infelizmente) reproduzir esse comportamento com o LDP.exe, nosso problema pode estar em um nível mais profundo do que o PowerShell.
Ryan Ries

Em vez de -Filter, usar -LdapFilter funcionaria? Exemplo: -LdapFilter "(company = $ Company)"
user2320464

@TessellatingHeckler, ainda não há resultados no "Gåäördet".
Tanel Rebane

@ user2320464, o LdapFilter também não produz correspondências.
Tanel Rebane

Respostas:


7

Graças a toda a ajuda aqui, cheguei ao fundo desse comportamento estranho, muito apreciado!

Acontece que o argumento "-Filter" aceita "åäö" de forma intercambiável com "aao". Isso não é obra do PowerShell, mas mais abaixo da pilha (obrigado @RyanRies por investigá-la). Essa é a razão pela qual o seguinte snippet funciona:

$Company = "aao"
Get-ADUser -Filter "company -eq '$Company'" # Matches company "åäö"

Acontece também que a consulta não diferencia maiúsculas de minúsculas, portanto, isso também funciona:

$Company = "AaO"
Get-ADUser -Filter "company -eq '$Company'" # Matches company "åäö"

Na verdade, "åäö" funciona muito desde que seja uma consulta unicode (obrigado @Daniel):

$Company = "$([char]0x00E4)$([char]0x00E5)$([char]0x00F6)" # "åäö"
Get-ADUser -Filter "company -eq '$Company'" # Matches company "åäö"

No final, isso nos deixa com duas opções:

  • Substitua "åäö" por "aao" em suas consultas. A saída será idêntica ao uso de "åäö".
  • Substitua "åäö" por unicode (@ joel-coel, obrigado pela cutucada), por exemplo, por um script.

Eu escolhi ir com a segunda opção e o resultado se parece um pouco com isso:

function UniReplace($n){
    [char][int]"0x$n"
}

$Company = "åäö"
$Company = $Company -Replace 'ä',"$(UniReplace E4)"
$Company = $Company -Replace 'Ä',"$(UniReplace C4)"
$Company = $Company -Replace 'å',"$(UniReplace E5)"
$Company = $Company -Replace 'Å',"$(UniReplace C5)"
$Company = $Company -Replace 'ö',"$(UniReplace F6)"
$Company = $Company -Replace 'Ö',"$(UniReplace D6)"

echo "This is the content of string `$Company: $Company"
Get-ADUser -Filter "company -eq '$Company'"

Eu acho que é tão bom quanto agora.


2

Eu posso ajudá-lo com uma solução alternativa.

Crie um arquivo de texto codificado em Unicode e insira o nome da empresa. Em seguida, use Get-Contentpara armazenar o nome da empresa em uma variável.

$companyName = Get-Content .\companyName-unicode.txt
Get-ADUser -Filter { company -eq $companyName }

Eu testei com texto em chinês (中國 哲學 書 電子 化 計劃) e funcionou no meu servidor.


Obrigado @Daniel, essa solução realmente funcionou. No entanto, está seriamente sujo. Vamos ver se mais alguém também tem alguma entrada.
Tanel Rebane

Sim, eu sei. Espero que alguém tenha uma resposta adequada para o seu problema de oração. :)
Daniel

@TessellatingHeckler, ao fazer seus testes, com quais caracteres não ASCII você está tentando corresponder?
Tanel Rebane

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.