Exchange 2007 doesn't have a builtin way to recurse distribution groups, soi I created this:
</p>
<p><font face="Courier New" color="#008000" size="2">
<p>#####################################</p>
<p># #</p>
<p># Script to retreive group members #</p>
<p># #</p>
<p># Karl Mitschke March 7 2008 #</p>
<p># #</p>
<p>#####################################</p>
</font><font face="Courier New" color="#008000" size="2">
<p>######################################</p>
<p># heavily modified from recipe 7.3 #</p>
<p># in 'Active Directory Cookbook' #</p>
<p># by Robbie Allen #</p>
<p>######################################</p>
</font><font face="Courier New" color="#008000" size="2">
<p>#requires -pssnapin Microsoft.Exchange.Management.PowerShell.Admin</p>
</font><font face="Courier New" color="#0000ff" size="2">
<p>param</p>
</font></p>
<p><font face="Courier New" size="2">(</font><font face="Courier New" color="#800080" size="2">$group</font><font face="Courier New" size="2">)</font><font face="Courier New" color="#800080" size="2">
<p>$UnknownGroup</p>
</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#ff0000" size="2">=</font><font face="Courier New" size="2"> @{}</font><font face="Courier New" color="#0000ff" size="2">
<p>function</p>
<p>{</p>
<p> </p>
<p> </p>
<p> </p>
<p>{</p>
<p> </p>
</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#5f9ea0" size="2">DisplayMembers</font><font face="Courier New" size="2">(</font><font face="Courier New" color="#800080" size="2">$group</font><font face="Courier New" size="2">)</font><font face="Courier New" color="#800080" size="2">$SubGroup</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#ff0000" size="2">=</font><font face="Courier New" size="2"> @{}</font><font face="Courier New" color="#800080" size="2">$AllMembers</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#ff0000" size="2">=</font><font face="Courier New" size="2"> @()</font><font face="Courier New" color="#0000ff" size="2">if</font><font face="Courier New" size="2">(</font><font face="Courier New" color="#ff0000" size="2">!</font><font face="Courier New" color="#800080" size="2">$group</font><font face="Courier New" size="2">)</font><font face="Courier New" color="#800080" size="2">$group</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#ff0000" size="2">=</font><font face="Courier New" size="2"> </font><strong><font face="Courier New" color="#5f9ea0" size="2">Read-Host</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#800000" size="2">"Enter the groups display name"</font><font face="Courier New" size="2">
<p>}</p>
<p> </p>
<p>{</p>
<p> </p>
<p>}</p>
<p> </p>
<p>{</p>
<p> </p>
</font><font face="Courier New" color="#0000ff" size="2">if</font><font face="Courier New" size="2"> (</font><font face="Courier New" color="#800080" size="2">$group</font><font face="Courier New" size="2">.Contains(</font><font face="Courier New" color="#800000" size="2">"'"</font><font face="Courier New" size="2">))</font><font face="Courier New" color="#800080" size="2">$group</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#ff0000" size="2">=</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#800080" size="2">$group</font><font face="Courier New" size="2">.Replace(</font><font face="Courier New" color="#800000" size="2">"'"</font><font face="Courier New" size="2">,</font><font face="Courier New" color="#800000" size="2">'"'</font><font face="Courier New" size="2">)</font><font face="Courier New" color="#0000ff" size="2">if</font><font face="Courier New" size="2"> (</font><font face="Courier New" color="#800080" size="2">$group</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#ff0000" size="2">-eq</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#800000" size="2">"/?"</font><font face="Courier New" size="2">)</font><strong><font face="Courier New" color="#5f9ea0" size="2">Write-Host</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#800000" size="2">"Usage:"</font><font face="Courier New" size="2">
<p> </p>
</font><strong><font face="Courier New" color="#5f9ea0" size="2">Write-Host</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#800000" size="2">""</font><font face="Courier New" size="2">
<p> </p>
</font><strong><font face="Courier New" color="#5f9ea0" size="2">Write-Host</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#800000" size="2">"get-exgrouprecurse -group <group name>"</font><font face="Courier New" size="2">
<p> </p>
</font><strong><font face="Courier New" color="#5f9ea0" size="2">Write-Host</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#800000" size="2">""</font><font face="Courier New" size="2">
<p> </p>
</font><strong><font face="Courier New" color="#5f9ea0" size="2">Write-Host</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#800000" size="2">"or get-exgrouprecurse <group name>"</font><font face="Courier New" size="2">
<p> </p>
</font><strong><font face="Courier New" color="#5f9ea0" size="2">Write-Host</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#800000" size="2">"Returns an object containing the group member, and the group name."</font><font face="Courier New" size="2">
<p> </p>
</font><font face="Courier New" color="#0000ff" size="2">break</font><font face="Courier New" size="2">
<p>}</p>
<p> </p>
<p> </p>
</font><font face="Courier New" color="#800080" size="2">$validate</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#ff0000" size="2">=</font><font face="Courier New" size="2"> </font><strong><font face="Courier New" color="#5f9ea0" size="2">Get-Group</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#800080" size="2">$group</font><font face="Courier New" size="2">
<p> </p>
<p>{</p>
<p> </p>
</font><font face="Courier New" color="#0000ff" size="2">if</font><font face="Courier New" size="2"> (</font><font face="Courier New" color="#800080" size="2">$validate</font><font face="Courier New" size="2">.RecipientTypeDetails.ToString() </font><font face="Courier New" color="#ff0000" size="2">-match</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#800000" size="2">"mail"</font><font face="Courier New" size="2">)</font><font face="Courier New" color="#800080" size="2">$searchGroup</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#ff0000" size="2">=</font><font face="Courier New" size="2"> </font><strong><font face="Courier New" color="#5f9ea0" size="2">Get-DistributionGroupMember</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#800080" size="2">$group</font><font face="Courier New" size="2">
<p> </p>
<p>{</p>
<p> </p>
<p>{</p>
<p> </p>
<p> </p>
<p>{</p>
<p> </p>
<p> </p>
<p>{</p>
<p> </p>
</font><font face="Courier New" color="#0000ff" size="2">if</font><font face="Courier New" size="2"> (</font><font face="Courier New" color="#800080" size="2">$searchGroup</font><font face="Courier New" size="2">)</font><font face="Courier New" color="#0000ff" size="2">foreach</font><font face="Courier New" size="2"> (</font><font face="Courier New" color="#800080" size="2">$member</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#0000ff" size="2">in</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#800080" size="2">$searchGroup</font><font face="Courier New" size="2">)</font><font face="Courier New" color="#800080" size="2">$membertype</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#ff0000" size="2">=</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#800080" size="2">$member</font><font face="Courier New" size="2">.RecipientTypeDetails</font><font face="Courier New" color="#0000ff" size="2">if</font><font face="Courier New" size="2">(</font><font face="Courier New" color="#800080" size="2">$membertype</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#ff0000" size="2">-match</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#800000" size="2">"Group"</font><font face="Courier New" size="2">)</font><font face="Courier New" color="#800080" size="2">$samname</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#ff0000" size="2">=</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#800080" size="2">$member</font><font face="Courier New" size="2">.SamAccountName.ToString()</font><font face="Courier New" color="#0000ff" size="2">if</font><font face="Courier New" size="2"> (</font><font face="Courier New" color="#800080" size="2">$SubGroup</font><font face="Courier New" size="2">.ContainsKey(</font><font face="Courier New" color="#800080" size="2">$samname</font><font face="Courier New" size="2">) </font><font face="Courier New" color="#ff0000" size="2">-eq</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#0000ff" size="2">$true</font><font face="Courier New" size="2">)</font><strong><font face="Courier New" color="#5f9ea0" size="2">Write-Output</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#800000" size="2">"^ already seen group member (stopping to avoid loop)"</font><font face="Courier New" size="2">
<p>}</p>
<p> </p>
</font><font face="Courier New" color="#0000ff" size="2">else</font><font face="Courier New" size="2">
<p>{</p>
<p> </p>
<p>}</p>
<p>}</p>
<p> </p>
</font><font face="Courier New" color="#800080" size="2">$SubGroup</font><font face="Courier New" size="2">.Add(</font><font face="Courier New" color="#800080" size="2">$samname</font><font face="Courier New" size="2">,</font><font face="Courier New" color="#800080" size="2">$member</font><font face="Courier New" size="2">.DisplayName.ToString())</font><font face="Courier New" color="#0000ff" size="2">else</font><font face="Courier New" size="2">
<p>{</p>
<p> </p>
<p>{</p>
<p> </p>
</font><font face="Courier New" color="#0000ff" size="2">if</font><font face="Courier New" size="2">(</font><font face="Courier New" color="#800080" size="2">$member</font><font face="Courier New" size="2">.PrimarySmtpAddress </font><font face="Courier New" color="#ff0000" size="2">-and</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#800080" size="2">$member</font><font face="Courier New" size="2">.RecipientTypeDetails </font><font face="Courier New" color="#ff0000" size="2">-notcontains</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#800000" size="2">"group"</font><font face="Courier New" size="2">)</font><font face="Courier New" color="#800080" size="2">$obj</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#ff0000" size="2">=</font><font face="Courier New" size="2"> </font><strong><font face="Courier New" color="#5f9ea0" size="2">new-object</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#800000" size="2">psObject</font><font face="Courier New" size="2">
<p> </p>
</font><font face="Courier New" color="#800080" size="2">$obj</font><font face="Courier New" size="2"> | </font><strong><font face="Courier New" color="#5f9ea0" size="2">Add-Member</font><font face="Courier New" size="2"> </font><em><font face="Courier New" color="#5f9ea0" size="2">-membertype</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#800000" size="2">noteproperty</font><font face="Courier New" size="2"> </font><em><font face="Courier New" color="#5f9ea0" size="2">-name</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#800000" size="2">GroupMember</font><font face="Courier New" size="2"> </font><em><font face="Courier New" color="#5f9ea0" size="2">-Value</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#800080" size="2">$member</font><font face="Courier New" size="2">
<p> </p>
</font><font face="Courier New" color="#800080" size="2">$obj</font><font face="Courier New" size="2"> | </font><strong><font face="Courier New" color="#5f9ea0" size="2">Add-Member</font><font face="Courier New" size="2"> </font><em><font face="Courier New" color="#5f9ea0" size="2">-MemberType</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#800000" size="2">noteproperty</font><font face="Courier New" size="2"> </font><em><font face="Courier New" color="#5f9ea0" size="2">-Name</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#800000" size="2">GroupName</font><font face="Courier New" size="2"> </font><em><font face="Courier New" color="#5f9ea0" size="2">-Value</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#800080" size="2">$group</font><font face="Courier New" size="2">
<p> </p>
</font><font face="Courier New" color="#800080" size="2">$AllMembers</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#ff0000" size="2">+=</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#800080" size="2">$obj</font><font face="Courier New" size="2">
<p>}</p>
<p>}</p>
<p>}</p>
<p>}</p>
<p> </p>
</font><font face="Courier New" color="#0000ff" size="2">else</font><font face="Courier New" size="2">
<p>{</p>
<p> </p>
<p>}</p>
<p> </p>
<p>{</p>
<p> </p>
<p>{</p>
<p>DisplayMembers </p>
</font><font face="Courier New" color="#800080" size="2">$UnknownGroup</font><font face="Courier New" size="2">.add(</font><font face="Courier New" color="#800080" size="2">$group</font><font face="Courier New" size="2">,1)</font><font face="Courier New" color="#0000ff" size="2">if</font><font face="Courier New" size="2">(</font><font face="Courier New" color="#800080" size="2">$SubGroup</font><font face="Courier New" size="2">.Values.Count </font><font face="Courier New" color="#ff0000" size="2">-gt</font><font face="Courier New" size="2"> 0)</font><font face="Courier New" color="#0000ff" size="2">foreach</font><font face="Courier New" size="2"> (</font><font face="Courier New" color="#800080" size="2">$subGroup</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#0000ff" size="2">in</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#800080" size="2">$SubGroup</font><font face="Courier New" size="2">.values)</font><font face="Courier New" color="#800080" size="2">$subGroup</font><font face="Courier New" size="2">
<p>}</p>
<p>}</p>
<p> </p>
<p>{</p>
<p> </p>
<p>{</p>
<p> </p>
</font><font face="Courier New" color="#0000ff" size="2">if</font><font face="Courier New" size="2"> (</font><font face="Courier New" color="#800080" size="2">$UnknownGroup</font><font face="Courier New" size="2">.Keys.Count </font><font face="Courier New" color="#ff0000" size="2">-gt</font><font face="Courier New" size="2"> 0)</font><font face="Courier New" color="#0000ff" size="2">foreach</font><font face="Courier New" size="2"> (</font><font face="Courier New" color="#800080" size="2">$LostGroup</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#0000ff" size="2">in</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#800080" size="2">$UnknownGroup</font><font face="Courier New" size="2">.keys)</font><font face="Courier New" color="#800080" size="2">$obj</font><font face="Courier New" size="2"> </font><font face="Courier New" color="#ff0000" size="2">=</