Exportando todos os grupos e membros do grupo do Active Directory

3

Sou relativamente novo no powershell e estou tentando obter uma lista de todos os grupos no domínio com seus respectivos membros. Aqui está o que estou trabalhando agora:

Import-Module ActiveDirectory
$OutPutFile = New-Item -type file -force "AllGroups.txt"

#Filters for Groups

# 2 Global distribution group
# 4 Domain local distribution group
# 8 Universal distribution group
# -2147483646 Global security group
# -2147483644 Domain local security group
# -2147483640 Universal security group

$D = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
$Domain = [ADSI]"LDAP://$D"
$Searcher = New-Object System.DirectoryServices.DirectorySearcher
$Searcher.PageSize  = 10000

$Searcher.Filter = "(&(objectCategory=Group)(|(groupType=2)(groupType=4)(groupType=8)))"
$Searcher.SearchRoot = "LDAP://" + $Domain.Name

$Results = $Searcher.FindAll()
foreach ($Result in $Results)
{
    $Item = $Result.Properties

    foreach ($Member in $Item.member) 
    {
    $Name = Get-ADUser "$Member" -Properties DisplayName | select -expand displayname
    $Item.cn, "$Name" | Out-File $OutPutFile -encoding ASCII -append
    }
}

Eu gostaria que a saída fosse Group; Displayname ou Group-Displayname (para que eu possa colocá-lo no Excel e no formato a partir daí), no entanto, não consigo obter saída na mesma linha. A saída atualmente sai assim:

Group
DisplayName
Group
DisplayName

O que estou fazendo de errado ou como posso ajustar o código para me fornecer os dois itens na mesma linha? Eu também estava pensando em adicionar na UO os grupos estão, mas não tive sorte em encontrar uma maneira de obter isso dos meus resultados.

    
por bg.ranken 04.11.2015 / 20:23

2 respostas

3

Quando você canalizar uma lista para Out-File -Append , ela gravará cada entrada em uma nova linha.

Em vez disso, crie uma string a partir dos dois valores e canalize isso:

$MemberLine = '"{0}","{1}"' -f $Item.CN,$Name 
$MemberLine | Out-File $OutPutFile -encoding ASCII -append

Como alternativa, use Export-Csv , ele cuidará da separação dos valores por vírgula corretamente:

$Members = foreach ($Result in $Results)
{
    $Item = $Result.Properties

    foreach ($Member in $Item.member) 
    {
        Get-ADUser "$Member" -Properties DisplayName |Select @{Name='Group';Expression={$Item.CN}},@{Name='Member',Expression={$_.displayname}}
    }
}
$Members | Export-Csv $OutPutFile -Encoding ASCII -NoTypeInformation

Como já foi mencionado, você pode substituir seu [adsisearcher] pelo cmdlet Get-ADGroup , muito mais conciso:

$Groups = Get-ADGroup -Filter {GroupCategory -eq 'Distribution'}
$Groups | ForEach-Object {
  $Group = $_
  $Group.Member |ForEach-Object {
    Get-ADUser $_ -Properties displayName
  } | Select @{N='Group';E={$Group.Name}},@{N='Member';E={$_.displayName}}
} | Export-Csv $OutPutFile -Encoding ASCII -NoTypeInformation
    
por 06.11.2015 / 11:29
0

Basta usar o seguinte código do PowerShell:

Get-ADGroup -filter "name -like 'CWS*'" | % {
$Group = $_.Name $_ | Get-ADGroupMember | select @{n="Group";e={$Group}}, 
@{n='Users';e={$_.Name}} | Export-CSV c:\temp\report.csv -NoTypeInformation -Append -Delimiter ";" }
    
por 05.11.2015 / 18:07