Поэтому, когда я запускаю эту команду:

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. Я хотел бы, чтобы результаты были:

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

Я пытался сделать это с помощью фильтра, но не повезло. Может быть, мне нужно разбить команду и дополнить ее большим количеством кода, чтобы разбить DistinguishedName. Я чувствую, что есть простое решение для этого, и я делаю это более сложным. Есть мысли или идеи?

2 ответа2

0

Фильтр не анализирует строки, он возвращает только те данные, которые вы запрашивали. Если вы извлекаете 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]

... используя или (трубу между двумя пролитыми жалами) в шпагат. Это также регулярное выражение, которое работает с .split

0

Нашел хороший ответ здесь. Get-ADUser в этот оператор Select-Object :

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

Выход:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .