所以我在Powershell中有一个脚本,该脚本从AD下载用户列表,然后将其导出到CSV文件。 代码如下:
$AllADUsers | Select-Object @{Label = "First Name";Expression = {$_.GivenName}},
@{Label = "Last Name";Expression = {$_.Surname}},
@{Label = "Password Last Set";Expression = {"Password last set: "+$_.passwordlastset}},
@{Label = "Expiration date";Expression = {"Expires on: "+[datetime]::fromfiletime($_.accountexpires[0])}},
@{Label = "OU";Expression = {$_.DistinguishedName}} |
Export-Csv -Path $csvfile -Encoding "UTF8" -NoTypeInformation
在这里,我需要在 DistinguishedName 中做什么:
CN =测试,OU =测试,OU =测试,OU =测试,OU =测试,DC =测试,DC =测试
要将所有内容从CN删除到第一个逗号并仅保留
OU =测试,OU =测试,OU =测试,OU =测试,DC =测试,DC =测试
我尝试使用正则表达式,但是我不知道如何只匹配第一次出现的,OU = 并保留后面的所有内容。 我已经做到了,但是它一直在删除OU,因此,我需要在所有DistinguishedNames前面添加一个“ OU =“字符串,但是如果没有循环就无法完成,而且我无法创建选择对象中的循环 我还尝试了从Select-Object之前的DistinguishedName中删除所有文本,但是后来我无法在Select-Object中使用索引为当前用户提供正确的DistinguishedName。
因此,我需要一个Regex来保留第一个 OU = 之后的所有内容,并保留此 OU = 而不删除它。
谢谢
答案 0 :(得分:1)
您真的在问解析专有名称,由于某些字符需要转义,因此专有名称并不是真正的简单字符串。
您的问题确实是,“如何删除叶子并仅获得专有名称的父部分?”
为此,您可以使用Windows提供的IADsPathname
界面。该接口通过Pathname
COM对象提供给脚本。
前一段时间,我写了一个PowerShell module,它为Pathname
对象提供了一个cmdlet接口,使调用变得容易。就您而言,您可以使用Get-ADName
cmdlet并只需编写:
Get-ADName "CN=Test,OU=Test,OU=Test,OU=Test,OU=Test,DC=Test,DC=Test" -Format Parent
此命令产生以下输出:
OU=Test,OU=Test,OU=Test,OU=Test,DC=Test,DC=Test
作为方案中的计算属性,您可以简单地添加以下内容:
@{Label = "OU"; Expression = {Get-ADName $_.DistinguishedName -Format Parent}}
Get-ADName
脚本cmdlet非常方便,并且在可分辨名称的字符串解析中节省了大量工作。
(顺便说一句,该模块还具有Convert-ADName
脚本cmdlet,该cmdlet实现了NameTranslate
COM对象,可用于在不同格式之间转换对象名称。)
我发现Get-ADName
和Convert-ADName
脚本cmdlet在各种情况下几乎都是必不可少的。
答案 1 :(得分:0)
您可以使用简单的正则表达式来做到这一点:
@($_.DistinguishedName -split '(?<!\\),',2)[1]
正则表达式模式可以细分为:
(?<! # negative lookbehind group
\\ # for a literal backslash \
) # end group
, # literal comma ,
之所以要包含以下内容,是因为RDN包含逗号的DN否则会被分割(想象为CN=Doe\, John,OU=SomeOrgUnit,DC=domain,DC=tld
)