Регулярное выражение Powershell для получения DC от Distinguished Name - PullRequest
0 голосов
/ 17 декабря 2018

Я пытаюсь получить первое DC, которое появляется для данного отличительного имени, как показано ниже:

CN=blah1,CN=Computers,DC=blah2,DC=blah3

Так что на простом английском я хочу "заменить все строки, вплоть до" DC ='и вернуть любое значение от DC= и до следующего ,

Я пытался отработать его с помощью онлайн-калькуляторов, но почему-то не работает.

Ответы [ 4 ]

0 голосов
/ 19 декабря 2018

Я думаю, что лучший (под «лучшим», я имею в виду «самый надежный») ответ - это не выполнять синтаксический анализ строк или регулярное выражение в первую очередь и использовать интерфейс IADSPathname для извлечения частиимя, которое вас интересует. Это доступно (хотя изначально несколько сложно) в PowerShell через COM-объект Pathname .Объект Pathname автоматически обрабатывает все экранированные символы.

Пример:

$ADS_SETTYPE_DN = 4
$ADS_DISPLAY_VALUE_ONLY = 2

$Pathname = New-Object -ComObject Pathname

$distinguishedName = "CN=blah1,CN=Computers,DC=blah2,DC=blah3"

# Set the AD path in the object
$Pathname.GetType().InvokeMember("Set", "InvokeMethod", $null, $Pathname, @($distinguishedName,$ADS_SETTYPE_DN))

# Get the number of name elements
$numElements = $Pathname.GetType().InvokeMember("GetNumElements", "InvokeMethod", $null, $Pathname, $null)

# Retrieve the second-to-last name element (outputs "DC=blah2")
$Pathname.GetType().InvokeMember("GetElement", "InvokeMethod", $null, $Pathname, $numElements - 2)

# Set the display type to values only
$Pathname.GetType().InvokeMember("SetDisplayType", "InvokeMethod", $null, $Pathname, $ADS_DISPLAY_VALUE_ONLY)

# Retrieve the second-to-last name element (outputs "blah2")
$Pathname.GetType().InvokeMember("GetElement", "InvokeMethod", $null, $Pathname, $numElements - 2)

По общему признанию, COM-объект Pathname не прост в использовании.в PowerShell, потому что вы должны вызывать его косвенно.Это можно несколько облегчить, используя функцию-обертку для вызова методов объекта.Пример:

$ADS_SETTYPE_DN = 4
$ADS_DISPLAY_VALUE_ONLY = 2

$Pathname = New-Object -ComObject Pathname

function Invoke-Method {
  param(
    [__ComObject] $object,
    [String] $method,
    $parameters
  )
  $output = $object.GetType().InvokeMember($method, "InvokeMethod", $null, $object, $parameters)
  if ( $output ) { $output }
}

$distinguishedName = "CN=blah1,CN=Computers,DC=blah2,DC=blah3"

# Set the AD path in the object
Invoke-Method $Pathname "Set" @($distinguishedName,$ADS_SETTYPE_DN)

# Get the number of name elements
$numElements = Invoke-Method $Pathname "GetNumElements"

# Retrieve the second-to-last name element (outputs "DC=blah2")
Invoke-Method $Pathname "GetElement" ($numElements - 2)

# Set the display type to values only
Invoke-Method $Pathname "SetDisplayType" $ADS_DISPLAY_VALUE_ONLY

# Retrieve the second-to-last name element (outputs "blah2")
Invoke-Method $Pathname "GetElement" ($numElements - 2)

Для полного решения я написал модуль PowerShell под названием ADName , который предоставляет простой в использовании интерфейс как для Pathname , так и для NameTranslate объектов.

В модуле ADName командлет Get-ADName представляет собой оболочку для объекта Pathname и Convert-ADNameКомандлет - это оболочка для объекта NameTranslate .Пример:

# Get elements of name as an array
$nameElements = Get-ADName "CN=blah1,CN=Computers,DC=blah2,DC=blah3" -Split
# Output second-to-last element (e.g., "DC=blah2")
$nameElements[-2]

# Get name elements (values only)
$nameElements = Get-ADName "CN=blah1,CN=Computers,DC=blah2,DC=blah3" -Split -ValuesOnly
# Output second-to-last element (e.g., "blah2")
$nameElements[-2]

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

$name = "CN=blah1,CN=Computers,DC=blah2,DC=blah3"
# Output canonical name of parent path; e.g.: "blah2.blah3/Computers"
$name | Get-ADName -Format Parent | Convert-ADName Canonical
0 голосов
/ 17 декабря 2018

Split достаточно для этого, то есть:

$s = "CN=blah1,CN=Computers,DC=blah2,DC=blah3"
$s.Split(",")[2].Split("=")[1]
# blah2

Демонстрация Powershell

0 голосов
/ 17 декабря 2018

Хорошо, чтобы показать второй простой способ grep определенных частей вашей строки.Попробуйте использовать - split:

$string = "CN=blah1,CN=Computers,DC=blah2,DC=blah3"

#Seperate the string at ",DC=" and get the second part
($string -split ',DC=')[1]

Возвращает: blah2

0 голосов
/ 17 декабря 2018

Посмотрите на это:

$str = "CN=blah1,CN=Computers,DC=blah2,DC=blah3"
$str -match '^.*?(DC=.*?),'
$Matches[1] # DC=blah2 

Находит первое DC=*, где * - это то, что следует за = до следующей запятой.

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