在 Win2008r2 上使用 PowerShell 列出所有组及其成员

Ale*_*c T 15 powershell active-directory groups

我是 powershell 的新手,但我一直在阅读手册并进行了一些练习。我的目标是列出指定路径下所有安全组中的所有用户。我找到了这样做的方法:

 get-adgroup -Filter * -SearchBase "OU=Groups,DC=corp,DC=ourcompany,DC=Com"  | %{Get-ADGroupMember $_.name} | ft name
Run Code Online (Sandbox Code Playgroud)

但问题是我没有看到组名。我得到的只是一堆用户。如果有人能告诉我如何在该组的所有成员被列出之前显示组名,那就太好了。谢谢。

Rya*_*ies 27

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
}
Run Code Online (Sandbox Code Playgroud)

关键是,花点时间把它分解成几个步骤。我知道尝试使用 Powershell 将所有东西和厨房水槽放入单衬里很有趣,但这绝不是必需的。

一些注意事项:

  • Get-ADGroupMember如果您在初始Get-ADGroupCmdlet 中收集 Members 属性,则无需执行此操作。这样做的好处是它使您必须对 AD 进行的调用数量减半,这将使您的脚本运行得更快,并且减轻了域控制器的负担。

  • $G.Members 将显示 Powershell 3 中 $G... 组的所有成员。在 Powershell 2 中,您可能仍需要在 Foreach 中放置另一个 Foreach 以枚举组成员。(哟,dawg,我听说你喜欢循环......

  • Write-Host在这里使用,这很糟糕。你永远不应该真正使用Write-Host. 相反,您应该构建和输出对象,而不是文本,但那完全是另一个主题,我懒得为这个答案做这件事。


小智 11

这是一个更好的解决方案。这会将所有内容放在一个 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
Run Code Online (Sandbox Code Playgroud)