
Итак, когда я запускаю эту команду:
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