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


8

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

以下は、インタラクティブセッションでうまく機能しますが、スクリプト内で実行してもデータは返されません。

$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

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


@RyanRiesに感謝します。残念ながら役に立たなかったようです。詳細については、編集内容をお読みください。
Tanel Rebane、2015年

1
(残念ながら)LDP.exeでこの動作を再現できるので、問題はPowershellよりも深い可能性があります。
ライアンリース

-Filterの代わりに-LdapFilterを使用できますか?例:-LdapFilter "(company = $ Company)"
user2320464

@TessellatingHeckler、「Gåäördet」にはまだ一致しません。
Tanel Rebane、2015年

@ user2320464、LdapFilterも一致を生成しません。
Tanel Rebane、2015年

回答:


7

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

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

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


2

回避策をご案内します。

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

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

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


@Danielに感謝します。その回避策は実際に機能しました。しかし、本気で汚い。他の誰かが何らかの入力を持っている場合も見てみましょう。
Tanel Rebane、2015年

ええ、私は知っています。私は誰かがあなたの祈り-え--問題に適切な答えを得たことを望みます。:)
ダニエル

@TessellatingHeckler、テストを行うとき、どの非ASCII文字を照合しようとしていますか?
Tanel Rebane、2015年

1

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

/programming/4834291/how-to-encode-32-bit-unicode-characters-in-a-powershell-string-literal

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


これは非常に役に立ちました。私は今、この問題についての記事を書いています。
Tanel Rebane、2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.