Immer mal wieder stell sich uns die Frage, in welchen Verteilern ein bestimmter Benutzer Mitglied ist. Natürlich kann man sich im Office365 Admin-Portal das Postfach ansehen, dort wird einem aufgelistet, wo der User Mitglied ist – allerdings werden hier nur die direkten Mitgliedschaften aufgelistet. In der Regel sind Verteiler / Distribution Lists aber in einander verschachtelt, um z.B. Team- / Gruppen- /Abteilungsstrukturen abzubilden. Um nun nicht von Hand alle Verteiler auf deren Mitgliedschaft in weiter oben liegenden Verteilern prüfen zu müssen, habe ich ein PowerShell-Skript geschrieben.
Dieses ermittelt zunächst, in welchen Verteilern der Benutzer unmittelbar enthalten ist und prüft dann diese Verteiler auf “Eltern”, also weiter oben stehende Verteiler, die den betreffenden Verteiler (und damit dann eben indirekt den Bnutzer) enthalten.
Hier ist das Skript:
[string[]]$global:AllreadyChecked = $null function Get-DistributionGroupAllParents { param ([string]$GroupName) [string[]]$Parents = $null ForEach ($Group in Get-DistributionGroup) { If((Get-DistributionGroupMember $Group.Name | Where RecipientType -NE "UserMailbox").Name -contains $Groupname) { # Make sure, we are only checking every DGs parents once as many DG tree leafs may lead to the same parent DG If($global:AllreadyChecked -notcontains ($Group.Name)) { $Parents += $Group.Name Get-DistributionGroupAllParents -GroupName $Group.Name $global:AllreadyChecked += $Group.Name } } } Return $Parents } # Connect to Office 365 If((Get-PSSession | Where Computername –like "*ps.outlook.com*" | Where State –eq "Opened" | Measure-Object).Count -lt 1) { $Credentials = Get-Credential –UserName "USER@DOMAIN.COM" -Message "Please enter your Office 365 / Azure AD password!" $ExchangeSession = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/powershell -Credential $Credentials -Authentication Basic -AllowRedirection -WarningAction SilentlyContinue Import-PSSession $ExchangeSession -AllowClobber -DisableNameChecking >> $null } elseif((Get-PSSession | Where Computername -like "*ps.outlook.com*" | Where Availability -eq "Available" | Where State -ne "Opened" | Measure-Object).Count -ge 1) { Import-PSSession -Session (Get-PSSession | Where Computername -like "*ps.outlook.com*" | Where Availability -eq "Available" | Select -Last 1) } # Get all DGs a user is member of $User = Read-Host -Prompt "Enter User to check!" $Recipient = (Get-Recipient -RecipientType UserMailbox -Identity $User).Name Write-Host "Script started discovery - this could take a while" -ForegroundColor Red [string[]]$AllParents = $null ForEach ($Group in Get-DistributionGroup) { If((Get-DistributionGroupMember $Group.Name).Name -contains $Recipient) # Find all Groups the User is immediate member of: { $AllParents += $Group.Name Write-Host -ForegroundColor Green "$($Group.Name) ($($Group.PrimarySmtpAddress))" $AllParents += (Get-DistributionGroupAllParents -Group $Group.Name) } } Write-Host "User is member of these groups (for some of them, he may be member through nested groups!):" $AllParents.Where({ $_ -ne "" }) | select -uniq | sort | Get-DistributionGroup | ft DisplayName,Name,PrimarySmtpAddress -AutoSize |
Viel Spaß damit!