PowerShell: Propiedades de Get-ADUser con åäö


8

Estoy tratando de extraer conjuntos seleccionados de usuarios con Get-ADUser. Los usuarios pertenecen a empresas cuyos nombres incluyen caracteres no ASCII, por ejemplo, "Gåäördet". Desafortunadamente, tenemos que usar la propiedad de la compañía 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 una nota adicional: la codificación de caracteres podría no ser el problema aquí. Como se sugirió en un comentario, puse esto dentro de un script. Lea el comentario para 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.


Gracias @RyanRies, desafortunadamente no pareció ayudar. Lea mi edición para más información.
Tanel Rebane

1
Por lo tanto, puedo (desafortunadamente) reproducir este comportamiento con LDP.exe, por lo que nuestro problema puede estar en un nivel más profundo que Powershell.
Ryan Ries

En lugar de -Filter, ¿usaría -LdapFilter? Ejemplo: -LdapFilter "(compañía = $ Compañía)"
usuario2320464

@TessellatingHeckler, todavía no hay coincidencias en "Gåäördet".
Tanel Rebane

@ user2320464, LdapFilter tampoco produce coincidencias.
Tanel Rebane

Respuestas:


7

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

Resulta que el argumento "-Filtro" acepta "åäö" indistintamente con "aao". No se trata de PowerShell, sino más abajo (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 "åäö" con "aao" en sus consultas. La salida será idéntica al uso de "åäö".
  • Reemplace "åäö" con unicode (@ joel-coel, gracias por el empujón), por ejemplo, con un script.

Elegí ir con 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 es tan bueno como parece por ahora.


2

Podría ayudarte con una solución alternativa.

Cree un archivo de texto codificado Unicode e inserte el nombre de la empresa. Luego, use 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 en chino (中國 哲學 書 電子 化 計劃) y funcionó en mi servidor.


Gracias @Daniel, esa solución sí funcionó. Sin embargo, está muy sucio. Veamos si alguien más tiene alguna entrada también.
Tanel Rebane

Si lo se. Espero que alguien haya recibido una respuesta adecuada a su problema de oración. :)
Daniel

@TessellatingHeckler, cuando haces tus pruebas, ¿qué caracteres no ASCII estás tratando de hacer coincidir?
Tanel Rebane

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.