Заменяйте, пока шаблон не будет найден в PowerShell - PullRequest
0 голосов
/ 02 мая 2018

Я пытался преобразовать следующую строку:

CN=John Doe,OU=IT,OU=Support,OU=Department,OU=HQ,DC=FR,DC=CONTOSO,DC=COM

до:

FR.CONTOSO.COM

В качестве первого шага я пытался удалить все до шаблона ", DC".

Я думал, что смогу использовать не жадный ". +?" соответствовать всему до первого шаблона ", DC":

$str = 'CN=John Doe,OU=IT,OU=Support,OU=Department,OU=HQ,DC=FR,DC=CONTOSO,DC=COM'
$str -replace '.+?,DC', ''

Возвращает:

=COM

Есть идеи, почему он получает только последний, даже с не жадной версией? Как я мог это сделать?

Ответы [ 5 ]

0 голосов
/ 02 мая 2018

Поскольку никто не удосужился объяснить поведение еще:

Операция замены заменяет каждое вхождение шаблона .+?,DC в строке, поэтому сначала она удаляет CN=John Doe,OU=IT,OU=Support,OU=Department,OU=HQ,DC, затем продолжается там, где остановилась замена, и удаляет =FR,DC, а затем =CONTOSO,DC оставляя вас с =COM.

Чтобы избежать такого поведения, вам нужно закрепить выражение в начале строки (^), как уже предлагали другие. Вторая замена для замены оставшихся ,DC= точками может быть последовательно соединена с первой, поэтому вам нужно всего одно утверждение:

$str -replace '^.*?,dc=' -replace ',dc=', '.'
0 голосов
/ 02 мая 2018

ОК, поэтому я принял совет @ EBGreen и решил создать функцию, которая выполняет всю работу:

#Requires -Version 4
Function ConvertFrom-DistinguishedName
{
    [CmdletBinding()]
    [OutputType('System.Management.Automation.PSCustomObject')]
    Param(
        [Parameter(Position = 0, Mandatory)]
        [Alias('DistinguishedName', 'Name')]
        [ValidatePattern('^CN=.+?,(OU=.+?,)+DC=.+$')]
        [string]
        $Path
    )
    $local:ErrorActionPreference = [System.Management.Automation.ActionPreference]::Stop
    $WS = $Path -split ',' # working set

    $User = $WS[0] -replace 'CN='
    $Domain = $WS.Where({$PSItem.StartsWith('DC=')}).ToLower() -replace 'dc=' -join '.'
    $OU = $WS.Where({$PSItem.StartsWith('OU=')}) -replace 'OU='
    [array]::Reverse($OU)

    [pscustomobject]@{
        'User'   = $User
        'Domain' = $Domain
        'OU'     = $OU -join '\'
    }
}

PS C:\> ConvertFrom-DistinguishedName 'CN=John Doe,OU=IT,OU=Support,OU=Department,OU=HQ,DC=FR,DC=CONTOSO,DC=COM'

User     Domain         OU
----     ------         --
John Doe fr.contoso.com HQ\Department\Support\IT

Конечный результат? Это преобразует ваше отличительное имя AD в объект PSCustomObject, с которым вы можете легко работать.

0 голосов
/ 02 мая 2018

Чтобы вывести домен из Distinguishedname, вам нужно будет использовать -Split. Наконец, мы можем использовать -join для вставки '.' между ДК

Это сохранит строку вашего домена в $domain:

$dn = "CN=John Doe,OU=IT,OU=Support,OU=Department,OU=HQ,DC=FR,DC=CONTOSO,DC=COM"
$domain = $dn -Split "," | ? {$_ -like "DC=*"}
$domain = $domain -join "." -replace ("DC=", "")

Write-Host "Current Domain: " $domain
0 голосов
/ 02 мая 2018

Вы должны использовать ^, чтобы начать с начала.

$str = 'CN=John Doe,OU=IT,OU=Support,OU=Department,OU=HQ,DC=FR,DC=CONTOSO,DC=COM'
$str = $str -replace '^.+?,DC',''
$str = $str -replace 'DC=',''
$str -replace ',','.'
0 голосов
/ 02 мая 2018

Просто разбить строку:

$parts = ('CN=John Doe,OU=IT,OU=Support,OU=Department,OU=HQ,DC=FR,DC=CONTOSO,DC=COM' -split ',')
$newString = '{0}.{1}.{2}' -f $parts[-3].split('=')[1], $parts[-2].split('=')[1], $parts[-1].split('=')[1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...