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.