What this script does:
- Find all ActiveSync enabled mailboxes. I use an AD Directory Searcher method, so reading the values on 100,000 mailboxes only takes a few minutes, not hours.
- Reads an "Exchange ActiveSync Opt-in" group, containing groups and/or mailboxes.
- Disables all mailboxes not in the Opt-In group. Enable all mailboxes in Opt-In group.
- Look at nested groups in Exchange ActiveSync Opt-in, compare names to ActiveSync Mailbox Policies in Organization, if matches, apply policy to all mailboxes in group.
I run this script via a scheduled task hourly. The parent Exchange ActiveSync Opt-In is a security group and is not visible in the GAL. A few of my customers have opted to create distribution groups and modify them via OWA or Outlook. A few of them manage groups in their AD, and I sync the membership across to the appropriate linked mailboxes on my side.
<# .SYNOPSIS Enable/Disable mailboxes for ActiveSync .DESCRIPTION Script will find any mailbox that has ActiveSync enabled, and compare membership to a specific group. If in group, enable mailbox. If NOT in group, disable. When complete, compare groups with activesync policies. If names match, apply policy to group members.#> function Get-ActiveSyncEnabledMailboxes { $strFilter = "(&(objectClass=User)(mail=*)(objectCategory=Person)(mailNickname=*)(!cn=SystemMailbox{*)(|(!msExchOmaAdminWirelessEnable=*)(&(msExchOmaAdminWirelessEnable=*)(!msExchOmaAdminWirelessEnable:1.2.840.113556.1.4.803:=4))))" $objDomain = New-Object System.DirectoryServices.DirectoryEntry $objSearcher = New-Object System.DirectoryServices.DirectorySearcher $objSearcher.SearchRoot = $objDomain $objSearcher.PageSize = 1000 $objSearcher.Filter = $strFilter $objSearcher.SearchScope = "Subtree" $objSearcher.PropertiesToLoad.Add("distinguishedname") | out-Null $colResults = $objSearcher.FindAll() $mbxes = $colresults | select @{Name="DN";Expression={$_.properties.distinguishedname}} return $mbxes <# .SYNOPSIS Return the DN for all objects that have ActiveSync enabled. .EXAMPLE Get-ActiveSyncEnabledMailboxes .NOTES .LINK http://social.technet.microsoft.com/forums/en-us/exchangesvradmin/thread/855A485F-A327-49C1-8184-9A9D6D1FE9DB #> } #Enable Powershell addins for Exchange 2010 and Quest ARS tools. $Posh2010 = (get-pssnapin Microsoft.Exchange.Management.PowerShell.E2010 -ErrorAction SilentlyCOntinue) -ne $null if (-not $posh2010) { get-pssnapin Microsoft.Exchange.Management.PowerShell.E2010 | Add-PSSnapin -PassThru } $Quest = (get-pssnapin Quest.ActiveRoles.ADManagement -ErrorAction SilentlyCOntinue) -ne $null if (-not $Quest) { if ((get-pssnapin Quest.ActiveRoles.ADManagement -ErrorAction SilentlyCOntinue -Registered) -ne $null) { get-pssnapin Quest.ActiveRoles.ADManagement | Add-PSSnapin -PassThru } else { Write-Host "Error:Need Quest ARS Powershell cmdlets to get nested group membership" -ForegroundColor RED Break } } $enabledUsers = Get-ActiveSyncEnabledMailboxes | sort DN | ?{$_.dn -notlike "*test*" -and $_.dn -notlike "*service accounts*" -and $_.dn -notlike "*global admins*" -and $_.dn -notlike "*federatedemail*" -and $_.dn -notlike "*CAS_*"} $OptIn = Get-QADGroupMember -Indirect "Exchange ActiveSync Opt-In" -SizeLimit 0 -Type user | select DN | sort dn | ?{$_.dn -notlike "*test*" -and $_.dn -notlike "*service accounts*" -and $_.dn -notlike "*global admins*" -and $_.dn -notlike "*federatedemail*" -and $_.dn -notlike "*CAS_*"} $MissMatch = compare -ReferenceObject $enabledusers -DifferenceObject $optin -Property DN #-IncludeEqual $index =0 $max = $missmatch.count Get-Date | Out-File -FilePath ".\ASReport.txt" foreach ($Overload in $MissMatch) { $index++ if ($max -gt 0) { $statusStr = "in progress "+$index + " of "+$max write-progress -activity "Processing ActiveSync Opt-In List" -status $statusStr -percentcomplete (($index / $max)*100) } $mbxDN = $overload.DN $mailtype = (Get-Recipient $mbxdn).recipienttype $ChangedAlias = $false if ($mailtype -ne "MailUser"){ $casMBX = Get-CASMailbox $mbxdn $badMbx = Get-Mailbox $mbxdn #Cleanup invalid SMTP email addresses if possible. $m = $badMbx.primarysmtpaddress.isvalidaddress if (-not $m) { $psmtp = $badmbx.primarysmtpaddress.tostring() $newSMTP = $psmtp.replace(".@","@").replace("..",".").replace(" ","_") if ($psmtp -ne $newSMTP) { Set-Mailbox -identity $badmbx.identity -PrimarySmtpAddress $newSMTP $badMbx = Get-Mailbox $mbxdn $m = $badMbx.primarysmtpaddress.isvalidaddress } } if ($m ) { #Mailboxes enabled for activesync, but not in optin if ($overload.SideIndicator -eq "<=") { Write-Host "- disable user",$mbxDN "disabled: "+$mbxdn | Out-File -FilePath ".\ASReport.txt" -Append Set-CASMailbox -identity $mbxDN -ActiveSyncEnabled $false -erroraction silentlycontinue -wa Continue } #Mailboxes in Optin, not enabled for ActiveSync if ($overload.SideIndicator -eq "=>") { Write-Host "+ enable user",$mbxDN "enabled: "+$mbxdn | Out-File -FilePath ".\ASReport.txt" -Append Set-CASMailbox -identity $mbxDN -ActiveSyncEnabled $true -erroraction silentlycontinue -wa Continue } #Allowed ActiveSync Enabled mailboxes. Use to set policy? if ($overload.SideIndicator -eq "==" ) { Write-Host "Already Enabled user",$mbxDN } } } } if ($max -gt 0) { write-progress -activity "Processing ActiveSync Opt-In List" -status "complete" -completed } Get-Date | Out-File -FilePath ".\ASReport.txt" -Append #Read GROUPS nested inside the Opt-In group! #Looks for ActiveSync policies with identical names to sub Opt-in groups and applies policy to mailboxes in each group. $ASEnabledgroups = Get-QADGroupMember -Type group -Identity "Exchange ActiveSync Opt-in" foreach ($G in $ASEnabledgroups) { $AP = Get-ActiveSyncMailboxPolicy $g.name -ErrorAction SilentlyContinue if ($ap -ne $null) { Write-Host "found $ap" $groupMembers = get-qadgroupmember -identity $g.dn -type user -indirect -sizelimit 0 -LdapFilter '(mail=*)' | ?{(get-casmailbox -identity $_.dn).ACtiveSyncMailboxPolicy -ne $AP.Name} if ($groupMembers -ne $null) { $groupMembers | %{set-casmailbox -identity $_.dn -ActiveSyncMailboxPolicy $ap.name} } } }
No comments:
Post a Comment