Listar todos los grupos y sus miembros con PowerShell en Win2008r2

14

Soy nuevo en PowerShell, pero he estado leyendo manuales y practicado un poco. Mi objetivo es enumerar 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. Todo lo que obtengo es un montón de usuarios. Sería bueno si alguien pudiera decirme cómo mostrar el nombre del grupo antes de que todos los miembros de este grupo aparezcan en la lista. Gracias.

Alec T
fuente
2
Si juegas con cambiar después de la base de búsqueda a, % { "GroupName: $($_.Name)"; "==========" ; Get-ADGroupMember $_ } | ft nameentonces también podrías obtener lo que buscas. La respuesta de Ryan es aún mejor, pero esa es una sola línea si la quieres.
TheCleaner
Gracias TheCleaner Como dije, soy nuevo en PS, pero estos ejemplos realmente ayudan a comprender.
Alec T
¡Tu ejemplo también funciona muy bien!
Alec T

Respuestas:

26

Gimme the codes! poderes, activar!

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

El punto es que solo tómate tu tiempo y divídelo en pasos. Sé que es divertido intentar que todo y el fregadero de la cocina encajen en una sola línea con Powershell, pero de ninguna manera es necesario.

Algunas notas

  • No es necesario que lo haga Get-ADGroupMembersi recopila la propiedad Miembros en el Get-ADGroupCmdlet inicial . Lo bueno de esto es que reduce a la mitad la cantidad de llamadas que debe hacer a AD, lo que debería hacer que su script se ejecute más rápido, y alivia la carga en el controlador de dominio.

  • $ G.Members mostrará todos los miembros del grupo $ G ... en Powershell 3. En Powershell 2, es posible que aún necesite colocar otro Foreach dentro del Foreach para enumerar a través de los miembros del grupo. ( Oye, te escuché como bucles ... )

  • Yo uso Write-Hostaquí, lo cual es asqueroso. Nunca deberías usarlo realmente Write-Host. En cambio, deberías estar construyendo y generando objetos, no texto, pero ese era un tema completamente diferente y yo era demasiado vago para hacerlo para esta respuesta.

Ryan Ries
fuente
10

Aquí hay una solución mucho mejor. Esto pondrá todo en un csv de 3 columnas con nombre de grupo, nombre de usuario y nombre de cuenta sam. Es mucho más fácil descubrir en qué grupo se encuentra alguien 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
Joseph Alves
fuente
¿Quizás sea posible agregar 400 usuarios en un grupo y capturar datos del archivo csv o xlsx?
Kiquenet
perdón por mi ignorancia pero, ¿en qué idioma está tu código?
ScottC
lo siento por mis comentarios tardanza pero PowerShell era el idioma
Riley Carney
1

Tuve que agregar .namedespués $grouppara que esto funcione para mí.

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

Si alguna vez se encuentra con el Size Limitproblema 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 *
Willy Kroll
fuente
0

Aquí hay una secuencia de comandos que exporta todos los grupos en una unidad organizativa a un archivo separado para cada grupo con el nombre y la descripción del grupo. Si alguien quiere eso ...

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