Назад | Перейти на главную страницу

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

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

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

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

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. Вместо этого вы должны создавать и выводить объекты, а не текст, но это была совершенно другая тема, и мне было лень делать это для этого ответа.

Вот гораздо лучшее решение. Это поместит все в 3 столбца csv с именем группы, именем пользователя и именем учетной записи 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

Мне пришлось добавить .name после $group чтобы заставить это работать для меня.

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

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

$Arrayofmembers = (Get-ADGroup $Group -Properties member).member | Get-ADUser -Properties *

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

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