Automapping.psm1
#region Types add-type @' namespace CPolydorou.Exchange { public class MailboxAutomapping { public string SharedName; public string SharedIdentity; public string DelegateName; public string DelegateIdentity; } } '@ #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 -SharedMailbox testsharedmailbox SharedName SharedIdentity DelegateName DelegateIdentity ---------- -------------- ------------ ---------------- Test Shared Mailbox LAB.local/LAB/Shared Mailboxes/Test Shared Mailbox Christos Polydorou LAB.local/LAB/Users/Christos Polydorou Test Shared Mailbox LAB.local/LAB/Shared Mailboxes/Test Shared Mailbox Administrator LAB.local/Users/Administrator Get the automapping for all users on shared mailbox "testsharedmailbox" .EXAMPLE PS C:\> Get-MailboxAutomapping -SharedMailbox testsharedmailbox -UserMailbox cpolydorou SharedName SharedIdentity DelegateName DelegateIdentity ---------- -------------- ------------ ---------------- Test Shared Mailbox LAB.local/LAB/Shared Mailboxes/Test Shared Mailbox Christos Polydorou LAB.local/LAB/Users/Christos Polydorou Get the automapping for user "cpolydorou" on mailbox "testsharedmailbox" .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 { # 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.DelegateIdentity = $_.Identity $obj.DelegateName = $_.Name $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 SharedIdentity DelegateName DelegateIdentity ---------- -------------- ------------ ---------------- Test Shared Mailbox LAB.local/LAB/Shared Mailboxes/Test Shared Mailbox Christos Polydorou LAB.local/LAB/Users/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 { # 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 { # 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 #endregion #region Exports Export-ModuleMember -Function Get-MailboxAutomapping Export-ModuleMember -Function Enable-MailboxAutomapping Export-ModuleMember -Function Disable-MailboxAutomapping #endregion |