Powershell 过滤或选择某些对象

Powershell 过滤或选择某些对象

因此当我运行这个命令时:

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 配合使用

相关内容