
Estou tentando extrair conjuntos selecionados de usuários com Get-ADUser. Os usuários pertencem a empresas cujos nomes incluem caracteres não-ASCII, por exemplo, "Gåäördet". Infelizmente, temos que 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 dentro de 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.
Responder1
Graças a toda a ajuda aqui cheguei ao fundo deste comportamento estranho, muito apreciado!
Acontece que o argumento "-Filter" aceita "åäö" alternadamente com "aao". Isso não é obra do PowerShell, mas mais abaixo na pilha (obrigado @RyanRies por investigar isso). Essa é a razão pela qual o seguinte trecho 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, então isso também funciona:
$Company = "AaO"
Get-ADUser -Filter "company -eq '$Company'" # Matches company "åäö"
Na verdade, "åäö" também funciona, 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" nas suas consultas. A saída será idêntica ao uso de "åäö".
- Substitua "åäö" por unicode (@joel-coel, obrigado pela cutucada), por exemplo, com um script.
Optei pela segunda opção e o resultado é mais ou menos assim:
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'"
Acho que isso é o melhor que pode acontecer por enquanto.
Responder2
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-Content
para armazenar o nome da empresa em uma variável.
$companyName = Get-Content .\companyName-unicode.txt
Get-ADUser -Filter { company -eq $companyName }
Testei com texto em chinês (中國哲學書電子化計劃) e funcionou no meu servidor.
Responder3
Você pode tentar construir os nomes por meio de substitutos de pontos de código:
Não é muito melhor, mas pelo menos permite conter o script inteiro no arquivo de origem.