Using the Exchange Management Shell for Bulk Recipient Management

 

Dernière rubrique modifiée : 2007-03-26

Par Serdar Soysal

Dans Microsoft Exchange Server 2007, vous pouvez effectuer la plupart des tâches de gestion des destinataires dans la console de gestion Exchange et l’environnement de ligne de commande Exchange Management Shell. Pour les tâches impliquant des destinataires uniques, il est généralement plus simple d’utiliser la console de gestion Exchange (sauf si vous êtes immuniser contre les typos). Cependant, lorsque vous tentez de configurer des destinataires multiples, il n’existe tout simplement aucune alternative à la puissance et à la facilité d’utilisation de l’environnement de ligne de commande Exchange.

Pour moi, la courbe d’apprentissage pour l’environnement de ligne de commande Exchange Management Shell se compose de trois phases :

  1. « Ouah, c’est super, mais ça à l’air un peu compliqué. »

  2. « Hé ! Je viens de créer une boîte aux lettres sans utiliser la souris ! »

  3. « Je ne retournerai jamais à l’IU. » Je ne peux pas ! Je ne le ferais pas ! Rien de ce que vous direz ne me fera changer d’avis ! »

D’accord, peut être que la description de la troisième phase est un peu trop enthousiasme, mais vous voyez où je veux en venir. L’article Aperçu de l'environnement de ligne de commande Exchange Management Shell publié en janvier 2007 vous aidera à travers les deux premières phases. En espérant que ce que vous êtes sur le point de lire vous aidera à arriver à la troisième phase, au moins pour la gestion de destinataires.

Pour le rendre plus amusant, suivons comment un administrateur de destinataires, Amy, utilise l’environnement de ligne de commande Exchange pour effectuer les tâches qui lui sont attribuées un lundi.

Création de boîtes aux lettres

La première chose qu’Amy doit faire tous les lundi est de créer des boîtes aux lettres pour tous les nouveaux employés de cette semaine. Le département des ressources humaines (RH) envoi un fichier CSV (comma-separated value) Amy tous les lundi matin contenant les noms et les noms d’utilisateurs des nouveaux employés. Un fichier CSV typique des RH se présente comme suit :

Name,User Name
David Hamilton,DHamilton
Ezio Alboni,EAlboni
Rajesh M. Patel,RPatel
Kevin Liu,KLiu

Lors de la création de nouvelles boîtes aux lettres, Amy doit accomplir toutes les tâches suivantes :

  • Ajoutez l’extension contoso.com du nom principal d’utilisateur (UPN) à chaque nom d’utilisateur.

  • Attribuez pass@word1 comme mot de passe initial.

  • Configurez l’utilisateur pour modifier le mot de passe à la première connexion.

  • Spécifiez la base de données de la boîte aux lettres et l’unité d'organisation (UO) dans laquelle placer les nouvelles boîtes aux lettres.

Lorsque cette tâche récurrente lui a été attribué la première fois, elle a décidé d’utiliser l’environnement de ligne de commande Exchange Management Shell pour la réaliser de manière rapide. Elle a commencé par exécuter la commande suivante New-Mailbox, qui crée un utilisateur test nommé Utilisateur test 1.

New-Mailbox -Name "Test User 1" -UserPrincipalName "TUser1@contoso.com" -OrganizationalUnit "contoso.com/Users" -Database "Server01\Mailbox Database" -ResetPasswordOnNextLogon $true

La commande a fonctionné, mais l’a invité à entrer le mot de passe pour le nouvel utilisateur. La cmdlet New-Mailbox accepte uniquement des chaînes de caractères sécurisées pour le paramètre mot de passe, elle n’a donc pas pu utiliser la valeur du mot de passe par défaut comme texte clair dans la commande. Pour contourner ceci, elle a utilisé la cmdlet ConvertTo-SecureString pour créer une chaîne sécurisée à partir du mot de passe par défaut et l’enregistrer dans la variable définie par l’utilisateur $Temp. Elle a pu alors transmettre la variable au paramètre mot de passe de la cmdlet New-Mailbox.

$Temp = ConvertTo-SecureString "pass@word1" -asPlainText -force
New-Mailbox -Name "Test User 1" -UserPrincipalName "TUser1@contoso.com" -OrganizationalUnit "contoso.com/Users" -Database "Server01\Mailbox Database" -Password $Temp -ResetPasswordOnNextLogon $true

L’étape suivante était de lire les informations d’utilisateur partir du fichier CSV et d’automatiser la mise en service. Après avoir revu les exemple de gestion globale dans le blog de l’équipe Microsoft Exchange One-liners de gestion des destinataires Exchange Server 2007, elle a modifié son propre script pour accomplir cette tâche.

Notes

UNRESOLVED_TOKEN_VAL(exBlog)

$Temp = ConvertTo-SecureString "pass@word1" -asPlainText -Force
Import-CSV "C:\NewUsers.csv" | ForEach-Object -Process {New-Mailbox -Name $_.Name -UserPrincipalName "$($_.UserName)@contoso.com" -OrganizationalUnit "contoso.com/Users" -Database "Server01\Mailbox Database" -Password $Temp -ResetPasswordOnNextLogon $true}

Amy a pu configurer ce script en copiant la syntaxe de l’exemple dans l’article du blog. Cependant, elle n’a pas bien compris la fonction de la syntaxe $_. Après une petite recherche, elle trouva la rubrique Variables shell. L’article indique que $_ est une variable d’environnement de ligne de commande Exchange Management Shell contenant l’objet pipeline actuel. Par conséquent, à chaque fois que le bloc de scripts avec le paramètre Processus est exécuté dans son script, la variable $_ contient les données de la ligne suivante du fichier CSV.

Amy n’avait également pas bien compris la syntaxe utilisée lors de la configuration de l’UPN. C’était différent car la valeur de la variable n’était pas directement associée à un paramètre de la cmdlet New-Mailbox, mais était plutôt utilisée pour modifier une chaîne associée au paramètre. Amy a consulté la rubrique Syntaxe, qui discute de la syntaxe de commande pour l’environnement de ligne de commande Exchange Management Shell et trouva que la syntaxe $() est utilisée pour remplacer le résultat d’une commande par un argument dans un script. Dans l’environnement de ligne de commande Exchange Management Shell, si vous entrez uniquement une variable, le résultat est la valeur de cette dernière. Par conséquent, lorsque vous placez une dans un bloc $(), ce bloc est remplacé par la valeur de la variable. Dans son script, la variable $_.UserName contient le nom d’utilisateur. En plaçant cette variable dans une syntaxe $(), Amy a pu insérer la valeur de la variable dans la chaîne associée au paramètre UserPrincipalName.

Après en avoir appris davantage sur la syntaxe de commande dans l’environnement de ligne de commande Exchange Management Shell, Amy a franchi une étape supplémentaire en déplaçant la première ligne de son script au paramètre Début de la cmdlet ForEach-Object et transforma ceci en son propre one-liner de gestion de destinataires. Chaque lundi, elle a simplement branché le fichier CSV le plus récent des RH au script suivant.

Import-CSV "C:\NewUsers.csv" | ForEach-Object -Begin {$Temp = ConvertTo-SecureString "pass@word1" -asPlainText -Force} -Process {New-Mailbox -Name $_.Name -UserPrincipalName "$($_.UserName)@contoso.com" -OrganizationalUnit "contoso.com/Users" -Database "Server01\Mailbox Database" -Password $Temp -ResetPasswordOnNextLogon $true}

Cependant, les fichiers CSV actuels sont légèrement différents Le département RH a ajouté les postes et départements des nouveaux employés au fichier CSV.

Name,User Name,Title,Department
Deepak Kumar,DKumar,Marketing Analyst,Marketing
Ray Chow,RChow,Sales Associate,Sales
David Simpson,DSimpson,Sales Associate,Sales
Isabel Martins,IMartins,Administrative Assistant,Accounting

Le script d’Amy tel qu’il est ne fonctionnera pas avec le nouveau fichier CSV car les champs Poste et Département peuvent uniquement être mis à jour à l’aide de la cmdlet Set-User. Tout d’abord, elle considère écrire un autre script pour lire le même fichier puis utiliser la cmdlet Get-User et canaliser son résultat vers la cmdlet Set-User. Cependant, comme elle peut aussi canaliser le résultat de la cmdlet New-Mailbox vers la cmdlet Set-User, elle fini par modifier simplement son one-liner existant.

Import-CSV "C:\NewUsers.csv" | ForEach-Object -Begin {$Temp = ConvertTo-SecureString "pass@word1" -asPlainText -force} -Process {New-Mailbox -Name $_.Name -UserPrincipalName "$($_.UserName)@contoso.com" -OrganizationalUnit "contoso.com/Users" -Database "Server01\Mailbox Database" -Password $Temp -ResetPasswordOnNextLogon $true | Set-User -Title $_.Title -Department $_.Department}

Pour s’assurer que sa syntaxe est correcte, Amy consulte les rubriques Utilisation d’Exchange Management Shell et Cmdlets de boîtes aux lettres et de destinataires dans Microsoft Exchange Server 2007. Après avoir exécuté son propre one-liner, elle parcoure Utilisation des scripts avec Windows PowerShell : Script Center pour plus de détails sur l’utilisation des scripts dans Microsoft Windows PowerShell.

Utilisation des filtres avec des tâches de destinataires

Juste avant de quitter pour le déjeuner, Amy reçoit un message électronique urgent de son directeur, Joe. Joe a reçu une plainte du département Marketing Comme les employés Marketing envoient régulièrement des messages avec des pièces jointes de grande taille, le quota de stockage d’entreprise actuel est trop petit pour ce département. Joe demande à Amy d’augmenter le quota d’interdiction d’envoi pour tout le monde dans le Marketing à 500 mégaoctets (Mo) et de supprimer le quota d’interdiction de réception. Il lui demande également de faire de même pour tous les directeurs dans la société.

Amy sait qu’elle peut utiliser la cmdlet Get-User pour obtenir une liste de toutes les personnes qui travaillent dans le département Marketing ou occupent des postes spécifiques. Cependant, elle n’est pas certaine de la procédure de configuration des filtres corrects pour le faire. Une fois de plus, Amy consulte la documentation du produit. Pour plus de détails sur la configuration des filtres de destinataires personnalisés, elle lit la rubrique Création de filtres dans les commandes de destinataires. Pour plus de détails sur la configuration des filtres de destinataires personnalisés, elle lit la rubrique Création de filtres dans les commandes de destinataires. Amy vérifie alors que la commande suivante retournera toutes les boîtes aux lettres d’utilisateurs dans le département Marketing.

Get-User -Filter {Department -eq 'Marketing' -and RecipientTypeDetails -eq 'UserMailbox'}

Grâce aux normes de configuration de boîtes aux lettres dans sa société, Amy sait que dans l’organisation tous les directeurs, et uniquement les directeurs, ont le mot Directeur, VP, ou Responsable dans leur poste. Pour renvoyer les boîtes aux lettres de tous les directeurs dans l’organisation, elle configure le filtre suivant.

Get-User -Filter {((Title -like '*Manager*') -or (Title -like '*VP*') -or (Title -like '*Officer*')) -and (RecipientTypeDetails -eq 'UserMailbox')}

Amy combine alors les deux filtres et transfère le résultat à la commande Set-Mailbox dans le one-liner suivant. Elle définit le quota d’avertissement sur 450 Mo parce que la stratégie de la société est d’envoyer un avertissement lorsque la boîte aux lettres de l’utilisateur est à 90 pourcent de sa capacité.

Get-User -Filter {((Title -like '*Manager*') -or (Title -like '*VP*') -or (Title -like '*Officer*') -or (Department -eq 'Marketing')) -and (RecipientTypeDetails -eq 'UserMailbox')} | Set-Mailbox -IssueWarningQuota 450MB -ProhibitSendQuota 500MB -ProhibitSendReceiveQuota unlimited -UseDatabaseQuotaDefaults $false 

Amy envoie une note à son directeur indiquant qu’elle s’est occupé des quotas de boîtes aux lettres pour le département et la direction Marketing. Elle prend mentalement note de programmer une réunion avec son directeur pour revisiter les exigences de stockage pour les serveurs de boîtes aux lettres. Il est temps de prendre un déjeuner bien mérité.

Configuration des destinataires

Lorsque Amy revient du déjeuner, elle voit un message de Joe la remerciant de s’être occupé des quotas de stockage si rapidement. Il demande si elle peut lui envoyer une liste des personnes dont les quotas de stockage ont été mis à jour afin qu’il puisse envoyer un message présentant la modification. Elle décide de lui rendre la tâche facile en créant un groupe de distribution. Elle crée d’abord un groupe de distribution nommé Exceptions de quota. Pour peupler la liste de membres pour le nouveau groupe de distribution, elle utilise la cmdlet ForEach-Object et le filtre qu’elle a utilisé pour configurer les boîtes aux lettres.

New-DistributionGroup -Name "Quota Exceptions" -OrganizationalUnit "contoso.com/Users" -SamAccountName "QuotaExceptions" -Type Distribution
Get-User -Filter {((Title -like '*Manager*') -or (Title -like '*VP*') -or (Title -like '*Officer*') -or (Department -eq 'Marketing')) -and (RecipientTypeDetails -eq 'UserMailbox')} | ForEach-Object -Process {Add-DistributionGroupMember -Identity "Quota Exceptions" -Member $_.Name}

Comme Amy veut s’assurer que ce groupe de distribution n’est pas utilisé accidentellement, elle le configure pour accepter uniquement les messages de son directeur et la masque aux listes d’adresses Exchange en exécutant la commande suivante.

Set-DistributionGroup -Identity "Quota Exceptions" -AcceptMessagesOnlyFrom "Joe Healy" -HideFromAddressListsEnabled $true

Au moment d’informer Joe d’utiliser ce groupe de distribution, Amy réalise qu’à l’avenir, il peut être de nouveau nécessaire de configurer les quotas pour ces utilisateurs de boîtes aux lettres. Il serait utile de disposer d’un groupe de distribution à jour pour ces utilisateurs. Elle décide donc d’utiliser un groupe de distribution dynamique à la place car il sera toujours à jour. Elle supprime le groupe de distribution qu’elle vient de créer et crée à la place le groupe de distribution dynamique appelé Directeurs et utilisateurs du département Marketing. Elle utilise le filtre qu’elle a utilisé pour la cmdlet Get-User comme filtre de destinataires pour le nouveau groupe de distribution dynamique.

New-DynamicDistributionGroup -Name "Managers and Marketing Department Users" -Alias "MgrsMktgUsers" -OrganizationalUnit Users -RecipientFilter {((Title -like '*Manager*') -or (Title -like '*VP*') -or (Title -like '*Officer*') -or (Department -eq 'Marketing')) -and (RecipientTypeDetails -eq 'UserMailbox')} | Set-DynamicDistributionGroup -AcceptMessagesOnlyFrom "Joe Healy" -HiddenFromAddressListsEnabled $true

À l’aide des étapes indiquées dans la rubrique Comment afficher les membres d’un groupe de distribution dynamique, elle vérifie que le groupe de distribution dynamique est configuré correctement. Elle envoie un message indiquant à son directeur d’envoyer simplement son message à l’adresse de messagerie MgrsMktgUsers@contoso.com et explique comment le groupe de distribution dynamique est configuré.

Connexion des boîtes aux lettres

Amy se connecte ensuite à l’outil de gestion d’incidents de sa société et consultent les tickets de service qui lui ont été acheminés à partir de l’assistance. Il existe une requête pour reconnecter une boîte aux lettres, Don Hall, qui a été désactivée il y a deux semaines. Amy a du connecter une autre boîte aux lettres le mois précédent. À ce moment, elle ne savait pas quelle base de donnée contenait cette boîte aux lettre d’utilisateur lorsqu’elle a été déconnectée. À l’aide de la console de gestion Exchange, elle a du se connecter à tous les serveurs de boîtes aux lettres pour voir si la boîtes aux lettres déconnectée y était stockée.

Amy ne veut pas endurer de nouveau la même recherche. Par conséquent, elle décide de trouver un moyen plus simple de déterminer le serveur qui contient la boîte aux lettres déconnectée. Elle découvre que les données retournées par la cmdlet Get-MailboxStatistics comprend des informations sur le boîtes aux lettres déconnectées. Cependant, elle désire réduire le résultat de cette cmdlet à la boîte aux lettres qu’elle recherche. Après avoir lu la rubrique Utilisation du résultat des commandes, elle apprend que la cmdlet Where permet d’accomplir ceci. Pour tester ceci, elle crée une boîte aux lettres de test appelé Utilisateur test 1 dans la base de données de boîtes aux lettres MBX4 sur le Serveur03 et la désactive. Elle exécute ensuite la commande suivante.

Get-MailboxStatistics -Database "Server03\MBX4" | Where {$_.DisplayName -eq 'Test User 1'}

La cmdlet renvoie le résultats suivant :

DisplayName         ItemCount    StorageLimitStatus    LastLogonTime
-----------         ---------    ------------------    -------------
Test User 1         434                  BelowLimit

Le filtre fonctionne comme prévu, mais le résultat de la cmdlet n’est pas vraiment utile à Amy dans sa forme actuelle. Comme elle prévoit d’utiliser cette cmdlet pour localiser le serveur dans l’organisation sur laquelle la boîte aux lettres connectée existe, elle requiert que le résultat affiche le nom complet, le nom de serveur et le nom de la base de données. Par conséquent, elle formate le résultat de sa cmdlet pour réaliser ceci.

Get-MailboxStatistics -Database "Server03\MBX4" | Where {$_.DisplayName -eq 'Test User 1'} | Format-Table DisplayName,ServerName,DatabaseName

Le résultat suivant est affiché et est maintenant plus utile pour ses fins :

Display Name        ServerName          DatabaseName
------------        ----------          ------------
Test User 1         Server03            MBX4

Maintenant qu’Amy dispose de la syntaxe de commande qu’elle voulait, elle doit utiliser la commande pour effectuer une recherche dans toutes les bases de données de boîtes aux lettres dans l’organisation au lieu d’une spécifique. Elle canalise donc le résultat de la cmdlet Get-MailboxDatabase vers la syntaxe de commande qu’elle a construite et exécute le one-liner suivant.

Get-MailboxDatabase | Get-MailboxStatistics | Where {$_.DisplayName -eq 'Don Hall'} | Format-Table DisplayName,ServerName,DatabaseName

La cmdlet fonctionne comme prévu, et elle localise la base de données dans laquelle la boîte aux lettres de Don Hall existait avant d’être déconnectée. Elle franchit une étape supplémentaire et combine les étapes décrites dans la rubrique Procédure de connexion d’une boîte aux lettres avec son one-liner et utilise la commande suivante pour connecter la boîte aux lettres.

Get-MailboxDatabase | Get-MailboxStatistics | Where {$_.DisplayName -eq 'Don Hall'} | Connect-Mailbox -User DHall@contoso.com

Amy passe le reste de la journée à parcourir Microsoft Exchange Server TechCenter et le Blog de l’équipe Microsoft Exchange pour de nouvelles informations.

Notes

UNRESOLVED_TOKEN_VAL(exBlog)

Pour plus d'informations

Comme vous pouvez le constater à partir des exemples précédents, vous pouvez rapidement accomplir des tâches de gestion de destinataires en apparence complexes en combinant plusieurs cmdlets et divers fonctionnalités de l’environnement de ligne de commande Exchange Management Shell.

Pour plus d'informations sur la gestion des destinataires dans Exchange 2007 et dans l'environnement de ligne de commande Exchange Management Shell, consultez les ressources suivantes :

Serdar Soysal Serdar Soysal - rédacteur technique senior, Microsoft Exchange Server