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.


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.


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

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

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 *

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
  }
}   
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.