Enumerate-Groups.ps1

#Powershell #Exchange2010

I just wanted to share this cmdlet I created today.  I had a need to workout from Nested Groups including DDL’s the number of users a DL would reach, so I knocked this baby up.

Its v1, so any feedback is very welcome.  Usage is basically

Enumerate-Groups.ps1 –GroupName “Group”

or

Get-Group “Group” | ForEach{.Enumerate-Groups.ps1 –GroupName $_.DistinguishedName }

Enjoy

 

PARAM([String]$GroupName="",[Switch]$ShowUsers=$False, [String]$DomainController="<DC NAME>")

If($GroupName -eq ""){Write-Host "You need to specify a group";Exit}

##########################################################################################

$AppName = "Enumerate-Groups.ps1"

$AppVer  = "v1.0 [19 December2011]"

#v1.0 19 Dec 2011 : A script it born

#

# This script take a groupname as an agrument and then attempts to enumerate the users

# contained in the group by checking all necessary nested groups

#

#Parameters:

#GroupName        : Name of the group (top level) that you want to enumerate

#ShowUsers        : Displays and exports userlist to CSV

#DomainController : Name of a DC to use

#

#Written By Paul Flaherty

#blogs.flaphead.com 

##########################################################################################

#Display script name and version

#########################################################################################

Write-host " " $AppName -NoNewLine -foregroundcolor Green

Write-Host ": " $AppVer -foregroundcolor Green

Write-host "`n Run on $ServerName at $Today by $xUser" -foregroundcolor Yellow

Write-Host "|——————————————————————-|`n"

##########################################################################################

#Load the Exchange 2010 bits & bobs

#########################################################################################

$xPsCheck = Get-PSSnapin | Select Name | Where {$_.Name -Like "*Exchange*"}

If ($xPsCheck -eq $Null) {Add-PsSnapin Microsoft.Exchange.Management.PowerShell.e2010}

Import-Module ActiveDirectory

Function Enumerate-Group($InGroup){

  $tmpADo = Get-AdObject $InGroup  -Server $script:dc

  $tmpADo.ObjectClass

  If($tmpADo.ObjectClass -ne "msExchDynamicDistributionList"){

    $tmpExGroup = Get-Group $InGroup -resultsize 1 -DomainController $Script:DC

    $tmpGroup = Get-ADGroup $tmpExGroup.DistinguishedName -Properties Members  -Server $script:dc

    Write-Host "-"$tmpGroup.Name":"$tmpGroup.ObjectClass

    Write-host "+- Member Count: " $tmpGroup.Members.Count

    $Members = $tmpGroup.Members | Sort

    ForEach($Item in $Members){

      $tmpMember = Get-AdObject $Item  -Server $script:dc

      $tmpName   = $tmpMember.Name

      If($tmpMember.ObjectClass -ne "user"){

        Write-Host "+–" $tmpName":" $tmpMember.ObjectClass

      }

      $tmpUsers = "" | Select Name, DDL

      If($tmpMember.ObjectClass -eq "user"){

        $tmpUsers.Name = $tmpMember.name

        $tmpUsers.DDL  = $tmpGroup.Name

        $Script:Users += $tmpUsers

      }#If user

      if($tmpMember.ObjectClass -eq "group"){Enumerate-group $tmpMember.Name}

      if($tmpMember.ObjectClass -eq "msExchDynamicDistributionList"){

        Enumerate-DDL $TmpMember.Name

      } #If msExchDynamicDistributionList

    } #ForEach

  }ELSE{

    Write-Host "-"$tmpADo.Name":"$tmpGroup.ObjectClass

    Enumerate-DDL $tmpADo.Name

  }#IF

} #Function Enumerate-Group

Function Enumerate-DDL($InDDL){

  $tmpDDL   = Get-DynamicDistributionGroup $InDDL -DomainController $Script:DC

  $mc = Measure-Command {$tmpRecp  = Get-Recipient -RecipientPreviewFilter $tmpDDL.RecipientFilter -OrganizationalUnit $tmpDDL.RecipientContainer -ResultSize Unlimited -DomainController $Script:DC}

  $tmpCount = 0

  ForEach($r in $tmpRecp){$tmpCount ++}

  Write-Host "+— User Count: " -NoNewLine

  Write-Host $tmpCount -ForeGroundColor Green -NoNewLine

  Write-Host " in" $mc.TotalSeconds "Seconds`n"

  ForEach($item in $tmpRecp){

    If ($Item.name -ne ""){

      $tmpUsers = "" | Select Name, DDL

      $tmpUsers.Name = $Item.name

      $tmpUsers.DDL  = $tmpDDL.Name

      $Script:Users += $tmpUsers

    }

  }#ForEach

}#Function Enumerate-DDL

$script:DC    = $DomainController

$Script:users = @()

Write-Host "Domain Controller:.. $script:dc"

Write-Host "Show Users:……… $ShowUsers"

$g = Get-ADObject $GroupName -Server $script:dc

If($g -eq $Null){Write-host "Problem with the group";Exit}ELSE{Enumerate-group $GroupName}

$totusers  = $script:Users.Count

$tmpusers  = $script:users | sort Name -Unique

$totuusers = $tmpusers.count

Write-Host "`nTotal Users: " -NoNewLine

Write-Host $totusers -Foregroundcolor Green

Write-Host "`nTotal Unique Users: " -NoNewLine

Write-Host $totuusers -Foregroundcolor Green

If($ShowUsers){

  Write-Host "`n`nUser List" -foregroundcolor blue

  Write-Host "- Exporting to GroupUserList.csv"

  $Script:Users | Export-CSV GroupUserList.csv -NoTypeInformation -Delimiter "|"

  $Script:Users | sort DDL, Name

}

#End