如何在PowerShell中提取LDAP memberOf字段中的组名
问题描述
从PowerShell的data.json文件读取LDAP数据时,希望memberOf字段只显示组名(如Gotham),而非完整LDAP路径(如CN=Gotham,OU=Groups,DC=domain,DC=local)。
原代码
cls $data = Get-Content C:\data.json | ConvertFrom-Json $entries = $data.entries $users = $entries.attributes $i = 1 foreach ($user in $users){ $sAMAccountName = $user.sAMAccountName $memberOf = $user.memberOf echo $i echo $sAMAccountName echo $memberOf echo "-----------------------" $i++ } $i = $null
当前输出
1 batman CN=Gotham,OU=Groups,OU=UNIVERSUM,DC=universum,DC=local CN=DC-comics,OU=Groups,OU=UNIVERSUM,DC=universum,DC=local CN=Justice-League,OU=Groups,OU=UNIVERSUM,DC=universum,DC=local ----------------------- 2 superman CN=Metropolis,OU=Groups,OU=UNIVERSUM,DC=universum,DC=local CN=DC-comics,OU=Groups,OU=UNIVERSUM,DC=universum,DC=local CN=Justice-League,OU=Groups,OU=UNIVERSUM,DC=universum,DC=local ----------------------- 3 ironman CN=New-York,OU=Groups,OU=UNIVERSUM,DC=universum,DC=local CN=Marvel,OU=Groups,OU=UNIVERSUM,DC=universum,DC=local CN=Avengers,OU=Groups,OU=UNIVERSUM,DC=universum,DC=local -----------------------
期望输出
1 batman Gotham DC-comics Justice-League ----------------------- 2 superman Metropolis DC-comics Justice-League ----------------------- 3 ironman New-York Marvel Avengers -----------------------
解决方法
只需要对memberOf的每个条目提取组名即可,以下是两种简单实现方式:
方式1:字符串拆分替换
先按逗号分割LDAP路径,取第一个元素后去掉CN=前缀:
cls $data = Get-Content C:\data.json | ConvertFrom-Json $entries = $data.entries $users = $entries.attributes $i = 1 foreach ($user in $users){ $sAMAccountName = $user.sAMAccountName $memberOf = $user.memberOf echo $i echo $sAMAccountName # 遍历每个组路径,提取组名 foreach ($groupPath in $memberOf) { ($groupPath -split ',')[0] -replace 'CN=' } echo "-----------------------" $i++ } $i = $null
方式2:正则表达式匹配
直接用正则匹配CN=后面到第一个逗号之间的内容:
cls $data = Get-Content C:\data.json | ConvertFrom-Json $entries = $data.entries $users = $entries.attributes $i = 1 foreach ($user in $users){ $sAMAccountName = $user.sAMAccountName $memberOf = $user.memberOf echo $i echo $sAMAccountName # 遍历每个组路径,用正则提取组名 foreach ($groupPath in $memberOf) { [regex]::Match($groupPath, 'CN=([^,]+)').Groups[1].Value } echo "-----------------------" $i++ } $i = $null
两种方式都能输出你需要的纯组名格式,选择任意一种即可。
内容的提问来源于stack exchange,提问作者Kubix
相关产品推荐
相关产品推荐

