Automapping.psm1
#region Types add-type @' namespace CPolydorou.Exchange { public class MailboxAutomapping { public string SharedName; public string SharedIdentity; public string SharedDN; public string DelegateName; public string DelegateIdentity; public string DelegateDN; } public class UserAutomapping { public string UserName; public string UserIdentity; public string UserDN; public string ShareName; public string ShareIdentity; public string ShareDN; } } '@ #endregion #region Functions #region Get-MailboxAutomapping Function Get-MailboxAutomapping { <# .SYNOPSIS Get if a use has automapping enabled for a mailbox. .DESCRIPTION The Get-MailboxAutomappingStatus function will check if a user has automapping enabled for a mailbox. .PARAMETER SharedMailbox The shared mailbox. .PARAMETER UserMailbox The user's mailbox. .EXAMPLE PS C:\> Get-MailboxAutomapping testsharedmailbox SharedName DelegateName ---------- ------------ Test Shared Mailbox Christos Polydorou Test Shared Mailbox Administrator Get the automapping for all users on shared mailbox "testsharedmailbox" .EXAMPLE PS C:\> Get-MailboxAutomapping -SharedMailbox testsharedmailbox -UserMailbox cpolydorou SharedName DelegateName ---------- ------------ Test Shared Mailbox Christos Polydorou Get the automapping for user "cpolydorou" on mailbox "testsharedmailbox" .EXAMPLE PS C:\> Get-MailboxAutomapping -SharedMailbox testsharedmailbox -UserMailbox cpolydorou | fl * SharedName : Test Shared Mailbox SharedIdentity : LAB.local/LAB/Shared Mailboxes/Test Shared Mailbox SharedDN : CN=Test Shared Mailbox,OU=Shared Mailboxes,OU=LAB,DC=LAB,DC=local DelegateName : Christos Polydorou DelegateIdentity : LAB.local/LAB/Users/Christos Polydorou DelegateDN : CN=Christos Polydorou,OU=Users,OU=LAB,DC=LAB,DC=local Get full details. .NOTES The shared mailbox does not have to be of type shared. #> [cmdletBinding()] Param ( [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)] [string]$SharedMailbox, [Parameter(Mandatory = $false, Position = 1)] [string]$UserMailbox ) Begin { # Check if Exchange tools are available Write-Verbose "Checking for Exchange cmdlets." try { Get-Command -Name "Get-Recipient" -ErrorAction Stop | Out-Null } catch { Throw "Exchange cmdlets are not available." } # Tools to search Active Directory $domaininfo = new-object DirectoryServices.DirectoryEntry $searcher = New-Object System.DirectoryServices.DirectorySearcher($domaininfo) } Process { try { # Get the shared mailbox $shared = Get-Recipient $SharedMailbox -ErrorAction stop if($shared.count -gt 1) { Throw "Multiple objects found for $SharedMailbox" } } catch { throw $_ } if($UserMailbox) { try { # Get the user $user = Get-Recipient $UserMailbox -ErrorAction Stop if($user.count -gt 1) { Throw "Multiple objects found for $UserMailbox" } } catch { Throw $_ } } # Get the Active Directory object for the shared mailbox try { $searcher.filter = "(distinguishedname=$($shared.distinguishedname))" $SharedResult = $searcher.FindOne() $sharedADObject = [ADSI]$SharedResult.GetDirectoryEntry() } catch { Throw $_ } # Get the list of delegates (Distinguished Names) $delegates = $sharedADObject.Properties["msExchDelegateListLink"] # Get the recipients for the delegates $delegateRecipients = $delegates | Get-Recipient # If a delegate was specified, display the results for this one if($UserMailbox) { $delegateRecipients = $delegateRecipients | Where-Object {$_.distinguishedname -eq $user.distinguishedname} } # Return the results $delegateRecipients | %{ # Create and return custom objects $obj = New-Object CPolydorou.Exchange.MailboxAutomapping $obj.SharedIdentity = $shared.Identity $obj.SharedName = $shared.Name $obj.SharedDN = $shared.DistinguishedName $obj.DelegateIdentity = $_.Identity $obj.DelegateName = $_.Name $obj.DelegateDN = $_.DistinguishedName $obj } } End { # Clean up $searcher.Dispose() } } #endregion #region Enable-MailboxAutomapping Function Enable-MailboxAutomapping { <# .SYNOPSIS Enable mailbox automapping. .DESCRIPTION The Enable-MailboxAutomapping function will enable the automapping feature on a user for a shared mailbox. .PARAMETER SharedMailbox The mailbox that the user has permissions on. .PARAMETER UserMailbox The mailbox of the user. .EXAMPLE PS C:\> Enable-MailboxAutomapping -SharedMailbox testsharedmailbox -UserMailbox cpolydorou -Verbose -Confirm:$false VERBOSE: Performing the operation "Enable mailbox automapping for Christos Polydorou on" on target "Test Shared Mailbox". VERBOSE: Enabling automapping for recipient Christos Polydorou on Test Shared Mailbox. SharedName DelegateName ---------- ------------ Test Shared Mailbox Christos Polydorou Enable the mailbox automapping for the user "CPolydorou" on mailbox "TestSharedMailbox". .NOTES The shared mailbox does not have to be of type shared. #> [CmdletBinding(SupportsShouldProcess=$true, PositionalBinding=$false, ConfirmImpact='High')] Param ( [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)] [string]$SharedMailbox, [Parameter(Mandatory = $true, Position = 1)] [string]$UserMailbox ) Begin { # Check if Exchange tools are available Write-Verbose "Checking for Exchange cmdlets." try { Get-Command -Name "Get-Recipient" -ErrorAction Stop | Out-Null } catch { Throw "Exchange cmdlets are not available." } # Tools to search Active Directory $domaininfo = new-object DirectoryServices.DirectoryEntry $searcher = New-Object System.DirectoryServices.DirectorySearcher($domaininfo) } Process { try { # Get the shared mailbox $shared = Get-Recipient $SharedMailbox -ErrorAction stop if($shared.count -gt 1) { Throw "Multiple objects found for $SharedMailbox" } } catch { throw $_ } try { # Get the user $user = Get-Recipient $UserMailbox -ErrorAction Stop if($user.count -gt 1) { Throw "Multiple objects found for $UserMailbox" } } catch { Throw $_ } # Search Active Directory for the shared mailbox try { $searcher.filter = "(distinguishedname=$($shared.distinguishedname))" $SharedResult = $searcher.FindOne() $sharedADObject = [ADSI]$SharedResult.GetDirectoryEntry() } catch { Throw $_ } # Get the delegates (list of Distinguished Names) $delegates = $sharedADObject.Properties["msExchDelegateListLink"] # Enable automapping if($delegates.Contains($user.distinguishedName)) { Write-Warning "Automapping for recipient $($user.Name) on $($shared.Name) is already enabled." return } else { if($PSCmdlet.ShouldProcess($shared.Name, "Enable mailbox automapping for $($user.Name) on")) { Write-Verbose "Enabling automapping for recipient $($user.Name) on $($shared.Name)." $sharedADObject.Properties["msExchDelegateListLink"].Add($user.distinguishedname) | Out-Null } } try { $sharedADObject.CommitChanges() # Create and return a custom object $obj = New-Object CPolydorou.Exchange.MailboxAutomapping $obj.SharedName = $shared.Name $obj.SharedIdentity = $shared.Identity $obj.DelegateName = $user.Name $obj.DelegateIdentity = $user.Identity $obj } catch { Throw $_ } } End { # Clean up $searcher.Dispose() } } #endregion #region Disable-MailboxAutomapping Function Disable-MailboxAutomapping { <# .SYNOPSIS Disable mailbox automappping. .DESCRIPTION The Disable-MailboxAutomapping function will disable the automapping feature on a user for a shared mailbox. .PARAMETER SharedMailbox The mailbox that the user has permissions on. .PARAMETER UserMailbox The mailbox of the user. .EXAMPLE PS C:\> Disable-MailboxAutomapping -SharedMailbox testsharedmailbox -UserMailbox cpolydorou -Verbose -Confirm:$false VERBOSE: Performing the operation "Disable mailbox automapping for Christos Polydorou on " on target "Test Shared Mailbox". VERBOSE: Disabling automapping for recipient Christos Polydorou on Test Shared Mailbox. Disable mailbox automapping for user "CPolydorou" on mailbox "TestSharedMailbox" .NOTES The shared mailbox does not have to be of type shared. #> [CmdletBinding(SupportsShouldProcess=$true, PositionalBinding=$false, ConfirmImpact='High')] Param ( [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)] [string]$SharedMailbox, [Parameter(Mandatory = $true, Position = 1, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)] [string]$UserMailbox ) Begin { # Check if Exchange tools are available Write-Verbose "Checking for Exchange cmdlets." try { Get-Command -Name "Get-Recipient" -ErrorAction Stop | Out-Null } catch { Throw "Exchange cmdlets are not available." } # Tools to search Active Directory $domaininfo = new-object DirectoryServices.DirectoryEntry $searcher = New-Object System.DirectoryServices.DirectorySearcher($domaininfo) } Process { try { # Get the shared mailbox $shared = Get-Recipient $SharedMailbox -ErrorAction stop if($shared.count -gt 1) { Throw "Multiple objects found for $SharedMailbox" } } catch { throw $_ } try { # Get the user $user = Get-Recipient $UserMailbox -ErrorAction Stop if($user.count -gt 1) { Throw "Multiple objects found for $UserMailbox" } } catch { Throw $_ } # Search the shared mailbox in Active Directory try { $searcher.filter = "(distinguishedname=$($shared.distinguishedname))" $SharedResult = $searcher.FindOne() $sharedADObject = [ADSI]$SharedResult.GetDirectoryEntry() } catch { Throw $_ } # Get the list of delegates (list of Distinguished Names) $delegates = $sharedADObject.Properties["msExchDelegateListLink"] # Remove the delegate if( -Not $delegates.Contains($user.distinguishedName)) { Write-Warning "Automapping for recipient $($user.Name) on $($shared.Name) was not enabled." return } else { if($PSCmdlet.ShouldProcess($shared.Name, "Disable mailbox automapping for $($user.Name) on ")) { Write-Verbose "Disabling automapping for recipient $($user.Name) on $($shared.Name)." $sharedADObject.Properties["msExchDelegateListLink"].Remove($user.distinguishedname) } } try { $sharedADObject.CommitChanges() } catch { Throw $_ } } End { # Clean up $searcher.Dispose() } } #endregion #region Get-UserAutomapping function Get-UserAutomapping { <# .Synopsis Get the mailbox automapping status for a user. .DESCRIPTION Get the mailboxes that are going to be automatically mapped to a user's outlook account. .INPUTS System.String .OUTPUTS CPolydorou.UserAutoMapping .EXAMPLE PS C:\> Get-UserAutomapping cpolydorou UserName ShareName -------- --------- Christos Polydorou eVoices Christos Polydorou Shared Mailbox Get the mailboxes that are going to be automapped on cpolydorou's account. .EXAMPLE PS C:\> Get-UserAutomapping cpolydorou | fl * UserName : Christos Polydorou UserIdentity : LAB.local/LAB/Users/Christos Polydorou UserDN : CN=Christos Polydorou,OU=Users,OU=LAB,DC=LAB,DC=local ShareName : eVoices ShareIdentity : LAB.local/LAB/Shared Mailboxes/eVoices ShareDN : CN=eVoices,OU=Shared Mailboxes,OU=LAB,DC=LAB,DC=local UserName : Christos Polydorou UserIdentity : LAB.local/LAB/Users/Christos Polydorou UserDN : CN=Christos Polydorou,OU=Users,OU=LAB,DC=LAB,DC=local ShareName : Shared Mailbox ShareIdentity : LAB.local/LAB/Shared Mailboxes/Shared Mailbox ShareDN : CN=Shared Mailbox,OU=Shared Mailboxes,OU=LAB,DC=LAB,DC=local Get more details on the recipients. .NOTES Unlike the Get-MailboxAutommaping which will list the users that will automatically map a mailbox, this cmdlet will list the mailboxes that will be automatically mapped by a user. #> [CmdletBinding()] [OutputType([String])] Param ( # The identity of the user [Parameter(Mandatory=$true, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true, ValueFromRemainingArguments=$false, Position=0 )] $Identity ) Begin { # Check if Exchange tools are available Write-Verbose "Checking for Exchange cmdlets." try { Get-Command -Name "Get-Recipient" -ErrorAction Stop | Out-Null } catch { Throw "Exchange cmdlets are not available." } # Create the Active Directory searcher $Domain = New-Object System.DirectoryServices.DirectoryEntry $Searcher = New-Object System.DirectoryServices.DirectorySearcher $Searcher.SearchRoot = $Domain $Searcher.PageSize = 10 } Process { # Get the recipient object for the user try { $recipient = Get-Recipient $Identity -ErrorAction Stop } catch { Throw $_ return } # Check if multiple user objects exist for the supplied identity if($recipient.count -gt 1) { Throw "Multiple recipients were found for $Identity." } Write-Verbose "Getting automapping settings for $Identity" # Find the object in Active Directory and add the address $dn = $recipient.DistinguishedName $LDAPFilter = "(distinguishedname=$dn)" $Searcher.Filter = $LDAPFilter $Searcher.SearchScope = "Subtree" $Result = $Searcher.FindOne() $Object = [ADSI]$Result.GetDirectoryEntry() $sharedMailboxes = $Object.Properties["msExchDelegateListBL"] foreach($sm in $sharedMailboxes) { # Get the recipient for the shared resource try { $shareRecipient = Get-Recipient $sm -ErrorAction Stop } catch { Write-Error "Could not find a recipient for shared resource $sm" } # Create a custom object $obj = New-Object CPolydorou.Exchange.UserAutomapping $obj.UserName = $recipient.Name $obj.UserIdentity = $recipient.Identity $obj.UserDN = $recipient.DistinguishedName $obj.ShareName = $shareRecipient.Name $obj.ShareIdentity = $shareRecipient.Identity $obj.ShareDN = $shareRecipient.DistinguishedName $obj } } End { # Cleanup $Searcher.Dispose() } } #endregion #endregion #region Exports Export-ModuleMember -Function Get-MailboxAutomapping Export-ModuleMember -Function Enable-MailboxAutomapping Export-ModuleMember -Function Disable-MailboxAutomapping Export-ModuleMember -Function Get-UserAutomapping #endregion |