Exemple de code permettant une extraction des permissions MAPI & AD d'une OU complète vers un fichier .CSV pour Exchange 2003
Je me permets de partager avec vous un exemple de code qui peut se révéler pratique dans certains cas.
Cet exemple de code devrait vous permettre d’extraire l’ensemble des permissions MAPI mises en place sur les dossiers d’une BAL (Calendrier, Inbox, etc.) ainsi que l’ensemble des permissions de l’AD qui nous intéresse en général dans une optique Exchange (‘Send As’, ‘Receive As’, etc.). Le tout est donc synthétisé dans un fichier .CSV facilement exploitable dans Excel. L’idée est ainsi de pouvoir vérifier rapidement les différentes délégations mises en place par les utilisateurs. Ce code vise plutôt une architecture basée sur du Exchange 2003. Il existe quelque chose de similaire pour Exchange 2007 ici : https://gsexdev.blogspot.com/2008/04/exchange-permission-and-reverse.html en Powershell.
La pièce jointe ExtractMAPIPermissionsAndActiveDirectoryPermissions.zip contient les éléments suivants:
- La version script VBS du code à utiliser : ExtractMAPIPermissionsAndActiveDirectoryPermissions.vbs
- Le projet VB6 ayant servi de base pour la réalisation du script (pour rappel VB6 n’est plus supporté depuis Avril 2008)
- La DLL acl.dll à enregistrer sur la machine cible (via regsvr32.exe)
- Un exemple de résultat en .csv puis en .xlsx de la sortie générée par le code.
Je tiens à vous préciser que ce code ne constitue qu'un exemple et n'est pas supporté en tant que tel. Vous devez notamment être en mesure de lire, comprendre & modifier ce code avant toute mise en production.
Pour fonctionner, ce code a besoin des pré-requis suivant :
1 - CDO 1.21 (CDO.DLL) disponible avec Outlook 2003/Exchange 2003 sinon à télécharger ici: https://www.microsoft.com/downloads/details.aspx?familyid=2714320d-c997-4de1-986f-24f081725d36&displaylang=en pour les postes Outlook 2007/Exchange 2007.
2 - ACL.DLL : à enregistrer sur la machine via la commande "regsvr32.exe acl.dll"
3 - Le code doit tourner sous l'autorité d'un compte ayant les droits d'ouverture de session MAPI sur l'ensemble des BALs visées (pour l'extraction des permissions sur les différents dossiers MAPI)
Utilisation du script :
cscript ExtractMAPIPermissionsAndActiveDirectoryPermissions.Vbs CHEMIN_LDAP_VERS_OU CHEMIN_VERS_LE_FICHIER_CSV
Exemples:
- cscript ExtractMAPIPermissionsAndActiveDirectoryPermissions.Vbs * c:\ExchangeRights.csv
--> Extrait l'ensemble des permissions MAPI & AD sur l'ensemble des utilisateurs de l'organisation (RootDSE)
--> dans le fichier 'c:\ExchangeRights.csv'
- cscript ExtractMAPIPermissionsAndActiveDirectoryPermissions.Vbs LDAP://DAVROUS2k3.COM/OU=BatchClient,DC=davrous2k3,DC=com c:\temp\test.csv
--> Extrait l'ensemble des permissions MAPI & AD des utilisateurs du chemin LDAP suivant:
--> 'LDAP://DAVROUS2k3.COM/OU=BatchClient,DC=davrous2k3,DC=com' dans le fichier 'c:\temp\test.csv'
Vous retrouverez cette description en lançant le script sans paramètre ou avec le mauvais nombre de paramètres.
Vous avez donc 2 possibilités :
1 – Lancer le code sur l’ensemble de votre organisation (via l’opérateur * pour le 1er paramètre)
2 – Lancer le code que sur une OU particulière en précisant le chemin LDAP complet vers celle-ci en 1er paramètre.
Une fois le code lancé, voici un exemple de résultat :
1 – Sortie dans la commande :
On voit ici la logique du code. Pour chacun des utilisateurs de l’OU visée par le code :
- On commence par effectuer une ouverture de session MAPI vers la boîte aux lettres de l’utilisateur pour en extraire les permissions « Outlook » au niveau de chacun des dossiers (Boîte de réception, Calendrier, etc.) à utilisation de CDO 1.21 & ACL.DLL sur cette partie. Ce sera la partie la plus couteuse en terme de performance.
- On enchaîne en tentant de récupérer une liste de délégués pour le droit « Envoyer de la part de » (issue de l’attribut publicDelegates de l’AD). Ce droit "Send On Behalf" est stocké dans l'onglet "Exchange General" --> "Delivery Options"
- Ensuite, on regarde si des utilisateurs disposent des droits « Send-As », « Receive-As » ou de droits personnalisés. Ces droits sont stockés dans l’attribut ntSecurityDescriptor.
- Pour terminer, on vérifie si des utilisateurs disposent du droit « Full Mailbox Access ». Ce droit est stocké dans l’attribut msExchMailboxSecurityDescriptor.
2 – Ouverture du fichier .CSV dans Excel 2007 et exemple de possibilités de filtrage sur le résultat. Ici on filtre pour l’afficher que ceux qui ont un droit de type « Full Mailbox Access » :
Note: je récupère les délégués depuis l’AD à travers l’attribut "publicDelegates". Attention la liste n’est pas forcément complète. Quand l’utilisateur n’a pas accès en écriture, Outlook ne met rien dans l’attribut et ne lève pas forcément de message d’erreur ni n’empêche le delegate wizard de se terminer. Il faudrait donc éventuellement envisager de récupèrer la liste à partir du message LocalFreebusy dans le dossier FreebusyData de la boite.
Voici les propriétés MAPI à considérer:
#define PR_DELEGATE_NAMES PROP_TAG(PT_MV_STRING8,0x6844) //Outlook 2003
#define PR_DELEGATE_NAMES2 PROP_TAG(PT_MV_STRING8,0x684A) //Outlook 2007
Enjoy !
-= David =-