PowerShell: Get-ADUser Properties と åäö

PowerShell: Get-ADUser Properties と åäö

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

皆さんの中に、この難問に対するより良い解決策を提案してくれる人がいることを期待していました。

答え1

ここでの助けのおかげで、この奇妙な動作の原因を突き止めることができました。本当に感謝しています!

結局、「-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」に置き換えます。出力は「åäö」を使用した場合と同じになります。
  • 「åäö」を Unicode に置き換えます (@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'"

今のところはこれで十分だと思います。

答え2

回避策をお手伝いできるかもしれません。

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

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

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

答え3

コード ポイント サロゲートを使用して名前を構築してみることもできます。

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

あまり改善されていませんが、少なくともソース ファイル内にスクリプト全体を含めることができます。

関連情報