因此当我运行这个命令时:
Get-ADUser -Filter 'Name -like "*svc*"' | select Name, DistinguishedName
我得到以下结果:
SamAccountName DistinguishedName
-------------- -----------------
svc_myaccount CN=svc_myaccount,OU=Service Accounts,OU=me3,OU=me2,DC=me,DC=com
我想过滤 DistinguishedName 以仅提供第一个 OU。我应该补充一点,我不希望“服务帐户”是 OU 字段中的唯一项目。我希望结果是:
SamAccountName DistinguishedName
-------------- -----------------
svc_myaccount OU=Service Accounts
我一直试图使用 Filter 将其变成一行代码,但没有成功。也许我必须拆分命令并将其充实为更多代码以拆分 DistinguishedName。我觉得有一个简单的解决方案,而我让它变得更复杂。有什么想法或主意吗?
答案1
找到了一个很好的答案这里. 通过管道传输Get-ADUser
到此Select-Object
语句:
select Name,@{l='DistinguishedName';e={$_.DistinguishedName.split(',')[1].split('=')[1]}}
输出为:
Name DistinguishedName
---- -----------------
svc_myaccount Service Accounts
答案2
过滤器不会解析字符串,它只会返回您请求的数据。如果您要提取 DN、组字符串或数组,或任何非单个字符串的内容,则需要自行解析,可以使用子字符串或正则表达式
这是一个使用正则表达式和拆分的选项
# Parse the DN for the OU array list
Remove the CN and split
('CN=svc_myaccount,OU=Service Accounts,OU=me3,OU=me2,DC=me,DC=com' -replace 'CN=[^=]*,') -split(',')
# Results
OU=Service Accounts
OU=me3
OU=me2
DC=me
DC=com
#Get just the first element of the above array - arrays are zero based
(('CN=svc_myaccount,OU=Service Accounts,OU=me3,OU=me2,DC=me,DC=com' -replace 'CN=[^=]*,') -split(','))[0]
#Results
OU=Service Accounts
使用上述方法计算属性
# Pulling live from ADDS
Get-ADUser -Filter 'Name -like "*svc*"' |
Select-Object -Property Name,
@{Name='DistinguishedName';Expression = { (($_.DistinguishedName -replace 'CN=[^=]*,') -split(','))[0]}}
或者将其作为计算属性......
('CN=svc_myaccount,OU=Service Accounts,OU=me3,OU=me2,DC=me,DC=com').split(',|=')[3]
... 在 split 中使用 or(两个拆分字符串之间的管道)。这也是正则表达式,可与 .split 配合使用