Powershell-Filterung oder Auswahl bestimmter Objekte

Powershell-Filterung oder Auswahl bestimmter Objekte

Wenn ich also diesen Befehl ausführe:

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

Ich erhalte folgende Ergebnisse:

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

Ich möchte den DistinguishedName filtern, um nur die erste OU bereitzustellen. Ich sollte hinzufügen, dass ich nicht erwarte, dass „Dienstkonten“ das einzige Element im OU-Feld ist. Ich hätte gerne folgende Ergebnisse:

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

Ich habe versucht, daraus mithilfe von Filter einen Einzeiler zu machen, aber ohne Erfolg. Vielleicht muss ich den Befehl aufteilen und ihn in mehr Code ausarbeiten, um DistinguishedName aufzuteilen. Ich denke, es gibt eine einfache Lösung dafür, und ich mache es komplizierter. Irgendwelche Gedanken oder Ideen?

Antwort1

Habe eine nette Antwort gefundenHier. Pipe Get-ADUserzu dieser Select-ObjectAnweisung:

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

Die Ausgabe ist:

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

Antwort2

Der Filter analysiert keine Zeichenfolgen, sondern gibt nur die Daten zurück, die Sie angefordert haben. Wenn Sie DN, Gruppenzeichenfolgen oder Arrays abrufen, also alles, was keine einzelne Zeichenfolge ist, müssen Sie es selbst analysieren, entweder mithilfe von Teilzeichenfolgen oder regulären Ausdrücken.

Hier ist eine Option mit Regex und Split

# 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

Verwendung des obigen Ansatzes mit einer berechneten Eigenschaft

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

Oder dies als berechnete Eigenschaft ...

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

... mit einem oder (der Pipe zwischen den beiden geteilten Zeichenketten) in der Teilung. Es ist auch eine Regex-Sache, die mit .split funktioniert.

verwandte Informationen