
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-Content
para 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:
No es mucho mejor, pero al menos te permite contener el script completo dentro del archivo fuente.