web-dev-qa-db-ja.com

PowerShell:åäöを使用したGet-ADUserプロパティ

Get-ADUserを使用して、選択したユーザーのセットを抽出しようとしています。ユーザーは、名前に非ASCII文字が含まれている会社に属しています。 「Gåäördet」。残念ながら、このタスクには会社のプロパティを使用する必要があり、スクリプトから作業するためにも必要です。

以下は、対話型セッションでうまく機能しますが、スクリプト内で実行されたときにデータを返しません。

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

回避策は見つかりましたが、信頼性が十分ではありません(間違ったオブジェクトを選択するリスク)。

# Work-around 1:
$Company = "Gaaordet" # Replace åäö with aao in the variable
Get-ADUser -Filter "company -eq '$Company'" # Matches the company "Gåäördet", but why?

...または...

# Work-around 2: 
$Company = "G...rdets" # Use regex for åäö
Get-ADUser -Filter * -Properties Company | ? Company -match "$Company"

追記:文字エンコーディングはここでは問題にならないかもしれません。コメントで示唆されているように、私はこれをスクリプトの中に入れました。各Get-ADUser行のコメントを読みます。

$OutputEncoding = [Console]::OutputEncoding

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

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

私はあなたの何人かがこの難問にもっと良い解決策を提供できることを望んでいました。

8
Tanel Rebane

ここでのすべての助けのおかげで、私はこの奇妙な行動の底にたどり着きました。

「-Filter」引数は「åäö」を「aao」と交換可能に受け入れます。これはPowerShellの動作ではなく、スタックのさらに下にあります(@RyanRiesを調べてくれてありがとう)これが、次のスニペットが機能する理由です。

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

また、クエリでは大文字と小文字が区別されないため、これも機能します。

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

実際、 "åäö"は、Unicodeクエリである限り機能します(@Danielに感謝します)。

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

最後に、これにより2つのオプションが残ります。

  • クエリの「åäö」を「aao」に置き換えます。出力は "åäö"を使用した場合と同じになります。
  • "åäö"をユニコード(@ joel-coel、ナッジに感謝)に置き換えます。スクリプトで。

私は2番目のオプションを選択し、結果は次のようになります。

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

今のところそれでいいと思います。

7
Tanel Rebane

回避策をご案内します。

Unicodeでエンコードされたテキストファイルを作成し、会社名を挿入します。次に、Get-Contentを使用して、会社名を変数に格納します。

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

私は中国語のテキスト(中國哲學書電子化計鵺)でテストしましたが、私のサーバーで動作しました。

2
Daniel

コードポイントサロゲートを介して名前を作成してみてください。

https://stackoverflow.com/questions/4834291/how-to-encode-32-bit-unicode-characters-in-a-powershell-string-literal

それほど良い方法ではありませんが、少なくともスクリプト全体をソースファイル内に含めることができます。

1
Joel Coel