Bonjour,
Je vous présente un script qui pourrait vous dépanner lors de demandes de délégations sur un environnement Exchange Server 2010, lors d’une migration ou simplement en administration de vos plateformes Exchange.
Merci au passage à Thomas ANDRES et Yohan BOULLIER pour leur précieuse participation à l’élaboration de ce script !
Ce script va vous permettre de placer des permissions de délégations sur les boîtes à distance, à l’aide d’un compte ayant ces droits spécifiques pour placer des droits dans les Boîtes Exchange de vos utilisateurs
Pour plus de renseignements sur les droits nécessaires, veuillez-vous rendre sur cette page http://msdn.microsoft.com/en-us/library/bb204095(v=exchg.140).aspx
New-ManagementRoleAssignment -Name:ExchangeImpersonation -Role:ApplicationImpersonation -User:ServiceAccount
Pour vous servir de ce script, vous pouvez au choix:
- Utiliser les paramètres powershell en entrée
- Utiliser un fichier CSV en entrée
Les différents paramètres du script sont les suivants
- MbxtoDelegate : Boîte à déléguer (paramètre obligatoire)
- DelegatetoAdd : Délégué à ajouter (paramètre obligatoire)
- InboxAccessPermissions : Droits sur la boîte de réception
Choix disponible : None, Owner, PublishingEditor, Editor, PublishingAuthor, Author, NoneditingAuthor, Reviewer, Contributor, Custom
-
CalendarAccessPermissions : Droits sur le calendrier
- Choix disponible : None, Owner, PublishingEditor, Editor, PublishingAuthor, Author, NoneditingAuthor, Reviewer, Contributor, Custom
- Choix disponible : None, Owner, PublishingEditor, Editor, PublishingAuthor, Author, NoneditingAuthor, Reviewer, Contributor, Custom
-
ContactAccessPermissions : Droits sur les contacts
- Choix disponible : None, Owner, PublishingEditor, Editor, PublishingAuthor, Author, NoneditingAuthor, Reviewer, Contributor, Custom
- Choix disponible : None, Owner, PublishingEditor, Editor, PublishingAuthor, Author, NoneditingAuthor, Reviewer, Contributor, Custom
-
GrantSendAs : Droit « Envoyer en tant que »
- Choix disponible : $True / $False
- Choix disponible : $True / $False
Exemple d’utilisation sans le fichier CSV en entrée
Commande powershell
.\AddDelegates.ps1 -MbxtoDelegate DPEKMEZEXT -DelegatetoAdd TANDRESEXT -InboxAccessPermissions Editor -CalendarAccessPermissions Editor -ContactAccessPermissions Editor -GrantSendAs $False
Exemple d’utilisation avec le fichier CSV en entrée
Format du fichier CSV
MbxtoDelegate,DelegatetoAdd,InboxAccessPermissions,CalendarAccessPermissions,ContactAccessPermissions,GrantSendAs
TANDRESEXT,DPEKMEZEXT,Editor,Editor,Editor,False
Commande powershell
.\AddDelegates.ps1 -csv .\AddDelegates.csv
Resultat
#================================================================================= # AddDelegates.ps1 # # THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY # KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A # PARTICULAR PURPOSE. # # Description: # # # Script Written By: David Pekmez ( https://unifiedit.wordpress.com ) # # Version: 1 # Last Updated: 19/08/2011 #================================================================================= #================================================================================= # Parameter definition #================================================================================= Param( [Parameter(Mandatory=$false, Position=0, HelpMessage="Please Enter Mailbox UserName Or SMTP Address of the mailbox you want to Delegate",ValueFromPipeline=$true)][string] $MbxtoDelegate, [Parameter(Mandatory=$false, Position=1, HelpMessage="Please Enter Mailbox UserName Or SMTP Address of the Delegate you want to Add",ValueFromPipeline=$true)][string] $DelegatetoAdd, [Parameter(Mandatory=$false, HelpMessage="Please Enter Inbox Folder permissions to add to the Delegate",ValueFromPipeline=$true)][string] $InboxAccessPermissions="None", [Parameter(Mandatory=$false, HelpMessage="Please Enter Calendar Folder permissions to add to the Delegate",ValueFromPipeline=$true)][string] $CalendarAccessPermissions="None", [Parameter(Mandatory=$false, HelpMessage="Please Enter Contact Folder permissions to add to the Delegate",ValueFromPipeline=$true)][string] $ContactAccessPermissions="None", [Parameter(Mandatory=$false, HelpMessage="Grant the 'SendAs permission to Delegate",ValueFromPipeline=$true)][boolean] $GrantSendAs=$false, [Parameter(Mandatory=$false, HelpMessage="CSV Input file",ValueFromPipeline=$true)][string]$csv="none" ) #========================================================================== # Function that returns true if the incoming argument is a help request #========================================================================== function IsHelpRequest { param($argument) return ($argument -eq "-?" -or $argument -eq "-help"); } #========================================================================== # Function that returns true if the incoming argument is a help request #========================================================================== function Debug([string]$data) { $var = $null $var = get-variable($data) -ea SilentlyContinue if ($var) { write-host "DEBUG: " -foregroundcolor cyan -nonewline write-host $var.name " " -nonewline write-host "[$var.value]" } else { write-host "DEBUG: " -foregroundcolor cyan -nonewline write-host "[$data]" } } #========================================================================== # Wait until Key press #========================================================================== function Pause ($Message="Press any key to continue...") { Write-Host -NoNewLine $Message $null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") Write-Host "" } #=================================================================== # Function that displays the help related to this script following # the same format provided by get-help or <cmdletcall> -? #=================================================================== function Usage { @" NAME: AddDelegates.ps1 SYNOPSIS: AddDelegates to a Mailbox SYNTAX: AddDelegates.ps1 `t[-MbxtoDelegate <Mailbox UserName Or SMTP Address>] `t[-DelegatetoAdd <Mailbox UserName Or SMTP Address>] `t[-InboxAccessPermissions <Inbox Access Right>] `t[-CalendarAccessPermissions <Calendar Access Right>] `t[-ContactAccessPermissions <Contact Access Right>] `t[-GrantSendAs <True/False>] `t[-CSV <CSV file path>] PARAMETERS: -MbxtoDelegate (Requiered) Mailbox UserName Or SMTP Address of the mailbox you want to Delegate -DelegatetoAdd (Requiered) Mailbox UserName Or SMTP Address of the Delegate you want to Add -InboxAccessPermissions (Optionnal) Inbox Folder permissions to add to the Delegate -CalendarAccessPermissions (Optionnal) Calendar Folder permissions to add to the Delegate -ContactAccessPermissions (Optionnal) Contact Folder permissions to add to the Delegate -GrantSendAS (Optionnal) Determine if the delegate must have the SendAs permission on the mailbox -csv (Optionnal) Specify a CSV file which contains one delegate per line CSV header file: MbxtoDelegate,DelegatetoAdd,InboxAccessPermissions,CalendarAccessPermissions,ContactAccessPermissions,GrantSendAs -------------------------- EXAMPLE -------------------------- .\AddDelegates.ps1 -MbxtoDelegate dpekmez -DelegatetoAdd JohnDoe -InboxAccessPermissions Reviewer -CalendarAccessPermissions Editor -ContactAccessPermissions .\AddDelegates.ps1 -csv input.csv Mailbox folder and Calendar folder permission levels available : None, Owner, PublishingEditor, Editor, PublishingAuthor, Author, NoneditingAuthor, Reviewer, Contributor, Custom For more information of permission level, you might want to have a look on the MDSN web Site http://msdn.microsoft.com/en-us/library/bb856574(v=exchg.140).aspx "@ } #======================================= # Check for Usage Statement Request #======================================= $args | foreach { if (IsHelpRequest $_) { Usage; exit; } } #================================================================================= # Exchange WebServices #================================================================================= $dllpath = "C:\Program Files\Microsoft\Exchange\Web Services\1.1\Microsoft.Exchange.WebServices.dll" [void][Reflection.Assembly]::LoadFile($dllpath) $service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010) $windowsIdentity = [System.Security.Principal.WindowsIdentity]::GetCurrent() $sidbind = "LDAP://<SID=" + $windowsIdentity.user.Value.ToString() + ">" $aceuser = [ADSI]$sidbind $service.AutodiscoverUrl($aceuser.mail.ToString()) #================================================================================= # Get Current Domain #================================================================================= $domain = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain() #================================================================================= # Main #================================================================================= function AddDelegate ([string] $MbxtoDelegate,[string] $DelegatetoAdd,[string] $InboxAccessPermissions,[string] $CalendarAccessPermissions,[string] $ContactAccessPermissions,[boolean] $GrantSendAs) { #Connexion aux boites $Mailbox = $null;$Mailbox = get-mailbox $MbxtoDelegate -resultsize unlimited -ea stop $Delegate= $null;$Delegate = get-mailbox $DelegatetoAdd -resultsize unlimited -ea stop #initialisation des objets Web Services $service.ImpersonatedUserId = new-object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, $Mailbox.primarySMTPAddress.tostring()); $mbMailbox=$null ; $mbMailbox = new-object Microsoft.Exchange.WebServices.Data.Mailbox($Mailbox.primarySMTPAddress.tostring()) $dgUser=$null ; $dgUser = new-object Microsoft.Exchange.WebServices.Data.DelegateUser($Delegate.primarySMTPAddress.tostring()) $dgUser.ViewPrivateItems = $false $dgUser.ReceiveCopiesOfMeetingMessages = $false $dgUser.Permissions.InboxFolderPermissionLevel = [Microsoft.Exchange.WebServices.Data.DelegateFolderPermissionLevel]::$InboxAccessPermissions $dgUser.Permissions.CalendarFolderPermissionLevel = [Microsoft.Exchange.WebServices.Data.DelegateFolderPermissionLevel]::$CalendarAccessPermissions $dgUser.Permissions.ContactsFolderPermissionLevel = [Microsoft.Exchange.WebServices.Data.DelegateFolderPermissionLevel]::$ContactAccessPermissions $dgArray = new-object Microsoft.Exchange.WebServices.Data.DelegateUser[] 1 $dgArray[0] = $dgUser $Delegate_list = $service.GetDelegates($mbMailbox, $true) write-host "" # Permissions $Permissions = (get-MailboxFolderPermission $MbxtoDelegate) | where-object {$_.User.tostring() -eq $Delegate.DisplayName} if($Permissions -eq $null){ Write-host -ForegroundColor Green "Mailbox Folder Permissions not found ..." Write-host -ForegroundColor Green "Set permissions for: " -nonewline Write-host $Delegate.DisplayName -foregroundcolor cyan Add-MailboxFolderPermission -Identity $MbxtoDelegate -User $DelegatetoAdd -AccessRights $InboxAccessPermissions } elseif ($Permissions.AccessRights -eq $InboxAccessPermissions ) { Write-host -ForegroundColor Green "Mailbox Folder Permissions already set for: " -nonewline Write-host $Delegate.DisplayName -foregroundcolor cyan Write-host -ForegroundColor Green "Access Permissions: " -nonewline Write-host $InboxAccessPermissions -foregroundcolor cyan Write-host -ForegroundColor Green "Update sub folders permissions now ..." } else { Write-host -ForegroundColor Green "Mailbox Folder Permissions Different from : " -nonewline Write-host $InboxAccessPermissions -foregroundcolor cyan Write-host -ForegroundColor Green "for User: " -nonewline Write-host $Delegate.DisplayName -foregroundcolor cyan Write-host -ForegroundColor Green "Updating to Permissions : " -nonewline Write-host $InboxAccessPermissions -foregroundcolor cyan Remove-MailboxFolderPermission -Identity $MbxtoDelegate -User $DelegatetoAdd -confirm:$False Add-MailboxFolderPermission -Identity $MbxtoDelegate -User $DelegatetoAdd -AccessRights $InboxAccessPermissions Write-host -ForegroundColor Green "Update sub folders permissions now ..." } # Delegation [boolean]$IsAlreadyDelegate = $false ForEach($Response in $Delegate_list.DelegateUserResponses) { $userid = $response.DelegateUser.UserId if ($Delegate.primarySMTPAddress.tostring() -eq $userid.PrimarySMTPAddress.tostring()){$IsAlreadyDelegate = $true;break} } if (!($IsAlreadyDelegate)) {$service.AddDelegates($mbMailbox, [Microsoft.Exchange.WebServices.Data.MeetingRequestsDeliveryScope]::DelegatesAndMe, $dgArray) $action = "set" }else{ $service.updateDelegates($mbMailbox, [Microsoft.Exchange.WebServices.Data.MeetingRequestsDeliveryScope]::DelegatesAndMe, $dgArray) $action = "updated" } #Récap Write-Host "" Write-Host "Boite aux lettres : " -nonewline Write-Host $Mailbox.DisplayName -foregroundcolor cyan Write-Host "Utilisateur délégué: " -nonewline Write-Host $Delegate.DisplayName -foregroundcolor cyan Write-host -ForegroundColor Green "Inbox Permissions $action to:" -NoNewLine Write-host -ForegroundColor Yellow " " $InboxAccessPermissions " " -NoNewLine Write-host -ForegroundColor Green "Calendar Permissions $action to" -NoNewLine Write-host -ForegroundColor Yellow " " $CalendarAccessPermissions " " -NoNewLine Write-host -ForegroundColor Green "Contact Permissions $action to" -NoNewLine Write-host -ForegroundColor Yellow " " $ContactAccessPermissions # 'Send-AS' Permissions $SendAs = $false $Mailbox_permissions = get-adpermission $mailbox.identity -ea stop | where { $_.user.tostring() -eq ($domain.Name + "\" + $delegate.samaccountname.tolower())} foreach ($ADAcePresentationObject in $Mailbox_permissions){if ($ADAcePresentationObject.ExtendedRights -like "*Send*") {$SendAs = $true;break}} write-host "Send-As permission: " -nonewline -ForegroundColor Green if ($GrantSendAs -and !($SendAs)){ write-host " granted." -ForegroundColor Yellow Add-ADPermission $mailbox.identity -User $delegate.identity -Extendedrights "Send As"} if ($GrantSendAs -and $SendAs){write-host " already set." -ForegroundColor Yellow} if (!($GrantSendAs) -and !($SendAs)){write-host " not set." -ForegroundColor Yellow} if (!($GrantSendAs) -and $SendAs){ write-host " removed." -ForegroundColor Yellow remove-ADPermission $mailbox.identity -User $delegate.identity -Extendedrights "Send As" -confirm:$false} } #================================================================================= #MAIN #================================================================================= if ($csv -eq "none"){AddDelegate $MbxtoDelegate $DelegatetoAdd $InboxAccessPermissions $CalendarAccessPermissions $ContactAccessPermissions $GrantSendAs} else{ $curdir =(get-location).path if (!(test-path $csv)){$csv=$curdir+"\"+$csv} if (!(test-path $csv)){write-host "Impossible de trouver le fichier CSV:" -backgroundcolor red -nonewline ;write-host "'$csv'" -foregroundcolor cyan;write-host "";exit} $csvdata = import-csv $csv $csvdata | %{ [Boolean]$sa = $False;$sa = [System.Convert]::ToBoolean($_.GrantSendAs.tostring()) AddDelegate $_.MbxtoDelegate $_.DelegatetoAdd $_.InboxAccessPermissions $_.CalendarAccessPermissions $_.ContactAccessPermissions $sa} } #================================================================================= #Gestion des erreurs #================================================================================= trap { write-host "" if ( $_.FullyQualifiedErrorID.tostring().contains("GetMailbox")) { if ($_.Exception.Message.tostring().contains("introuvable")) { write-host "Impossible de trouver la boite aux lettres:" -backgroundcolor red -nonewline [int]$io1 = $_.Exception.Message.tostring().indexof("'",43) [int]$io2 = $_.Exception.Message.tostring().indexof("'",$io1+1) $bal = $_.Exception.Message.tostring().substring($io1+1,$io2-$io1-1) write-host " " $bal -foregroundcolor cyan write-host "" exit } } if ($_.Exception.Message.tostring().contains("DelegateFolderPermissionLevel")) { write-host "Permission incorrecte pour le dossier:" -backgroundcolor red -nonewline [int]$io1= $_.Exception.Message.tostring().indexof("«") [int]$io2= $_.Exception.Message.tostring().indexof("»") $folder = $_.Exception.Message.tostring().substring($io1+1,$io2-$io1-1) $folder = $folder -replace("FolderPermissionLevel","") write-host " " $folder -foregroundcolor cyan write-host "" write-host "Permissions prises en charge:" write-host "" write-host " - None" write-host " - Editor" write-host " - Reviewer" write-host " - Author" write-host " - Custom" write-host "" exit } if ($_.Exception.Message.tostring().contains("ToBoolean")) { write-host "Valeur incorrecte dans le ficheir CSV pour la colonne :" -backgroundcolor red -nonewline write-host " 'GrantSendAs'" -foregroundcolor cyan write-host "Valeurs autorisées : 'true' ou 'false'" write-host "" exit } write-host "" write-host "" write-host "------------------------------------------------------" write-host "categoryInfo: " -backgroundcolor red -nonewline write-host $_.categoryInfo write-host "Exception.GetType: " -backgroundcolor red -nonewline write-host $_.Exception.GetType().fullname write-host "FullyQualifiedErrorID: " -backgroundcolor red -nonewline write-host $_.FullyQualifiedErrorID write-host "Message: " -backgroundcolor red -nonewline write-host $_.Exception.Message write-host "------------------------------------------------------" exit }
Ce script est téléchargeable via le lien suivant
https://skydrive.live.com/?cid=deb7bf8a12d36694&sc=documents&id=DEB7BF8A12D36694%21410#
Voilà, j’espère que ce script vous sera utile !
Bonne lecture
David Pekmez