Lister tous les groupes et leurs membres avec PowerShell sur Win2008r2

14

Je suis nouveau sur PowerShell, mais j'ai lu des manuels et je me suis entraîné un peu. Mon objectif est de répertorier tous les utilisateurs de tous les groupes de sécurité sous le chemin spécifié. J'ai trouvé le moyen de le faire:

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

Mais le problème est que je ne vois pas le nom du groupe. Tout ce que je reçois, c'est un groupe d'utilisateurs. Ce serait bien si quelqu'un pouvait me dire comment afficher le nom du groupe avant que tous les membres de ce groupe soient répertoriés. Merci.

Alec T
la source
2
Si vous essayez de changer après la base de recherche, % { "GroupName: $($_.Name)"; "==========" ; Get-ADGroupMember $_ } | ft namevous obtiendrez également ce que vous recherchez. La réponse de Ryan est encore meilleure, mais c'est une seule ligne si vous le souhaitez.
TheCleaner
Merci TheCleaner. Comme je l'ai dit, je suis nouveau sur PS, mais ces exemples aident vraiment à comprendre.
Alec T
Votre exemple fonctionne très bien aussi!
Alec T

Réponses:

26

Gimme the codes! pouvoirs, activez!

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

Le fait est, prenez votre temps et divisez-le en étapes. Je sais que c'est amusant d'essayer de tout faire et que l'évier de la cuisine s'intègre dans une doublure avec Powershell, mais ce n'est en aucun cas requis.

Quelques notes:

  • Vous n'avez pas besoin de le faire Get-ADGroupMembersi vous collectez la propriété Members dans la Get-ADGroupcmdlet initiale . La bonne chose à ce sujet est qu'il réduit de moitié le nombre d'appels que vous devez passer à AD, ce qui devrait accélérer l'exécution de votre script et alléger le fardeau du contrôleur de domaine.

  • $ G.Members affichera tous les membres du groupe $ G ... dans Powershell 3. Dans Powershell 2, vous devrez peut-être encore placer un autre Foreach à l'intérieur du Foreach pour les énumérer via les membres du groupe. ( Yo dawg, je t'ai entendu comme des boucles ... )

  • J'utilise Write-Hostici, ce qui est dégoûtant. Vous ne devriez jamais vraiment l'utiliser Write-Host. Au lieu de cela, vous devriez créer et générer des objets, pas du texte, mais c'était un tout autre sujet et j'étais trop paresseux pour le faire pour cette réponse.

Ryan Ries
la source
10

Voici une bien meilleure solution. Cela mettra tout dans un csv à 3 colonnes avec le nom du groupe, le nom d'utilisateur et le nom du compte sam. Il est beaucoup plus facile de déterminer dans quel groupe une personne se trouve lorsqu'il y a 400 utilisateurs dans un groupe, car vous n'avez pas à faire défiler.

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
la source
Peut-être possible d' ajouter 400 utilisateurs dans un groupe et de récupérer les données du fichier csv ou xlsx?
Kiquenet
désolé pour mon ignorance mais, dans quelle langue est votre code?
ScottC
désolé pour mes commentaires en retard mais Powershell était la langue
Riley Carney
1

J'ai dû ajouter .nameaprès $grouppour faire ce travail pour moi.

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

Si vous rencontrez un Size Limitproblème avec des groupes contenant plus de 5000 membres, vous pouvez modifier la ligne comme suit:

$Arrayofmembers = (Get-ADGroup $Group -Properties member).member | Get-ADUser -Properties *
Willy Kroll
la source
0

Voici un script qui exporte tous les groupes d'une unité d'organisation vers un fichier séparé pour chaque groupe avec le nom et la description du groupe. Si quelqu'un veut ça ..

$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
la source