Wyświetl wszystkie grupy i ich członków za pomocą programu PowerShell na Win2008r2

14

Jestem nowy w PowerShell, ale czytałem instrukcje i trochę ćwiczyłem. Moim celem jest wyświetlenie listy wszystkich użytkowników we wszystkich grupach zabezpieczeń pod określoną ścieżką. Znalazłem sposób, aby to zrobić:

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

Problem w tym, że nie widzę nazwy grupy. Dostaję tylko grupę użytkowników. Byłoby miło, gdyby ktoś mógł mi powiedzieć, jak wyświetlić nazwę grupy, zanim wszyscy członkowie tej grupy znajdą się na liście. Dzięki.

Alec T.
źródło
2
Jeśli bawisz się zmienianiem po bazie wyszukiwania, % { "GroupName: $($_.Name)"; "==========" ; Get-ADGroupMember $_ } | ft namemożesz również uzyskać to, czego szukasz. Odpowiedź Ryana jest wciąż lepsza, ale to jedna linia, jeśli chcesz.
TheCleaner
Dziękuję TheCleaner. Jak powiedziałem, jestem nowy w PS, ale te przykłady naprawdę pomagają w zrozumieniu.
Alec T
Twój przykład również działa świetnie!
Alec T

Odpowiedzi:

26

Gimme the codes! uprawnienia, aktywuj!

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

Chodzi o to, że nie spiesz się i podziel go na etapy. Wiem, że fajnie jest postarać się, aby wszystko i zlew kuchenny pasowały do ​​jednej wyściółki z Powershell, ale w żadnym wypadku nie jest to wymagane.

Kilka uwag:

  • Nie musisz tego robić, Get-ADGroupMemberjeśli zbierzesz właściwość Members w początkowym poleceniu Get-ADGroupcmdlet. Dobrą rzeczą jest to, że zmniejsza o połowę liczbę połączeń, które należy wykonać w AD, co powinno przyspieszyć działanie skryptu i zmniejsza obciążenie kontrolera domeny.

  • $ G.Members wyświetli wszystkich członków grupy $ G ... w Powershell 3. W Powershell 2 nadal może być konieczne umieszczenie innego Foreach w Foreach, aby wyliczyć członków grupy. ( Yo dawg, słyszałem, że lubisz pętle ... )

  • Używam Write-Hosttutaj, co jest obrzydliwe. Nigdy nie powinieneś używać Write-Host. Zamiast tego powinieneś budować i generować obiekty, a nie tekst, ale to był zupełnie inny temat i byłem zbyt leniwy, aby to zrobić w przypadku tej odpowiedzi.

Ryan Ries
źródło
10

Oto o wiele lepsze rozwiązanie. Spowoduje to umieszczenie wszystkiego w 3-kolumnowym pliku CSV z nazwą grupy, nazwą użytkownika i nazwą konta Sam. O wiele łatwiej jest dowiedzieć się, w której grupie jest ktoś, gdy w grupie jest 400 użytkowników, ponieważ nie trzeba przewijać.

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
źródło
Być może możliwe jest dodanie 400 użytkowników w grupie i przechwycenie danych z pliku csv lub xlsx?
Kiquenet
przepraszam za moją ignorancję, ale w jakim języku jest twój kod?
ScottC,
przepraszam za moje spóźnienia, ale językiem był PowerShell
Riley Carney
1

Musiałem dodać .namepo, $groupaby ta praca dla mnie działała.

$Arrayofmembers = Get-ADGroupMember -identity $Group.name -recursive | select name,samaccountname
Josh
źródło
0

Jeśli kiedykolwiek napotkasz Size Limitproblem z grupami zawierającymi więcej niż 5000 członków, możesz zmienić jeden wiersz w następujący sposób:

$Arrayofmembers = (Get-ADGroup $Group -Properties member).member | Get-ADUser -Properties *
Willy Kroll
źródło
0

Oto skrypty, które eksportują wszystkie grupy w jednostce organizacyjnej do osobnego pliku dla każdej grupy z nazwą i opisem grupy. Jeśli ktoś tego chce ...

$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
źródło