谁能帮我解决这个问题。我需要从 Active Directory 中的managedby
属性中派生一个城市名称和人的全名,如下所示:
CN=Marley, Bob,OU=Users,OU=PARIS,DC=Domain,DC=com
所以我需要把所有东西都拿出来,只剩下"Marley, Bob PARIS
">
我可以把巴黎的位拿出来,但不能得到全名:
这会在输出中产生Paris
:
CN=Marley, Bob,OU=Users,OU=PARIS,DC=Domain,DC=com' | %{(($_ -split ',')[-3] -split '=')[1]}
谁能帮我提取全名?
您可以将可分辨名称拆分为其单独的 RDN(相对区分名称(组件,然后从中选择所需的部分。
'CN=Marley, Bob,OU=Users,OU=PARIS,DC=Domain,DC=com' -split ',s*(?<!\,s*)'
会回来
CN=马利\, 鲍勃 OU=用户 OU=巴黎 DC=域 DC=com
在您的情况下,您可以像这样使用:
$rdn = 'CN=Marley, Bob,OU=Users,OU=PARIS,DC=Domain,DC=com' -split ',s*(?<!\,s*)'
'{0} {1}' -f (($rdn[0] -split '=')[1] -replace '\'), (($rdn[2] -split '=')[1])
返回
马利, 鲍勃·帕里斯
但是,仅当所有位置都存储在Users
OU 内的第一个子 OU 中时,这才有效。
如果您坚持在单行中尝试此操作,您也可以使用正则表达式-replace
:
'CN=Marley, Bob,OU=Users,OU=PARIS,DC=Domain,DC=com' -replace '\' -replace 'CN=(.+),OU=.+OU=(.+)(,DC=.*){2,}$', '$1 $2'
它捕获第一个出现的操作CN=
,该操作后必须跟,OU=
回溯引用 1 ($1
(。接下来,它捕获第二次出现的OU=
,后跟反向引用2 ($2
中的,DC=
。
简而言之:如果您的 OU 结构发生变化,这将不再起作用!
当然,在您的示例中,您可以提取字符串的城市和名称
'CN=Marley, Bob,OU=Users,OU=PARIS,DC=Domain,DC=com' | %{(($_ -split ',OU',2)[0] -split '=')[1] -replace '\'}
但由于它是一个对象的区分名称,我认为最好在AD中检索该对象以获取该信息
$DN="CN=Marley, Bob,OU=Users,OU=PARIS,DC=Domain,DC=com"
$object = New-Object System.DirectoryServices.DirectoryEntry "LDAP://$DN"
$name=$object.Properties.cn
$city=$object.Properties.l