所以我在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
我需要在可分辨名称中做什么,如下所示:
CN=测试,OU=测试,OU=测试,OU=测试,OU=测试,DC=测试,DC=测试
删除从CN到第一个逗号的所有内容并仅保留
OU=测试,OU=测试,OU=测试,OU=测试,DC=测试,DC=测试
我尝试使用正则表达式,但我无法弄清楚如何仅匹配第一次出现的,OU=并保留它之后的所有内容。 我已经设法做到了,但它一直在删除 OU,因此我需要在所有可区分名称前面添加一个"OU="字符串,但这在没有循环的情况下无法完成,我无法在选择对象中创建循环 我还尝试从 DistinctedName 中删除 Select-Object 之前的所有文本,但这样我将无法使用 Select-Object 中的索引为当前用户提供正确的 DistinctedName。
所以我需要一个正则表达式,它保留第一个OU= 之后的所有内容,并保留这个OU=而不删除它。
谢谢
您可以使用简单的正则表达式执行此操作:
@($_.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
您实际上是在询问解析可分辨名称,由于某些字符需要转义,这些名称并不是非常简单的字符串。
您的问题实际上是,"如何删除叶子并仅获取可分辨名称的父部分?
为此,您可以使用Windows提供的IADsPathname
界面。此接口通过Pathname
COM 对象提供给脚本。
不久前,我编写了一个 PowerShell 模块,该模块为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 非常方便,可以节省可分辨名称字符串分析的大量工作。
(顺便说一句,该模块还具有实现NameTranslate
COM 对象的Convert-ADName
脚本 cmdlet,该 cmdlet 允许您在不同格式之间转换对象名称。
我发现Get-ADName
和Convert-ADName
脚本 cmdlet 在各种方案中几乎是必不可少的。