PowerShell: Get-ADUser-Eigenschaften mit åäö


8

Ich versuche, ausgewählte Benutzergruppen mit Get-ADUser zu extrahieren. Die Benutzer gehören Unternehmen an, deren Namen Nicht-ASCII-Zeichen enthalten, z. B. "Gåäördet". Leider müssen wir die Firmeneigenschaft für diese Aufgabe verwenden und sie auch für die Arbeit mit einem Skript verwenden.

Folgendes funktioniert in einer interaktiven Sitzung hervorragend, gibt jedoch keine Daten zurück, wenn es in einem Skript ausgeführt wird:

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

Die Problemumgehungen, die ich gefunden habe, sind jedoch nicht zuverlässig genug (es besteht die Gefahr, 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"

Für zusätzlichen 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, einige von Ihnen könnten eine bessere Lösung für dieses Rätsel anbieten.


Danke @RyanRies, leider schien es nicht zu helfen. Lesen Sie meine Bearbeitung für weitere Informationen.
Tanel Rebane

1
Daher kann ich dieses Verhalten (leider) mit LDP.exe reproduzieren, sodass unser Problem möglicherweise tiefer liegt als Powershell.
Ryan Ries

Würde anstelle von -Filter -LdapFilter funktionieren? Beispiel: -LdapFilter "(company = $ Company)"
user2320464

@TessellatingHeckler, noch keine Übereinstimmungen auf "Gåäördet".
Tanel Rebane

@ user2320464, LdapFilter erzeugt auch keine Übereinstimmungen.
Tanel Rebane

Antworten:


7

Dank all der Hilfe hier bin ich diesem seltsamen Verhalten auf den Grund gegangen, sehr geschätzt!

Es stellt sich heraus, dass das Argument "-Filter" "åäö" austauschbar mit "aao" akzeptiert. Dies ist nicht die Aufgabe von PowerShell, sondern weiter unten im Stapel (danke @RyanRies für die Prüfung). Aus diesem Grund funktioniert das folgende Snippet:

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

Es stellt sich auch heraus, dass bei der Abfrage nicht zwischen Groß- und Kleinschreibung unterschieden wird. Dies funktioniert also auch:

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

Eigentlich 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 "åäö"

Am Ende haben wir zwei Möglichkeiten:

  • Ersetzen Sie "åäö" in Ihren Abfragen durch "aao". Die Ausgabe ist identisch mit "åäö".
  • Ersetzen Sie "åäö" durch Unicode (@ joel-coel, danke für den Anstoß), z. B. 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 denke, das ist so gut wie es jetzt geht.


2

Ich könnte Ihnen bei einer Problemumgehung helfen.

Erstellen Sie eine Unicode-codierte Textdatei und geben Sie den Firmennamen ein. Verwenden Sie 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.


Vielen Dank an Daniel, diese Problemumgehung hat tatsächlich funktioniert. Es ist jedoch ernsthaft schmutzig. Mal sehen, ob jemand anderes auch einen Input hat.
Tanel Rebane

Ja ich weiß. Ich hoffe, jemand hat eine richtige Antwort auf Ihr Gebetsproblem bekommen. :)
Daniel

@TessellatingHeckler, welche Nicht-ASCII-Zeichen möchten Sie bei Ihren Tests abgleichen?
Tanel Rebane

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.