Перечислите все группы и их членов с помощью PowerShell на Win2008r2

14

Я новичок в powershell, но я читал руководства и немного практиковался. Моя цель - перечислить всех пользователей во всех группах безопасности по указанному пути. Я нашел способ сделать это:

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

Но проблема в том, что я не вижу название группы. Все, что я получаю, это группа пользователей. Было бы неплохо, если бы кто-то мог сказать мне, как отобразить название группы, прежде чем все члены этой группы будут перечислены. Благодарю.

Алек Т
источник
2
Если вы поиграете с изменением после поисковой базы, % { "GroupName: $($_.Name)"; "==========" ; Get-ADGroupMember $_ } | ft nameто вы также можете получить то, что вам нужно. Ответ Райана все еще лучше, но это одна строка, если хотите.
TheCleaner
Спасибо TheCleaner. Как я уже сказал, я новичок в PS, но эти примеры действительно помогают понять.
Алек Т
Ваш пример прекрасно работает!
Алек Т

Ответы:

26

Gimme the codes! полномочия, активируйте!

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

Дело в том, просто не торопитесь и разбивайте его на шаги. Я знаю, что забавно пытаться привести все и кухонную раковину в один ряд с Powershell, но это ни в коем случае не требуется.

Несколько заметок:

  • Вам не нужно делать это, Get-ADGroupMemberесли вы собираете свойство Members в исходном Get-ADGroupкомандлете. Хорошая вещь в этом заключается в том, что он вдвое сокращает количество вызовов, которые вы должны сделать в AD, что должно ускорить выполнение вашего скрипта и облегчить нагрузку на контроллер домена.

  • $ G.Members отобразит всех членов группы $ G ... в Powershell 3. В Powershell 2 вам все равно может понадобиться поместить другой Foreach внутри Foreach для перечисления через членов группы. ( Эй, черт, я слышал, что вы как петли ... )

  • Я использую Write-Hostздесь, который является грубым. Вы никогда не должны действительно использовать Write-Host. Вместо этого вы должны создавать и выводить объекты, а не текст, но это была совсем другая тема, и мне было лень это делать для этого ответа.

Райан Райс
источник
10

Вот гораздо лучшее решение. Это поместит все в csv из 3 столбцов с именем группы, именем пользователя и именем учетной записи sam. Намного проще понять, в какую группу входит человек, когда в группе 400 пользователей, поскольку вам не нужно прокручивать.

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
Джозеф Алвес
источник
Может быть, можно добавить 400 пользователей в группу и поймать данные из файла csv или xlsx?
Kiquenet
извините за мое невежество, но в каком языке ваш код?
ScottC
извините за опоздание с комментариями, но PowerShell был языком
Riley Carney
1

Я должен был добавить .nameпосле, $groupчтобы сделать эту работу для меня.

$Arrayofmembers = Get-ADGroupMember -identity $Group.name -recursive | select name,samaccountname
мистифицировать
источник
0

Если вы когда-либо сталкивались с Size Limitпроблемой с группами, включающими более 5000 участников, вы можете изменить одну строку следующим образом:

$Arrayofmembers = (Get-ADGroup $Group -Properties member).member | Get-ADUser -Properties *
Вилли Кролл
источник
0

Вот сценарии, которые экспортируют все группы в подразделении в отдельный файл для каждой группы с именем и описанием группы. Если кто-то хочет этого ..

$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
источник