Фильтрация или выбор определенных объектов в 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. Я должен добавить, что я не ожидаю, что "Service Accounts" будет единственным элементом в поле 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, или групповые строки, или массивы, что угодно, что не является одной строкой, то вам нужно разобрать это самостоятельно, используя подстроку или регулярное выражение

Вот один из вариантов с использованием регулярных выражений и разделения

# 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 (трубу между двумя разделенными строками) в split. Это тоже regex, который работает с .split

Связанный контент