Powershell Regex, чтобы соответствовать всему после первого появления строки - PullRequest
0 голосов
/ 12 сентября 2018

Итак, у меня есть скрипт в Powershell, этот скрипт загружает список пользователей из AD и затем экспортирует его в файл CSV. Код выглядит следующим образом:

$AllADUsers | Select-Object @{Label = "First Name";Expression = {$_.GivenName}},
@{Label = "Last Name";Expression = {$_.Surname}},
@{Label = "Password Last Set";Expression = {"Password last set: "+$_.passwordlastset}},
@{Label = "Expiration date";Expression = {"Expires on: "+[datetime]::fromfiletime($_.accountexpires[0])}}, 
@{Label = "OU";Expression = {$_.DistinguishedName}} |
 Export-Csv -Path $csvfile -Encoding "UTF8"  -NoTypeInformation

Что мне нужно сделать здесь, в DistinguishedName , например:

CN = Тест, НУ = Тест, OU = Тест, OU = Тест, НУ = Тест DC = Тест DC = Тест

Удалить все с CN до первой запятой и оставить только

OU = Test, OU = Test, OU = Test, OU = Test, DC = Test, DC = Test

Я пытался использовать регулярное выражение, но я не могу понять, как сопоставить только первое вхождение , OU = и сохранить все, что после него. Мне удалось сделать это, но он продолжает удалять OU, и поэтому для этого мне нужно было бы добавить строку «OU =» перед всеми DistinguishedNames, но это не может быть сделано без цикла, и я не могу создать петля внутри Select-Object Я также пытался удалить весь текст из DistinguishedName до Select-Object, но тогда я не смог бы использовать Index внутри Select-Object для предоставления правильного DistinguishedName для текущего пользователя.

Так что мне нужен Regex, который сохраняет все после первого OU = и сохраняет это OU = , не удаляя его.

Спасибо

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Вы можете сделать это с помощью простого регулярного выражения:

@($_.DistinguishedName -split '(?<!\\),',2)[1]

Шаблон регулярного выражения может быть разбит на:RDN содержит запятую, которая в противном случае была бы разделена (представьте CN=Doe\, John,OU=SomeOrgUnit,DC=domain,DC=tld)

0 голосов
/ 12 сентября 2018

Вы действительно спрашиваете о разборе отличительных имен, которые на самом деле не являются простыми строками из-за определенных символов, которые требуют экранирования.

Ваш вопрос действительно: «Как мне удалить лист и получить только родительскую часть отличительного имени?»

Для этого вы можете использовать интерфейс IADsPathname, предоставляемый Windows. Этот интерфейс предоставляется сценариям через Pathname COM-объект.

Некоторое время назад я написал модуль PowerShell , который предоставляет интерфейс командлета для объекта Pathname, который облегчает вызов. В вашем случае вы можете использовать командлет Get-ADName и просто написать:

Get-ADName "CN=Test,OU=Test,OU=Test,OU=Test,OU=Test,DC=Test,DC=Test" -Format Parent

Эта команда производит вывод:

OU=Test,OU=Test,OU=Test,OU=Test,DC=Test,DC=Test

В качестве расчетного свойства в вашем сценарии вы можете просто добавить следующее:

@{Label = "OU"; Expression = {Get-ADName $_.DistinguishedName -Format Parent}}

Командлет сценария Get-ADName довольно удобен и экономит много работы при разборе строк отличительных имен.

(Кроме того, модуль также имеет командлет сценария Convert-ADName, который реализует COM-объект NameTranslate, который позволяет преобразовывать имена объектов между различными форматами.)

Я считаю, что командлеты сценариев Get-ADName и Convert-ADName практически необходимы в самых разных сценариях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...