我正在进行AD提取,我对字段“distinguishedname”进行排序,我只想保留代表用户本身“父OU”的值的特定部分。
我正在运行此命令来执行所有用户的添加提取:
import-module activedirectory
get-aduser -filter * -properties *| Select-Object -Property SamAccountName,CN,co,ExtensionAttribute10,extensionAttribute11,extensionAttribute12,EmailAddress,whenCreated,Enabled,LastLogonDate,accountexpirationdate,distinguishedname |Sort-Object -Property Name | Export-Csv -Delimiter ";" -path "u:\theOutFile_NOFILTER_July.txt"
列"distinguishedname"
如下所示:
distinguishedname
CN=familly\, user,OU=Remote Users,OU=New York,OU=My,DC=Company,DC=Local
CN=nameless\, cat,OU=Remote Users,OU=Ottawa,OU=My,DC=Company,DC=Local
CN=Cameron\, James,OU=Regular Users,OU=Hollywood,OU=My,DC=Company,DC=Local
CN=Bon\, Jean,OU=regular Users,OU=Springfield,OU=My,DC=Company,DC=Local
注意7月10日 有一段时间我会点击那条线:
CN=Dog\, Cesar,OU=Special Accounts,OU=Regular Users,OU=Alma,OU=My,DC=Company,DC=Local
CN=keys\, Alicia,OU=Special Accounts,OU=Regular Users,OU=Paris,OU=My,DC=Company,DC=Local
CN=Clansy\, Door,OU=Map Drives,OU=Remote Users,OU=Rome,OU=My,DC=Company,DC=Local
在这种情况下,我得到的结果是Remote Users
和Regular Users
而不是城市。我已经尝试过你的命令中的一些修改但是徒劳无功。
但我希望第一个命令返回此结果:
distinguishedname
New York
Ottawa
Hollywood
Springfield
我无法找到方法。
提前致谢
答案 0 :(得分:2)
Select-Object具有非常通用的功能,可以使用散列代替属性名称来创建计算属性,其中键“Name”设置为计算属性的名称(实际上是列标题),以及“表达式”设置为一个代码块,用于确定管道中每个对象的属性值。这将做你想要的:
Get-Aduser -Filter * -Properties * | Select-Object -Property SamAccountName,CN,co,ExtensionAttribute10,extensionAttribute11,extensionAttribute12,EmailAddress,whenCreated,Enabled,LastLogonDate,accountexpirationdate,@{Name='distinguishedname'; Expression={[regex]::match($_.distinguishedname,'OU=.+?OU=(.+?),(OU|DC)=').Groups[1].Value}} | Sort-Object -Property Name | Export-Csv -Delimiter ";" -Path "u:\theOutFile_NOFILTER_July.txt"
以下是故障情况:
Name='distinguishedname'
告诉它创建一个名为“distinguishedname”的新列。我使用该名称来匹配您正在查找的输出示例,但它不必是现有属性的名称。将名称更改为更能描述您正在计算的值的内容可能更有意义,例如: Name="parentOU"
。[regex]::match
用于使用正则表达式OU=.+?OU=(.+?),(OU|DC)=
从 $ _。distinguishedname 中提取所需部分,使用正则表达式隔离列表中第二个OU的名称匹配组。.Groups[1].Value
返回第一个匹配组的值(与第一组括号的内容匹配的部分)。如果没有 .Groups [1] , .Value 将返回整个匹配的字符串,从第一个 OU = 返回到 = 以下是父OU的名称。以下也可以使用零宽度断言而不是匹配组:[regex]::match($_.distinguishedname,'(?<=OU=.+?OU=).+?(?=,(OU|DC)=)').Value