我是 powershell 新手,但我一直在阅读手册并练习一点。我的目标是列出指定路径下所有安全组中的所有用户。我找到了这样做的方法:
get-adgroup -Filter * -SearchBase "OU=Groups,DC=corp,DC=ourcompany,DC=Com" | %{Get-ADGroupMember $_.name} | ft name
但问题是我看不到组名。我得到的只是一堆用户。如果有人能告诉我如何在列出该组的所有成员之前显示组名,那就太好了。谢谢。
答案1
Gimme the codes!
力量,激活!
$Groups = Get-ADGroup -Properties * -Filter * -SearchBase "OU=Groups,DC=corp,DC=ourcompany,DC=Com"
Foreach($G In $Groups)
{
Write-Host $G.Name
Write-Host "-------------"
$G.Members
}
重点是,只需花点时间将其分解成几个步骤即可。我知道尝试使用 Powershell 将所有东西和厨房水槽放入一行代码中很有趣,但这绝不是必需的。
几点说明:
Get-ADGroupMember
如果您在初始 Cmdlet 中收集了 Members 属性,则无需执行此操作Get-ADGroup
。这样做的好处是,它将您对 AD 的调用次数减半,这将使您的脚本运行得更快,并减轻域控制器的负担。$G.Members 将在 Powershell 3 中显示组 $G... 的所有成员。在 Powershell 2 中,您可能仍需要在 Foreach 内放置另一个 Foreach 来枚举组成员。(哟,伙计,我听说你喜欢循环......)
我在这里使用
Write-Host
,这太恶心了。你永远不应该真正使用Write-Host
。相反,你应该构建和输出对象,而不是文本,但那是另一个话题,我太懒了,不想在这个答案中这样做。
答案2
这是一个更好的解决方案。这会将所有内容放在一个 3 列 csv 中,其中包含组名、用户名和 sam 帐户名。当一个组中有 400 个用户时,更容易找出某人在哪个组中,因为您不必滚动。
Import-Module ActiveDirectory
$Groups = (Get-AdGroup -filter * | Where {$_.name -like "**"} | select name -ExpandProperty name)
$Table = @()
$Record = @{
"Group Name" = ""
"Name" = ""
"Username" = ""
}
Foreach ($Group in $Groups) {
$Arrayofmembers = Get-ADGroupMember -identity $Group -recursive | select name,samaccountname
foreach ($Member in $Arrayofmembers) {
$Record."Group Name" = $Group
$Record."Name" = $Member.name
$Record."UserName" = $Member.samaccountname
$objRecord = New-Object PSObject -property $Record
$Table += $objrecord
}
}
$Table | export-csv "C:\temp\SecurityGroups.csv" -NoTypeInformation
答案3
我必须添加.name
一些内容$group
才能让它为我工作。
$Arrayofmembers = Get-ADGroupMember -identity $Group.name -recursive | select name,samaccountname
答案4
以下是一个脚本,它将 OU 中的所有组导出到单独的文件中,每个文件都包含组名和说明。如果有人想要这个……
$groups = Get-ADGroup -filter * -SearchBase "OU=XXX, DC=XX,DC=XX"
ForEach ($g in $groups)
{
$path = "c:\scripts\" + $g.Name + ".csv"
Get-ADGroup -Identity $g.Name -Properties * | select name,description | Out-File $path -Append
$results = Get-ADGroupMember -Identity $g.Name -Recursive | Get-ADUser -Properties displayname, name
ForEach ($r in $results){
New-Object PSObject -Property @{
DisplayName = $r.displayname | Out-File $path -Append
}
}
}