PowerShell: Propiedades Get-ADUser con åäö

PowerShell: Propiedades Get-ADUser con åäö

Estoy intentando extraer conjuntos seleccionados de usuarios con Get-ADUser. Los usuarios pertenecen a empresas cuyos nombres incluyen caracteres no ASCII, p. ej. "Gåäördet". Desafortunadamente, tenemos que usar la propiedad de la empresa para esta tarea y también necesitamos que funcione desde un script.

Lo siguiente funciona muy bien en una sesión interactiva pero no devuelve datos cuando se ejecuta dentro de un script:

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

Las soluciones que he encontrado funcionan pero no son lo suficientemente confiables (se corre el riesgo de seleccionar objetos incorrectos):

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

...o...

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

Para obtener una nota adicional: es posible que la codificación de caracteres no sea el problema aquí. Como se sugiere en un comentario, puse esto dentro de un script. Lea el comentario de cada línea Get-ADUser:

$OutputEncoding = [Console]::OutputEncoding

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

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

Esperaba que algunos de ustedes pudieran ofrecer una mejor solución a este enigma.

Respuesta1

Gracias a toda la ayuda aquí llegué al fondo de este extraño comportamiento, ¡muy apreciado!

Resulta que el argumento "-Filter" acepta "åäö" indistintamente con "aao". Esto no es obra de PowerShell, sino más abajo en la pila (gracias @RyanRies por investigarlo). Esa es la razón por la que funciona el siguiente fragmento:

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

También resulta que la consulta no distingue entre mayúsculas y minúsculas, por lo que esto también funciona:

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

En realidad, "åäö" también funciona siempre que sea una consulta Unicode (gracias @Daniel):

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

Al final esto nos deja con dos opciones:

  • Reemplace "åäö" por "aao" en sus consultas. El resultado será idéntico al uso de "åäö".
  • Reemplace "åäö" con Unicode (@joel-coel, gracias por el empujón), por ejemplo, con un script.

Elegí la segunda opción y el resultado se parece un poco a esto:

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'"

Supongo que eso es lo mejor que hay por ahora.

Respuesta2

Podría ayudarte con una solución alternativa.

Cree un archivo de texto codificado Unicode e inserte el nombre de la empresa. Luego utilícelo Get-Contentpara almacenar el nombre de la empresa en una variable.

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

Lo probé con texto chino (中國哲學書電子化計劃) y funcionó en mi servidor.

Respuesta3

Puede intentar crear los nombres mediante sustitutos de puntos de código:

https://stackoverflow.com/questions/4834291/how-to-encode-32-bit-unicode-characters-in-a-powershell-string-literal

No es mucho mejor, pero al menos te permite contener el script completo dentro del archivo fuente.

información relacionada