如何使用Regex通过PowerShell从专有名称中提取CN

时间:2012-01-04 15:42:44

标签: regex powershell ldap

我有一堆字符串是来自AD的DN组。我需要拔出Common Name。 示例字符串是“CN =我想要的组名,OU =组容器,DC = corp,DC =测试,DC =本地”

我正在寻找的是一些PowerShell代码,它将从该字符串中拉出“我想要的群组名称”并丢弃其余部分。

我可以用这个

来扯掉CN
$s = "CN=Group Name I Want,OU=Group Container,DC=corp,DC=test,DC=local"
$s = $s.Remove(0,3) 

但在那之后,我没有一个好的方法可以从“,OU”开始扯掉everthing

我确信有一些正则表达式可以做到这一点,但我需要一些帮助来搞清楚。

6 个答案:

答案 0 :(得分:7)

$s = "CN=Group Name I Want,OU=Group Container,DC=corp,DC=test,DC=local"
$s -replace "(CN=)(.*?),.*",'$2'

答案 1 :(得分:1)

jon Z答案的更短变化:

$s = "CN=Group Name I Want,OU=Group Container,DC=corp,DC=test,DC=local"
$s = $s -replace '^CN=|,.*$'

^$是字符串开头和结尾锚点。 |是“或”。

匹配是行开头的CN=一个以逗号开头并到达行尾的字符串(即CN之后的所有内容)。 replace正在替换为空,因此您将丢弃所有匹配项,只留下CN本身。

如果您的CN(呃)中有逗号,那么显然会有效。

假设这样的逗号后面跟一个空格,这对前面的例子(\S - 非空格字符)来说都可以正常工作:

$s = $s -replace '^CN=|,\S.*$'

我测试了jon Z或者这种变化是否更快执行。拥有1,470,000个DN,第一个执行36.87秒,其中一个执行34.75。其中并不是很多。

那是从文件中读取DN。奇怪的是,将文件“啜饮”成一个数组并执行该文件会使两个正则数据更长一分钟。 PC没有内存限制 - 文件只有100MB。现在不能打扰到那个人的底部!

答案 2 :(得分:0)

$s = "CN=Group Name I Want,OU=Group Container,DC=corp,DC=test,DC=local"
$s1 = ($s -split ",*..=")[1]
$s1

答案 3 :(得分:0)

$s = "CN=Hall\, Jeremy,OU=Group Container,DC=corp,DC=test,DC=local"
$s1 = ($s -split ",*..=")[1]
$s1

这适合我 - 但是,我有一个\,名字输出。 (我从get-aduser函数中拉出manager属性,然后打印distinguishedName.Hall \,Jeremy就是我剩下的一个例子。

有人想要刺?

答案 4 :(得分:0)

$DN = Get-ADUser Username -Properties * | Select DistinguishedName | ForEach-Object {($_.DistinguishedName) -replace('\\','')}
$OUTemp = $DN -creplace "^[^,]*,",""
$OU = $OUTemp -creplace "^[^,]*,",""
$OU

经过大量搜索,这对我有用。我并不为第2行和第3行的冗余感到自豪,但我不知道如何让它在单行上工作。

第一行末尾的“-replace”处理了格式为CN = LastName \的DistinguishedNames,当存在\ escape字符时为FirstName。如果没有它,它不会在名义上产生负面影响。

我的$ OU的结果是OU = ChildOU2,OU = ChildOU1,OU = ParentOU,DC = DOMAIN,DC = local

答案 5 :(得分:-1)

使用此主题中的各种答案,我想出了以下内容:

$ s =($ s -split“,* .. =”)[1]

$ s = $ s.Remove($ s.IndexOf(“\”),1)

$ S