Listar todos os grupos e seus membros com o PowerShell no Win2008r2

14

Eu sou novo no PowerShell, mas tenho lido manuais e praticado um pouco. Meu objetivo é listar todos os usuários em todos os grupos de segurança no caminho especificado. Eu encontrei o caminho para fazê-lo:

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

Mas o problema é que não vejo o nome do grupo. Tudo o que recebo é um monte de usuários. Seria bom se alguém me dissesse como exibir o nome do grupo antes que todos os membros desse grupo sejam listados. Obrigado.

Alec T
fonte
2
Se você brinca com a mudança após a base de pesquisa para % { "GroupName: $($_.Name)"; "==========" ; Get-ADGroupMember $_ } | ft name, também pode obter o que deseja. A resposta de Ryan ainda é melhor, mas essa é uma linha única, se você quiser.
TheCleaner
Obrigado TheCleaner. Como eu disse, sou novo no PS, mas esses exemplos realmente ajudam na compreensão.
Alec T
Seu exemplo também funciona muito bem!
Alec T

Respostas:

26

Gimme the codes! poderes, ativar!

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

O ponto é que, tome o seu tempo e divida-o em etapas. Sei que é divertido tentar fazer com que tudo e a pia da cozinha se encaixem em uma linha com o Powershell, mas isso não é de forma alguma necessário.

Algumas notas:

  • Você não precisa fazer isso Get-ADGroupMemberse coletar a propriedade Members no Get-ADGroupCmdlet inicial . O bom disso é que ele reduz pela metade a quantidade de chamadas que você deve fazer para o AD, o que deve acelerar o script e diminuir a carga do controlador de domínio.

  • $ G.Members exibirá todos os membros do grupo $ G ... no Powershell 3. No Powershell 2, você ainda precisará colocar outro Foreach dentro do Foreach para enumerar os membros do grupo. ( Yo dawg, eu ouvi você como loops ... )

  • Eu uso Write-Hostaqui, que é nojento. Você nunca deve realmente usar Write-Host. Em vez disso, você deve criar e produzir objetos, não texto, mas esse foi um outro tópico e fiquei com preguiça de fazer isso para esta resposta.

Ryan Ries
fonte
10

Aqui está uma solução muito melhor. Isso colocará tudo em um CSV de 3 colunas com o nome do grupo, o nome de usuário e o nome da conta sam. Muito mais fácil descobrir em qual grupo alguém está quando há 400 usuários em um grupo, pois você não precisa rolar.

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
fonte
Talvez seja possível adicionar 400 usuários em um grupo e capturar dados do arquivo csv ou xlsx?
Kiquenet
desculpe pela minha ignorância, mas em que idioma está o seu código?
ScottC
triste por meus comentários atraso, mas PowerShell era a língua
Riley Carney
1

Eu tive que adicionar .namedepois $grouppara fazer isso funcionar para mim.

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

Se você se deparar com o Size Limitproblema com grupos contendo mais de 5000 membros, poderá alterar a linha a seguir:

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

Aqui está um script que exporta todos os grupos em uma UO para um arquivo separado para cada grupo com o nome e a descrição do grupo. Se alguém quiser isso ..

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