
Ich versuche, ausgewählte Benutzergruppen mit Get-ADUser zu extrahieren. Die Benutzer gehören zu Unternehmen, deren Namen Nicht-ASCII-Zeichen enthalten, z. B. „Gåäördet“. Leider müssen wir für diese Aufgabe die Unternehmenseigenschaft verwenden und wir benötigen sie auch, um mit einem Skript zu arbeiten.
Folgendes funktioniert in einer interaktiven Sitzung einwandfrei, gibt aber keine Daten zurück, wenn es in einem Skript ausgeführt wird:
$Company = "Gåäördet"
Get-ADUser -Filter "company -eq '$Company'"
Die von mir gefundenen Workarounds funktionieren, sind aber nicht zuverlässig genug (es besteht das Risiko, dass falsche Objekte ausgewählt werden):
# Work-around 1:
$Company = "Gaaordet" # Replace åäö with aao in the variable
Get-ADUser -Filter "company -eq '$Company'" # Matches the company "Gåäördet", but why?
...oder...
# Work-around 2:
$Company = "G...rdets" # Use regex for åäö
Get-ADUser -Filter * -Properties Company | ? Company -match "$Company"
Als zusätzlicher Hinweis: Die Zeichenkodierung ist hier möglicherweise nicht das Problem. Wie in einem Kommentar vorgeschlagen, habe ich dies in ein Skript eingefügt. Lesen Sie den Kommentar für jede Get-ADUser-Zeile:
$OutputEncoding = [Console]::OutputEncoding
$Company = "aao"
Get-ADUser -Filter "company -eq '$Company'" # Matches company "åäö"
$Company = "åäö"
Get-ADUser -Filter "company -eq '$Company'" # No matches
Ich hatte gehofft, dass einige von Ihnen eine bessere Lösung für dieses Rätsel anbieten könnten.
Antwort1
Dank der Hilfe aller hier bin ich diesem seltsamen Verhalten auf den Grund gegangen, das weiß ich sehr zu schätzen!
Es stellt sich heraus, dass das Argument „-Filter“ sowohl „åäö“ als auch „aao“ akzeptiert. Dies ist nicht das Werk von PowerShell, sondern weiter unten im Stapel (danke @RyanRies für die Untersuchung). Aus diesem Grund funktioniert der folgende Codeausschnitt:
$Company = "aao"
Get-ADUser -Filter "company -eq '$Company'" # Matches company "åäö"
Außerdem hat sich herausgestellt, dass die Abfrage nicht zwischen Groß- und Kleinschreibung unterscheidet, sodass Folgendes auch funktioniert:
$Company = "AaO"
Get-ADUser -Filter "company -eq '$Company'" # Matches company "åäö"
Tatsächlich funktioniert „åäö“ auch, solange es sich um eine Unicode-Abfrage handelt (danke @Daniel):
$Company = "$([char]0x00E4)$([char]0x00E5)$([char]0x00F6)" # "åäö"
Get-ADUser -Filter "company -eq '$Company'" # Matches company "åäö"
Letztendlich bleiben uns zwei Möglichkeiten:
- Ersetzen Sie in Ihren Abfragen "åäö" durch "aao". Die Ausgabe ist identisch zur Verwendung von "åäö".
- Ersetzen Sie „åäö“ durch Unicode (@joel-coel, danke für den Hinweis), zB durch ein Skript.
Ich habe mich für die zweite Option entschieden und das Ergebnis sieht ungefähr so aus:
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'"
Ich schätze, besser geht es im Moment nicht.
Antwort2
Ich kann Ihnen möglicherweise mit einer Problemumgehung helfen.
Erstellen Sie eine Unicode-kodierte Textdatei und fügen Sie den Firmennamen ein. Verwenden Sie diese Datei dann, Get-Content
um den Firmennamen in einer Variablen zu speichern.
$companyName = Get-Content .\companyName-unicode.txt
Get-ADUser -Filter { company -eq $companyName }
Ich habe es mit chinesischem Text (中國哲學書電子化計劃) getestet und es hat auf meinem Server funktioniert.
Antwort3
Sie können versuchen, die Namen mithilfe von Codepunkt-Surrogaten zu erstellen:
Es ist nicht viel besser, aber es ermöglicht Ihnen zumindest, das gesamte Skript in der Quelldatei einzuschließen.