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


14

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

 get-adgroup -Filter * -SearchBase "OU=Groups,DC=corp,DC=ourcompany,DC=Com"  | %{Get-ADGroupMember $_.name} | ft name

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


2
如果您在搜索库之后进行更改,% { "GroupName: $($_.Name)"; "==========" ; Get-ADGroupMember $_ } | ft name那么您可能也会得到满意的结果。Ryan的答案仍然更好,但是如果您愿意的话,只需一行。
TheCleaner 2013年

谢谢TheCleaner。就像我说的,我是PS新手,但是这些示例确实有助于理解。
Alec T

您的示例也很棒!
Alec T

Answers:


26

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如果您在初始Get-ADGroupCmdlet中收集了Members属性,则无需这样做。这样做的好处是,它可以减少对AD的调用次数,这可以使脚本运行得更快,并且可以减轻域控制器的负担。

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

  • Write-Host在这里使用,这很糟糕。您永远不要真正使用Write-Host。相反,您应该构建并输出对象,而不是文本,但这是另一个主题,而我懒得为此做这个回答。


10

这是一个更好的解决方案。这会将所有内容放入带有组名,用户名和sam帐户名的3列csv中。当一个组中有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

也许可以在一个组中添加 400个用户并从csv或xlsx文件中捕获数据?
Kiquenet

抱歉,我的无知,但是,您的代码使用的是哪种语言?
ScottC

抱歉,我的评论迟到了,但使用的语言却是强悍
Riley Carney

1

我必须添加.name之后$group才能为我工作。

$Arrayofmembers = Get-ADGroupMember -identity $Group.name -recursive | select name,samaccountname

0

如果您遇到Size Limit包含超过5000个成员的组的问题,则可以如下更改一行:

$Arrayofmembers = (Get-ADGroup $Group -Properties member).member | Get-ADUser -Properties *

0

这是一个脚本,用于将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
  }
}   
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.