Powershell のフィルタリングまたは特定のオブジェクトの選択

Powershell のフィルタリングまたは特定のオブジェクトの選択

したがって、このコマンドを実行すると:

Get-ADUser -Filter 'Name -like "*svc*"' | select Name, DistinguishedName

次のような結果が得られます。

SamAccountName       DistinguishedName
--------------       -----------------
svc_myaccount        CN=svc_myaccount,OU=Service Accounts,OU=me3,OU=me2,DC=me,DC=com

DistinguishedName をフィルターして、最初の OU のみを提供するようにしたいと思います。OU フィールドの項目が「サービス アカウント」のみになることは想定していないことを付け加えておきます。結果は次のようになります。

SamAccountName       DistinguishedName
--------------       -----------------
svc_myaccount        OU=Service Accounts

Filter を使用してこれをワンライナーにしようとしましたが、うまくいきませんでした。コマンドを分割して、DistinguishedName を分割するコードを増やす必要があるかもしれません。これには簡単な解決策があるような気がしますが、私は複雑にしています。何かご意見やアイデアはありますか?

答え1

いい答えが見つかりましたここ.Get-ADUserこのSelect-Objectステートメントにパイプします:

select Name,@{l='DistinguishedName';e={$_.DistinguishedName.split(',')[1].split('=')[1]}}

出力は次のようになります。

Name              DistinguishedName
----              -----------------
svc_myaccount     Service Accounts

答え2

フィルターは文字列を解析せず、要求したデータのみを返します。DN、グループ文字列、配列など、単一の文字列ではないものを取得する場合は、部分文字列または正規表現を使用して自分で解析する必要があります。

正規表現と分割を使用した1つのオプションは次のとおりです

# Parse the DN for the OU array list
Remove the CN and split
('CN=svc_myaccount,OU=Service Accounts,OU=me3,OU=me2,DC=me,DC=com' -replace 'CN=[^=]*,') -split(',')

# Results

OU=Service Accounts
OU=me3
OU=me2
DC=me
DC=com

#Get just the first element of the above array - arrays are zero based
(('CN=svc_myaccount,OU=Service Accounts,OU=me3,OU=me2,DC=me,DC=com' -replace 'CN=[^=]*,') -split(','))[0]

#Results

OU=Service Accounts

上記のアプローチを計算プロパティで使用する

# Pulling live from ADDS
Get-ADUser -Filter 'Name -like "*svc*"' | 
Select-Object -Property Name, 
@{Name='DistinguishedName';Expression = { (($_.DistinguishedName -replace 'CN=[^=]*,') -split(','))[0]}}

または、これを計算されたプロパティとして...

 ('CN=svc_myaccount,OU=Service Accounts,OU=me3,OU=me2,DC=me,DC=com').split(',|=')[3]

... 分割時に or (2 つの分割された文字列間のパイプ) を使用します。これは .split でも機能する正規表現です。

関連情報