15 votos

Listar todos los grupos y sus miembros con PowerShell en Win2008r2

Soy nuevo en powershell, pero he estado leyendo manuales y he practicado un poco. Mi objetivo es Listar todos los usuarios en todos los Grupos de Seguridad bajo la ruta especificada. He encontrado la manera de hacerlo:

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

Pero el problema es que no veo el nombre del grupo. Lo único que me aparece es un montón de usuarios. Estaría bien que alguien me dijera cómo mostrar el nombre del grupo antes de que aparezcan todos los miembros de este grupo. Gracias.

2 votos

Si juegas a cambiar después de la base de búsqueda a % { "GroupName: $($_.Name)"; "==========" ; Get-ADGroupMember $_ } | ft name entonces puede que también consigas lo que buscas. La respuesta de Ryan sigue siendo mejor, pero eso es una sola línea si lo quieres.

27voto

Ryan Ries Puntos 33449

Gimme the codes! poderes, ¡activa!

$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
}

La cuestión es que te tomes tu tiempo y lo dividas en pasos. Sé que es divertido tratar de conseguir todo y el fregadero de la cocina para encajar en un one-liner con Powershell, pero no es en absoluto necesario.

Algunas notas:

  • No es necesario hacer Get-ADGroupMember si recoge la propiedad Members en el Get-ADGroup Cmdlet. Lo bueno de esto es que reduce a la mitad la cantidad de llamadas que tienes que hacer a AD, lo que debería hacer que tu script se ejecute más rápido, y alivia la carga del controlador de dominio.

  • $G.Members mostrará todos los miembros del grupo $G... en Powershell 3. En Powershell 2, es posible que tengas que poner otro Foreach dentro del Foreach para enumerar los miembros del grupo. ( Yo dawg, he oído que te gustan los bucles... )

  • Yo uso Write-Host aquí, lo cual es asqueroso. En realidad nunca deberías usar Write-Host . En cambio, deberías construir y dar salida a los objetos, no al texto, pero eso era un tema completamente distinto y me daba pereza hacerlo para esta respuesta.

11voto

Joseph Alves Puntos 21

Aquí hay una solución mucho mejor. Esto pondrá todo en un csv de 3 columnas con el nombre del grupo, el nombre de usuario y el nombre de la cuenta sam. Mucho más fácil de averiguar lo que alguien está en el grupo cuando hay 400 usuarios en un grupo, ya que no tiene que desplazarse.

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

0 votos

Tal vez sea posible añadir ¿400 usuarios en un grupo y captura de datos desde un archivo csv o xlsx?

1voto

Josh Puntos 11

Tuve que añadir .name después de $group para hacer que esto funcione para mí.

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

0 votos

Esto es más un comentario que una respuesta.

0voto

Willy Kroll Puntos 1

Si alguna vez te encuentras con el Size Limit con grupos que contienen más de 5000 miembros, puede cambiar la línea de la siguiente manera:

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

0voto

Magneg Puntos 1

Aquí hay un scripts que exporta todos los grupos de una OU a un archivo separado para cada grupo con el nombre del grupo y la descripción. Si alguien quiere que..

$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
  }
}   
}

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: