Powershell:列出ADusers-用户所属的需要组
我有一个用户列表(他们的CN),我想要一个他们所属组的列表。 我已经有了一个几乎可以实现这一目的的代码,但它显示如下: User1-group1;第2组 User2-group1;第2组;第三组等等 此外,组显示为可分辨名称(带有容器等),因此非常长。我只想要名字 我想展示如下: 用户1-组1 用户1-组2 User2-group1等 下面的代码显示了用户所属的组,但不是以我喜欢的直观方式显示的:Powershell:列出ADusers-用户所属的需要组,powershell,Powershell,我有一个用户列表(他们的CN),我想要一个他们所属组的列表。 我已经有了一个几乎可以实现这一目的的代码,但它显示如下: User1-group1;第2组 User2-group1;第2组;第三组等等 此外,组显示为可分辨名称(带有容器等),因此非常长。我只想要名字 我想展示如下: 用户1-组1 用户1-组2 User2-group1等 下面的代码显示了用户所属的组,但不是以我喜欢的直观方式显示的: Import-Csv -Path .\Input_CN.csv | ForEach-Object
Import-Csv -Path .\Input_CN.csv |
ForEach-Object {
$User = Get-ADUser -filter "CN -eq '$($_.CN)'" -properties memberof
[PSCustomObject]@{
SourceCN = $_.CN
MemberOf = $User.MemberOf -join ";"
}
} | Export-Csv -Path .\Output.csv -Delimiter ";" -NoTypeInformation
.\Output.csv
我有一些其他代码列出了我想要的组,但我无法按用户列出。无法将其与上述代码组合
get-aduser -filter {cn -eq "Testuser"} -properties memberof |
Select -ExpandProperty memberof |
ForEach-Object{Get-ADGroup $_} |
Select -ExpandProperty Name
提前感谢:)您可以这样组合两个代码段:
Import-Csv -Path .\Input_CN.csv |
ForEach-Object {
$user = Get-ADUser -Filter "CN -eq '$($_.CN)'" -Properties MemberOf, CN -ErrorAction SilentlyContinue
foreach($group in $user.MemberOf) {
[PSCustomObject]@{
SourceCN = $user.CN
MemberOf = (Get-ADGroup -Identity $group).Name
}
}
} | Export-Csv -Path .\Output.csv -Delimiter ";" -NoTypeInformation
编辑 虽然我从未见过广告用户完全没有组成员资格(在MemberOf属性中至少应该有默认的
域用户
),但您评论说您也希望对此进行测试
Import-Csv -Path .\Input_CN.csv |
ForEach-Object {
$user = Get-ADUser -Filter "CN -eq '$($_.CN)'" -Properties MemberOf, CN -ErrorAction SilentlyContinue
if (!$user) {
Write-Warning "No user found with CN '$($_.CN)'"
# skip this one and resume with the next CN in the list
continue
}
$groups = $user.MemberOf
if (!$groups -or $groups.Count -eq 0) {
[PSCustomObject]@{
SourceCN = $user.CN
MemberOf = 'No Groups'
}
}
else {
foreach($group in $groups) {
[PSCustomObject]@{
SourceCN = $user.CN
MemberOf = (Get-ADGroup -Identity $group).Name
}
}
}
} | Export-Csv -Path .\Output.csv -Delimiter ";" -NoTypeInformation
您可以这样组合两个代码段:
Import-Csv -Path .\Input_CN.csv |
ForEach-Object {
$user = Get-ADUser -Filter "CN -eq '$($_.CN)'" -Properties MemberOf, CN -ErrorAction SilentlyContinue
foreach($group in $user.MemberOf) {
[PSCustomObject]@{
SourceCN = $user.CN
MemberOf = (Get-ADGroup -Identity $group).Name
}
}
} | Export-Csv -Path .\Output.csv -Delimiter ";" -NoTypeInformation
编辑 虽然我从未见过广告用户完全没有组成员资格(在MemberOf属性中至少应该有默认的
域用户
),但您评论说您也希望对此进行测试
Import-Csv -Path .\Input_CN.csv |
ForEach-Object {
$user = Get-ADUser -Filter "CN -eq '$($_.CN)'" -Properties MemberOf, CN -ErrorAction SilentlyContinue
if (!$user) {
Write-Warning "No user found with CN '$($_.CN)'"
# skip this one and resume with the next CN in the list
continue
}
$groups = $user.MemberOf
if (!$groups -or $groups.Count -eq 0) {
[PSCustomObject]@{
SourceCN = $user.CN
MemberOf = 'No Groups'
}
}
else {
foreach($group in $groups) {
[PSCustomObject]@{
SourceCN = $user.CN
MemberOf = (Get-ADGroup -Identity $group).Name
}
}
}
} | Export-Csv -Path .\Output.csv -Delimiter ";" -NoTypeInformation
这有点笨重,但可以使用嵌套循环:
Import-Csv -Path .\Input_CN.csv | ForEach-Object {
$user = Get-ADUser -filter "CN -eq '$($_.CN)'" -properties cn, memberof
$user | ForEach-Object {
$_.MemberOf |
ForEach-Object {
[PSCustomObject]@{
SourceCN = $user.CN
MemberOf = $_.split('[=,]')[1]
}
}
}
} | Where-Object {$null -ne $_.MemberOf} |
Export-Csv -Path .\Output.csv -Delimiter ";" -NoTypeInformation
更新:更新为仅显示组名的“CN”部分,并筛选任何非组成员的用户 这有点笨重,但您可以使用嵌套循环:
Import-Csv -Path .\Input_CN.csv | ForEach-Object {
$user = Get-ADUser -filter "CN -eq '$($_.CN)'" -properties cn, memberof
$user | ForEach-Object {
$_.MemberOf |
ForEach-Object {
[PSCustomObject]@{
SourceCN = $user.CN
MemberOf = $_.split('[=,]')[1]
}
}
}
} | Where-Object {$null -ne $_.MemberOf} |
Export-Csv -Path .\Output.csv -Delimiter ";" -NoTypeInformation
更新:更新为仅显示组名的“CN”部分,并筛选任何非组成员的用户 这将组显示为SamAccountName,这很好。但是,这些组仍然位于用户后面的1行上,以“;”分隔。User1-group1;组2用户2-组1;第2组;第3组etc@Maikel对不起,我误解了。我已经更新了代码以导出所需的格式。太好了,谢谢!是否可以同时显示非组成员的用户?例如,显示“无组成员”的内容?我用
MemberOf=If((Get-ADGroup-Identity$group).Name){(Get-ADGroup-Identity$group.Name}Else{'**No-Groups**'}
尝试了一些东西,我猜这不起作用,因为用户被过滤掉是因为foreach?@Maikel广告用户总是默认域用户组的成员。在域中创建用户帐户时,它将自动添加到此组。根本不存在用户不属于任何组的情况。看见如果您想让用户不是特定组的成员,那是另一个问题。@Maikel我觉得不太可能,但我添加了新代码来测试用户的MemberOf属性是否完全为空。这将组显示为SamAccountName,这很好。但是,这些组仍然位于用户后面的1行上,以“;”分隔。User1-group1;组2用户2-组1;第2组;第3组etc@Maikel对不起,我误解了。我已经更新了代码以导出所需的格式。太好了,谢谢!是否可以同时显示非组成员的用户?例如,显示“无组成员”的内容?我用MemberOf=If((Get-ADGroup-Identity$group).Name){(Get-ADGroup-Identity$group.Name}Else{'**No-Groups**'}
尝试了一些东西,我猜这不起作用,因为用户被过滤掉是因为foreach?@Maikel广告用户总是默认域用户组的成员。在域中创建用户帐户时,它将自动添加到此组。根本不存在用户不属于任何组的情况。看见如果你想让用户不是特定组的成员,那是另一个问题。@Maikel我觉得不太可能,但我添加了新代码来测试用户的MemberOf属性是否完全为空。这几乎就是我需要的。它在单独的一行上显示每个组。但是有两件小事情我希望能够解决:1:如果用户不是组的成员,则不会显示该用户。因此,它只显示属于组的用户。2:是否可以只显示组的名称/SamAccountname?@Maikel,我根据您的评论更新了我的示例。希望有帮助。谢谢,这给了我几乎我喜欢的结果。请参阅下面带有@Theo的注释,它提供了与代码相同的输出。因此,我只需要向没有组的用户显示这几乎就是我所需要的。它在单独的一行上显示每个组。但是有两件小事情我希望能够解决:1:如果用户不是组的成员,则不会显示该用户。因此,它只显示属于组的用户。2:是否可以只显示组的名称/SamAccountname?@Maikel,我根据您的评论更新了我的示例。希望有帮助。谢谢,这给了我几乎我喜欢的结果。请参阅下面带有@Theo的注释,它提供了与代码相同的输出。因此,我只需要显示没有组的用户