Я думаю, что лучший (под «лучшим», я имею в виду «самый надежный») ответ - это не выполнять синтаксический анализ строк или регулярное выражение в первую очередь и использовать интерфейс 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