Powershell Regex 用于匹配字符串第一次出现后的所有内容



所以我在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界面。此接口通过PathnameCOM 对象提供给脚本。

不久前,我编写了一个 PowerShell 模块,该模块为Pathname对象提供了一个 cmdlet 接口,使其易于调用。在这种情况下,可以使用Get-ADNamecmdlet 并简单地编写:

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 非常方便,可以节省可分辨名称字符串分析的大量工作。

(顺便说一句,该模块还具有实现NameTranslateCOM 对象的Convert-ADName脚本 cmdlet,该 cmdlet 允许您在不同格式之间转换对象名称。

我发现Get-ADNameConvert-ADName脚本 cmdlet 在各种方案中几乎是必不可少的。

最新更新