Мне нужно получить первое подразделение по отличительному имени
У меня есть этот запрос PS, чтобы получить различающееся имя серверов:
$AD = get-adcomputer -filter {OperatingSystem -like '*Server*' -and OperatingSystem -notlike '*2003*'} -property name, description, DistinguishedName | Select name, description, DistinguishedName
и я хочу получить первый экземпляр OU, поэтому я хочу "OU= веб-серверы"
CN=Server1,OU=Web Servers,OU=Servers,OU=HeadOffice Servers,etc
Как я могу это сделать? Спасибо
2 ответа
Разбор DN путем разделения на запятые является довольно распространенной практикой, но может быть ненадежным, потому что имена могут содержать встроенные запятые (они будут экранированы обратной косой чертой). Вот решение с регулярным выражением, которое должно быть более надежным:
$dn = 'CN=Server1,OU=Web Servers,OU=Servers,OU=HeadOffice Servers,DC=domaain,DC=com'
$OU = $dn -replace '.+?,OU=(.+?),(?:OU|DC)=.+','$1'
$OU
Web Servers
Предоставленное решение с регулярным выражением работает только в том случае, если первый элемент не является OU. Вот решение, которое будет работать в любом сценарии и немного более читабельно для типов, отличных от регулярных выражений. Если у вас есть следующий пример, разделение на "," или решение с регулярным выражением вернет "OU=Servers", "Servers" соответственно (я предполагаю, что вы хотите удалить OU = из строки)
$dn = 'OU=Web Servers,OU=Servers,OU=HeadOffice Servers,DC=domaain,DC=com'
($dn -split 'OU=|,OU=')[1]
Если у вас нет вложенных OU, вам может потребоваться добавить дополнительную логику
(($dn -split 'OU=|,OU=')[1] -split ',')[0]
Если вы разделите строку DN и используете запятую в качестве разделителя, то OU станет вторым элементом в массиве.
Это может быть возвращено с помощью квадратных скобок для доступа к отдельному элементу массива. Поскольку это второй элемент, мы используем [1] для доступа к нему, так как [0] - первый элемент.
$DN = "CN=Server1,OU=Web Servers,OU=Servers,OU=HeadOffice Servers,DC=This,DC=Com"
$DN.Split(",")[1]