PowerShell: proprietà Get-ADUser con åäö


8

Sto cercando di estrarre determinati gruppi di utenti con Get-ADUser. Gli utenti appartengono a società i cui nomi includono caratteri non ASCII, ad esempio "Gåäördet". Sfortunatamente, dobbiamo usare la proprietà dell'azienda per questo compito e abbiamo anche bisogno che funzioni da uno script.

Di seguito funziona alla grande in una sessione interattiva ma non restituisce dati quando eseguito all'interno di uno script:

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

Le soluzioni alternative che ho trovato funzionano ma non sono abbastanza affidabili (rischia di selezionare oggetti sbagliati):

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

Per ulteriore nota: la codifica dei caratteri potrebbe non essere il problema qui. Come suggerito in un commento, l'ho inserito in una sceneggiatura. Leggi il commento per ogni riga Get-ADUser:

$OutputEncoding = [Console]::OutputEncoding

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

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

Speravo che alcuni di voi potessero offrire una soluzione migliore a questo enigma.


Grazie @RyanRies, purtroppo non sembra essere d'aiuto. Leggi la mia modifica per maggiori informazioni.
Tanel Rebane,

1
Quindi, purtroppo, posso riprodurre questo comportamento con LDP.exe, quindi il nostro problema potrebbe essere a un livello più profondo di Powershell.
Ryan Ries

Invece di -Filter funzionerebbe con -LdapFilter? Esempio: -LdapFilter "(company = $ Company)"
user2320464

@TessellatingHeckler, ancora nessuna corrispondenza su "Gåäördet".
Tanel Rebane,

@ user2320464, LdapFilter non produce neanche corrispondenze.
Tanel Rebane,

Risposte:


7

Grazie a tutto l'aiuto qui sono arrivato al fondo di questo strano comportamento, molto apprezzato!

Viene fuori che l'argomento "-Filter" accetta "åäö" in modo intercambiabile con "aao". Questo non è il funzionamento di PowerShell ma più in basso nello stack (grazie @RyanRies per averlo esaminato). Questo è il motivo per cui il seguente frammento funziona:

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

Si scopre anche che la query non fa distinzione tra maiuscole e minuscole, quindi funziona anche:

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

In realtà, "åäö" funziona anche se si tratta di una query unicode (grazie a @Daniel):

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

Alla fine questo ci lascia con due opzioni:

  • Sostituisci "åäö" con "aao" nelle tue query. L'output sarà identico all'utilizzo di "åäö".
  • Sostituisci "åäö" con unicode (@ joel-coel, grazie per il nudge), ad esempio con uno script.

Ho scelto di andare con la seconda opzione e il risultato è un po 'così:

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

Immagino che sia buono come lo è per ora.


2

Potrei aiutarti con una soluzione alternativa.

Crea un file di testo con codifica Unicode e inserisci il nome dell'azienda. Quindi utilizzare Get-Contentper memorizzare il nome della società in una variabile.

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

Ho provato con il testo cinese (中國 哲學 書 電子 化 計劃) e ha funzionato sul mio server.


Grazie @Daniel, quella soluzione ha davvero funzionato. Tuttavia, è seriamente sporco. Vediamo se anche qualcun altro ha qualche input.
Tanel Rebane,

Si lo so. Spero che qualcuno abbia ricevuto una risposta adeguata al tuo problema di preghiera. :)
Daniel,

@TessellatingHeckler, quando fai i test, quali caratteri non ASCII stai cercando di abbinare?
Tanel Rebane,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.