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

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

我是 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
  }
}   
}

相关内容