Académique Documents
Professionnel Documents
Culture Documents
Power Shell
Power Shell
Windows
Tyson Kopczynski
Gnie logiciel
Rfrence
Windows PowerShell
Tyson Kopczynski
CampusPress a apport le plus grand soin la ralisation de ce livre an de vous fournir une information complte et able. Cependant, CampusPress nassume de responsabilits, ni pour son utilisation, ni pour les contrefaons de brevets ou atteintes aux droits de tierces personnes qui pourraient rsulter de cette utilisation. Les exemples ou les programmes prsents dans cet ouvrage sont fournis pour illustrer les descriptions thoriques. Ils ne sont en aucun cas destins une utilisation commerciale ou professionnelle. CampusPress ne pourra en aucun cas tre tenu pour responsable des prjudices ou dommages de quelque nature que ce soit pouvant rsulter de lutilisation de ces exemples ou programmes. Tous les noms de produits ou marques cits dans ce livre sont des marques dposes par leurs propritaires respectifs.
Publi par CampusPress 47 bis, rue des Vinaigriers 75010 PARIS Tl. : 01 72 74 90 00
Ralisation pao : La B.
ISBN original : 978-0-672-32953-1 Copyright 2007 by Sams Publishing All rights reserved.
ISBN : 978-2-7440-4015-3 Copyright 2009 Pearson Education France Tous droits rservs
Aucune reprsentation ou reproduction, mme partielle, autre que celles prvues larticle L. 122-5 2 et 3 a) du code de la proprit intellectuelle ne peut tre faite sans lautorisation expresse de Pearson Education France ou, le cas chant, sans le respect des modalits prvues larticle L. 122-10 dudit code.
1 1 2 2
7 8 17 18 20 21 21 22 25 26 38 41 47 49 53 57 59 62 65
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Avant de commencer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Accder PowerShell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Comprendre linterface en ligne de commande . . . . . . . . . . . . . . . . . . . . . . . . . . . Comprendre les applets de commande . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Quelques applets de commande utiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Comprendre les variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Comprendre les alias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Squences dchappement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Comprendre les portes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Premier script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . En rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
IV
Windows PowerShell
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Orientation objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Comprendre les fournisseurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Comprendre les erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Grer les erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Prols . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Comprendre la scurit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Langage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . En rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Chapitre 4 Signer du code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
67 67 68 86 93 95 99 101 107 108 109 109 110 111 117 119 120 123 125 125 126 129 137 139 141
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Quest-ce que la signature du code ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Obtenir un certicat de signature du code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Signer des scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Vrier des signatures numriques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Distribuer du code sign . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . En rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Chapitre 5 Suivre les bonnes pratiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dvelopper des scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Concevoir des scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Scuriser des scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Utiliser les standards dcriture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . En rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Partie II. Appliquer ses connaissances PowerShell
Chapitre 6 PowerShell et le systme de chiers . . . . . . . . . . . . . . . . . . . . . . . . . . .
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Grer le systme de chiers depuis WSH et PowerShell . . . . . . . . . . . . . . . . . . . . Manipuler les autorisations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . De VBScript PowerShell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . En rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Windows PowerShell
179 179 179 184 205 207 207 207 215 229 231 231 231 238 261
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Comparer lutilisation de WMI dans WSH et dans PowerShell . . . . . . . . . . . . . . De VBScript PowerShell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . En rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Chapitre 9 PowerShell et Active Directory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Comparer lutilisation dADSI dans WSH et dans PowerShell . . . . . . . . . . . . . . . De VBScript PowerShell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . En rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Partie III. Utiliser PowerShell pour les besoins dautomation
Chapitre 10 Utiliser PowerShell en situation relle . . . . . . . . . . . . . . . . . . . . . . . .
265 265 277 292 293 293 294 299 309 320 328 331
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exchange Management Shell (EMS) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Le script GetDatabaseSizeReport.ps1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Le script GetEvent1221Info.ps1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Le script ProvisionExchangeUsers.ps1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . En rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
propos de lauteur
Avec plus de neuf annes dexprience dans le domaine informatique, Tyson Kopczynski est devenu un spcialiste dActive Directory, des stratgies de groupe, des scripts Windows, de Windows Rights Management Services, de PKI et de la scurit des technologies de linformation. Il a contribu lcriture de livres tels que Microsoft Internet Security and Acceleration (ISA) Server 2004 Unleashed et Microsoft Windows Server 2003 Unleashed (R2 Edition). Par ailleurs, il a crit plusieurs articles techniques et des guides dtaills sur les diffrentes technologies quil matrise. En tant que consultant pour Convergent Computing (CCO), Tyson a pu travailler avec la nouvelle gnration de technologies Microsoft depuis leur dbut et a jou un rle essentiel dans le dveloppement des pratiques dcriture de scripts. Tyson est galement titulaire de nombreuses certications en scurit, dont GIAC Security Essentials Certication (GSEC), Microsoft Certied Systems Engineer (MCSE) Security, CompTIA Security+ et GIAC Certied Incident Handler (GCIH).
Introduction
Lorsque jai commenc lcriture de Windows PowerShell, jtais en train de lire un ouvrage sur linfrastructure cl publique (PKI, Public Key Infrastructure). Les informations de fond et de rfrence sur PKI taient certes trs intressantes mais il manquait des dtails sur la mise en application de cette infrastructure dans un environnement rel. En lisant bon nombre de livres techniques, jai souvent regrett labsence de prsentation pratique. Cest pourquoi jai dcid daborder cet ouvrage sur PowerShell de manire diffrente de la plupart des livres techniques habituels. Vous lisez les rsultats de ce choix. Bien que ce livre contienne des informations de rfrence dtailles sur PowerShell, jai essay de montrer aux lecteurs comment ils pouvaient employer cet outil pour rpondre leurs besoins prcis. Cette approche nest sans doute pas nouvelle ni rvolutionnaire, mais jespre quelle vous apportera une vue unique sur lun des futurs produits les plus impressionnants de Microsoft. Cette dernire phrase nest en aucun cas une publicit pour Microsoft. Lquipe de PowerShell a rellement cr un interprteur de commandes (shell) agrable, simple, amusant et, nen pas douter, puissant. Je suis impatient de connatre ce que Microsoft a en rserve pour PowerShell et dans quels produits il sera utilis.
Notre public
Cet ouvrage est destin aux administrateurs systme de niveau intermdiaire, qui ont investi du temps et de lnergie apprendre lcriture de scripts Windows et qui souhaitent convertir cette comptence en connaissances PowerShell, tout en voyant comment il peut rpondre leurs besoins rels. Il a t crit an que quiconque possdant une exprience des scripts puisse comprendre les objectifs de PowerShell et son utilisation, mais il nen est pas un guide complet. Vous devez le voir comme une ressource permettant de vous apprendre exploiter PowerShell dans votre propre environnement. Sa structure rete donc cet objectif en incluant de nombreux exemples de commandes et de scripts oprationnels.
Windows PowerShell
Organisation de ce livre
Cet ouvrage est divis en trois parties :
n
Partie I, "Introduction PowerShell". Cette partie prsente PowerShell et son utilisation, explique pourquoi PowerShell est n, dcrit son utilisation gnrale, dtaille la signature de code et tablit les meilleures pratiques PowerShell. Partie II, "Appliquer ses connaissances PowerShell". Cette partie explique point point comment exploiter ses connaissances en criture de scripts Windows pour apprendre le dveloppement de scripts PowerShell. Elle traite de sujets comme la manipulation du systme de chiers de Windows, le Registre, WMI (Windows Management Instrumentation) et ADSI (Active Directory Services Interfaces). Pour vous aider, elle propose des exemples de tches dautomation et des scripts oprationnels, tant en VBScript quen PowerShell. Partie III, "Utiliser PowerShell pour les besoins d'automation". Cette partie a pour objectif daller plus loin sur lutilisation de PowerShell dans la gestion de systmes. Elle dcrit comment employer PowerShell pour rpondre aux besoins de scurit, automatiser les modications sur de nombreux systmes et grer Exchange Server 2007.
Conventions typographiques
Les commandes, les scripts et tout ce qui a trait au code sont prsents dans une police particulire chasse constante. Le texte en gras indique la dnition dun terme. Litalique est utilis pour dsigner des variables et parfois pour une mise en exergue. Les lettres majuscules et minuscules, les noms et la structure sont utiliss de manire cohrente an que les exemples de commandes et de scripts soient plus lisibles. Par ailleurs, vous rencontrerez des cas o des commandes ou des scripts nont pas t totalement optimiss. Ce choix est volontaire, car il facilite la comprhension de ces exemples et se conforme aux pratiques encourageant une meilleure lisibilit du code. Pour plus de dtails sur la prsentation, les conventions et les pratiques employes pour les commandes et les scripts dans ce livre, consultez le Chapitre 5, "Suivre les bonnes pratiques".
Introduction
Voici les autres conventions typographiques de cet ouvrage1 : Zones de code en noir
Ces zones de code contiennent des commandes excuter dans une session PowerShell ou Bash.
INFO Ces notes proposent des informations supplmentaires sur le sujet en cours.
1. N.d.T. : Dans les zones de code, les csures sont reproduites dans le livre telles quelles apparaissent lcran.
En revanche, nous avons pris le parti de corriger les ventuelles fautes dorthographe.
I
Introduction PowerShell
1
Introduction aux shells et PowerShell
Dans ce chapitre
Partie 1
Introduction PowerShell
Rle du shell
Un shell est une interface qui permet aux utilisateurs dinteragir avec le systme dexploitation. Un shell nest pas considr comme une application car il est incontournable, mais il quivaut nimporte quel autre processus sexcutant sur un systme. Le shell diffre dune application dans la mesure o son rle est de permettre aux utilisateurs dexcuter des applications. Dans certains systmes dexploitation, comme UNIX, Linux ou VMS, il sagit dune interface en ligne de commande (CLI, Command-line Interface). Dans dautres, comme Windows et Mac OS X, il sagit dune interface utilisateur graphique. Par ailleurs, lorsquon parle de shells, il est frquent de ngliger deux types de systmes pourtant trs rpandus : les quipements rseau et les kiosques. Les dispositifs rseau possdent gnralement un shell graphique (une interface Web sur du matriel grand public) ou un interprteur de ligne de commande (sur le matriel industriel). Les kiosques sont tout fait diffrents. Puisquils sont nombreux tre construits partir dapplications sexcutant au-dessus dun systme dexploitation plus robuste, les interfaces sont rarement des shells. Cependant, si le kiosque sappuie sur un systme dexploitation ddi, linterface peut tre vue comme un shell. Malheureusement, les interfaces des kiosques sont encore dsignes de manire gnrique comme des shells car il est difcile dexpliquer la diffrence aux utilisateurs non techniques (ce qui conduit lautomation des tches et, par consquent, une plus grande efcacit dexcution ainsi qu une meilleure prcision et cohrence de ralisation). Les shells en ligne de commande et les shells graphiques ont des avantages et des inconvnients. Par exemple, la plupart des shells CLI autorisent un enchanement puissant des commandes (des commandes envoient leur sortie dautres pour traitement ; il sagit dun fonctionnement en pipeline ou tube). En revanche, les shells graphiques exigent que les commandes fonctionnent en totale indpendance. Par ailleurs, la plupart des shells graphiques proposent une navigation simple, tandis que les versions CLI supposent la connaissance du systme an de ne pas avoir tester plusieurs commandes pour mener bien une tche dautomation. Votre choix du shell dpend de vos habitudes et de ce qui est le mieux adapt la ralisation manuelle dune tche. Mme si les shells graphiques existent, le terme "shell" est employ presque exclusivement pour dcrire un environnement en ligne de commande, non une tche effectue avec une application graphique comme lExplorateur Windows. De mme, lcriture de scripts shell fait rfrence lassemblage de commandes normalement saisies sur la ligne de commande ou dans un chier excutable.
Chapitre 1
Trs souvent, la simple prsentation des noms de chiers ne suft pas et il faut donner un argument la commande pour obtenir plus de dtails.
INFO Si ces commandes ne vous sont pas familires, pas de panique. Nous les donnons uniquement des ns dillustration, non pour vous enseigner les complexits du shell Bash.
Largument pass la commande suivante permet dafcher des informations plus dtailles sur chaque chier :
$ ls l total 8 drwxr-xr-x drwxrwxr-x drwxrwxr-x drwxrwxr-x drwxrwxr-x drwxrwxr-x lrwxr-xr-x drwxrwxr-x drwxrwxr-x drwxrwxr-x 13 root 57 root 5 root 30 root 102 root 3 root 1 root 3 root 13 root 3 root admin admin admin admin admin admin admin admin admin admin 442 Sep 18 20:50 apache2 1938 Sep 19 22:35 bin 170 Sep 18 20:50 etc 1020 Sep 19 22:30 include 3468 Sep 19 22:30 lib 102 Sep 18 20:11 libexec 9 Sep 18 20:12 man -> share/man 102 Sep 18 20:11 sbin 442 Sep 19 22:35 share 102 Jul 30 21:05 var
10
Partie 1
Introduction PowerShell
Nous devons prsent dcider de lutilisation de ces informations. Comme vous pouvez le constater, les rpertoires et les chiers sont mlangs. Il est donc difcile de les distinguer. Pour nafcher que les rpertoires, nous pouvons ltrer les rsultats en envoyant la sortie de la commande ls vers la commande grep. Dans lexemple suivant, la sortie a t rduite an de nafcher que les lignes commenant par la lettre d, qui indique que le chier est un rpertoire (directory).
$ ls -l | grep ^d drwxr-xr-x drwxrwxr-x drwxrwxr-x drwxrwxr-x drwxrwxr-x drwxrwxr-x drwxrwxr-x drwxrwxr-x drwxrwxr-x 13 root 57 root 5 root 30 root 102 root 3 root 3 root 13 root 3 root admin admin admin admin admin admin admin admin admin 442 Sep 18 20:50 apache2 1938 Sep 19 22:35 bin 170 Sep 18 20:50 etc 1020 Sep 19 22:30 include 3468 Sep 19 22:30 lib 102 Sep 18 20:11 libexec 102 Sep 18 20:11 sbin 442 Sep 19 22:35 share 102 Jul 30 21:05 var
Nous disposons ainsi dune liste contenant uniquement les rpertoires, mais les autres informations, comme la date, les autorisations, la taille, etc., sont superues car seuls les noms des rpertoires nous intressent. Dans lexemple suivant, nous utilisons la commande awk pour afcher seulement la dernire colonne de la sortie prcdente.
$ ls -l | grep ^d | awk { print $NF } apache2 bin etc include lib libexec sbin share var
Nous obtenons alors une simple liste des sous-rpertoires du rpertoire de travail. Cette commande est assez directe, mais nous ne voulons pas la saisir chaque fois que nous souhaitons
Chapitre 1
11
obtenir une liste de rpertoires. Nous crons donc un alias ou un raccourci de commande correspondant celles que nous venons dexcuter.
$ alias lsd="ls -l | grep ^d | awk { print \$NF }"
Ensuite, grce lalias lsd, nous pouvons afcher la liste des sous-rpertoires du rpertoire en cours sans avoir saisir lintgralit de la commande employe dans les exemples prcdents.
$ lsd apache2 bin etc include lib libexec sbin share var
Vous pouvez ainsi le deviner, un shell en ligne de commande ouvre de grandes possibilits pour lautomation de simples tches rptitives.
12
Partie 1
Introduction PowerShell
Runir des commandes dune ligne et des pipelines dans des chiers pour pouvoir les excuter ultrieurement est une technique puissante. Placer une sortie dans des variables pour y faire rfrence ensuite dans le script et la soumettre diffrentes manipulations nous fait passer au niveau de puissance suprieure. Embarquer des combinaisons de commandes dans des boucles rcursives et des constructions de contrle du ux fait de lcriture de scripts une forme de programmation. Certains diront que criture de scripts et programmation sont deux choses diffrentes. Mais cest faux, en particulier si lon considre la diversit et la puissance des langages de scripts actuels. En ce sens, lcriture de scripts nest pas diffrente, tout comme la compilation du code ne signie pas ncessairement que lon programme. En gardant cela lesprit, essayons de dvelopper notre commande dune ligne de la section prcdente en quelque chose de plus utile. Nous disposons dune liste des sous-rpertoires du rpertoire de travail. Supposons que nous voulions crire un outil qui afche lespace disque occup par chaque rpertoire. La commande bash, qui afche lutilisation de lespace disque, opre sur lintgralit du contenu du rpertoire indiqu ou sur la globalit dun rpertoire dans un rcapitulatif ; elle donne galement la quantit en octets, par dfaut. Si nous souhaitons connatre lespace disque occup par chaque rpertoire en tant quentit autonome, nous devons obtenir et afcher les informations pour chaque rpertoire, un par un. Les exemples suivants montrent comment programmer ce comportement dans un script. Rappelez-vous la commande crite la section prcdente. La boucle for suivante prend chaque rpertoire indiqu dans la liste retourne par cette commande, laffecte la variable DIR et excute le code qui se trouve entre les mots cls do et done.
#!/bin/bash
for DIR in $(ls -l | grep ^d | awk { print $NF }); do du -sk ${DIR} done
Nous enregistrons ce code dans le chier de script big_directory.sh. Lexcution de ce script dans une session Bash produit la sortie suivante.
Chapitre 1
13
$ big_directory.sh 17988 5900 72 2652 82264 0 0 35648 166768 apache2 bin etc include lib libexec sbin share var
Cette sortie ne semble pas particulirement intressante. En ajoutant quelques instructions, nous pouvons crire un traitement utile, par exemple pour connatre les noms des rpertoires qui occupent plus dune certaine quantit despace disque. Pour cela, modiez le chier big_directory.sh de la manire suivante.
#!/bin/bash
PRINT_DIR_MIN=35000
for DIR in $(ls -l | grep ^d | awk { print $NF }); do DIR_SIZE=$(du -sk ${DIR} | cut -f 1) if [ ${DIR_SIZE} -ge ${PRINT_DIR_MIN} ];then echo ${DIR} done
Nous avons ajout des variables. PRINT_DIR_MIN prcise le nombre minimal de kilo-octets quun rpertoire doit occuper pour mriter dtre afch. Puisque cette valeur peut tre change relativement souvent, elle doit pouvoir ltre facilement. De mme, nous pouvons la rutiliser ailleurs dans le script an dviter davoir la modier en de multiples endroits.
14
Partie 1
Introduction PowerShell
Vous pourriez penser que la commande nd pourrait avantageusement remplacer ce script. Cependant, nous utilisons cette commande ls complique car, si nd est parfaitement adapte au parcours des structures hirarchiques, elle est trop lourde pour le simple afchage du rpertoire courant. Si vous recherchez des chiers dans une arborescence, nous vous conseillons fortement la commande nd. Mais, nous examinons simplement les sous-rpertoires du rpertoire de travail car, dans cet exemple, ils sont les seuls pertinents. Voici un exemple de sortie obtenue par notre script.
$ big_directory.sh lib share var
Nous pouvons lexploiter de diffrentes manires. Par exemple, les administrateurs systme pourraient se servir de ce script pour surveiller loccupation disque des rpertoires des utilisateurs et leur envoyer un message lorsquils dpassent un certain seuil. Pour cela, il peut tre intressant de savoir lorsquun certain pourcentage des utilisateurs atteint ou dpasse le seuil.
INFO Vous devez savoir quil existe aujourdhui sur le march de nombreux produits commerciaux qui avertissent les administrateurs lorsque des seuils doccupation des disques sont dpasss. Par consquent, mme si vous pouvez conomiser de largent en crivant un script shell pour surveiller lutilisation gnrale des disques, ce nest pas une obligation. Dterminer les utilisateurs qui ont atteint un certain seuil est une tche diffrente, car cela implique des mesures proactives an de prvenir des problmes avant quils ne deviennent hors de contrle. La solution consiste avertir ladministrateur que certains utilisateurs doivent tre dplacs sur de nouveaux disques en raison de lespace quils occupent sur les disques actuels. Cette mthode nest pas toute preuve, mais elle permet dajouter facilement une couche de surveillance proactive qui vite que les utilisateurs soient confronts des problmes sur leur machine. Les administrateurs systme peuvent faire preuve dimagination et modier ce script en ajoutant des paramtres de commande an dindiquer la procdure raliser, comme afcher les utilisateurs les plus gourmands en espace disque, et signaler lorsquun certain pourcentage dutilisateurs a atteint le seuil critique. Cependant, ce type dextension sort du propos de ce chapitre.
Chapitre 1
15
Nous modions ensuite le script pour afcher un message lorsquun certain pourcentage des rpertoires est de la taille prcise.
#!/bin/bash
DIR_MIN_SIZE=35000 DIR_PERCENT_BIG_MAX=23
DIR_COUNTER=0 BIG_DIR_COUNTER=0
for DIR in $(ls -l | grep ^d | awk { print $NF }); do DIR_COUNTER=$(expr ${DIR_COUNTER} + 1) DIR_SIZE=$(du -sk ${DIR} | cut -f 1) if [ ${DIR_SIZE} -ge ${DIR_MIN_SIZE} ];then BIG_DIR_COUNTER=$(expr ${BIG_DIR_COUNTER} + 1) done
if [ ${BIG_DIR_COUNTER} -gt 0 ]; then DIR_PERCENT_BIG=$(expr $(expr ${BIG_DIR_COUNTER} \* 100) / ${DIR_COUNTER}) if [ ${DIR_PERCENT_BIG} -gt ${DIR_PERCENT_BIG_MAX} ]; then echo ${DIR_PERCENT_BIG} pourcent des rpertoires occupent plus de ${DIR_MIN_SIZE} kilo-octets."
Lexemple prcdent ressemble peu notre script initial. La variable PRINT_DIR_MIN est devenue DIR_MIN_SIZE, car nous nafchons plus directement les rpertoires qui atteignent la taille minimale. La variable DIR_PERCENT_BIG_MAX a t ajoute. Elle indique le pourcentage maximal autoris de rpertoires dont la taille est gale ou suprieure la taille minimale. Par ailleurs, deux compteurs sont utiliss : le premier (DIR_COUNTER) compte le nombre de rpertoires et le second (BIG_DIR_COUNTER) le nombre de rpertoires qui dpassent la taille minimale. lintrieur de la boucle, DIR_COUNTER est incrment et linstruction if de la boucle for incrmente prsent uniquement BIG_DIR_COUNTER au lieu dafcher le nom du rpertoire.
16
Partie 1
Introduction PowerShell
Une instruction if a t ajoute aprs la boucle for pour procder au calcul du pourcentage des rpertoires dpassant la taille minimale, puis afcher le message si ncessaire. Suite ces modications, le script produit la sortie suivante :
$ big_directory.sh 33 pourcent des rpertoires occupent plus de 35000 kilo-octets.
Elle signale que 33 % des rpertoires ont une taille suprieure ou gale 35 Mo. En modiant la ligne echo du script de manire alimenter un pipeline vers une commande denvoi de courrier et en ajustant les seuils de taille et de pourcentage leur environnement, les administrateurs systme peuvent planier lexcution de ce script diffrents moments et gnrer facilement des rapports doccupation des rpertoires. Sils souhaitent aller plus loin, ils peuvent ajouter des paramtres au script an de prciser les seuils de taille et de pourcentage. Vous pouvez le constater, mme un script shell de base peut tre puissant. Avec une vingtaine de lignes de code, nous avons cr un script trs utile. Certaines bizarreries pourraient sembler gnantes (par exemple, lutilisation de la commande expr pour raliser des calculs mathmatiques simples), mais tout langage de programmation a ses forces et ses faiblesses. De manire gnrale, certaines des tches sont plus complexes accomplir que dautres, quel que soit le langage choisi. De cette introduction, vous devez retenir que lcriture de scripts permet de vous simplier la vie. Par exemple, supposons la fusion de deux socits. Au cours de cette opration, il est ncessaire de crer mille comptes dutilisateurs dans Active Directory, ou nimporte quel autre systme dauthentication. En gnral, un administrateur systme prend la liste des utilisateurs, sassoit devant son clavier avec une tasse de caf et commence cliquer ou saisir les donnes. Sil dispose du budget ncessaire, il peut embaucher une personne pour effectuer le travail ou acheter un logiciel de migration. Mais pourquoi effectuer des tches rptitives ou dpenser de largent qui pourrait tre mieux utilis (pour un meilleur salaire) ? la place de cette mthode, il est prfrable dautomatiser ces tches en utilisant des scripts. Lautomation constitue la nalit de lcriture des scripts. En tant quadministrateur systme, pour disposer des mmes fonctionnalits que les dveloppeurs lorsquils codent les systmes que vous administrez, vous devez exploiter les scripts avec des shells en ligne de commande ou des interprteurs de commandes. Cependant, lcriture de scripts est un domaine qui a tendance tre plus ouvert, plus exible et plus cibl sur les tches que vous, en tant que professionnel des systmes dinformation, devez accomplir.
Chapitre 1
17
18
Partie 1
Introduction PowerShell
de la ligne de commande plus robustes. Cependant, cette volution signiait galement que les scripts shell de Windows devaient tre rcrits avec la syntaxe de DOSShell pour runir et excuter des groupes de commandes. Microsoft a pris conscience de son erreur et a dcid que les administrateurs systme devaient disposer doutils plus labors pour grer les systmes Windows. WSH (Windows Script Host) est arriv avec Windows 98 et a donn aux natifs un accs aux composants sous-jacents de Windows. Il sagissait dune bibliothque permettant aux langages de scripts dutiliser Windows de manire efcace et puissante. WSH ntant pas un langage en soi, il fallait un langage de scripts compatible pour lexploiter, comme par exemple JScript, VBScript, Perl, Python, Kixstart ou Object REXX. Certains de ces langages sont bien adapts la mise en uvre de processus complexes et WSH tait donc une bndiction pour les administrateurs de systmes Windows. Pourtant, les rjouissances ont t de courte dure, car rien ne garantissait que le langage de scripts compatible WSH choisi par ladministrateur serait disponible ou une solution viable pour tout le monde. Labsence de langage et denvironnement standard pour lcriture de scripts ne permettait pas aux utilisateurs et aux administrateurs dinclure facilement une procdure dautomation avec WSH. La seule manire dtre certain que le langage de scripts ou la version de WSH tait compatible avec le systme administr consistait utiliser un langage de scripts natif, cest--dire DOSShell, et accepter les problmes y affrents. Par ailleurs, WSH ouvrait une porte aux attaques par code malveillant. Cette vulnrabilit a donn naissance un ot de virus, de vers et autres programmes indlicats qui ont caus de nombreux dgts sur les systmes informatiques, et cela cause de laccent mis sur lautomation sans intervention de lutilisateur. Au nal, les administrateurs systme ont vu en WSH autant une bndiction quune maldiction. Mme si WSH arborait un bon modle dobjets et donnait accs de nombreuses interfaces dautomation, il ne sagissait pas dun shell. Il exigeait lutilisation de Wscript.exe et de Cscript.exe, les scripts devaient tre crits dans un langage compatible et ses vulnrabilits ont reprsent un d de scurit. Trs clairement, une approche diffrente tait ncessaire pour ladministration des systmes. Microsoft est arriv la mme conclusion.
Arrive de PowerShell
Microsoft na pas consacr beaucoup defforts un shell en ligne de commande. la place, il sest concentr sur un shell graphique, plus compatible avec ses systmes dexploitation graphiques. (Mac OS X na pas non plus beaucoup travaill sur un shell en ligne de commande ;
Chapitre 1
19
il utilise le shell Bash.) Cependant, le DOSShell rsultant prsentait diverses limites, comme les structures de programmation conditionnelle et rcursive peu documentes et une utilisation importante des instructions goto. Pendant des annes, tous ces points ont gn les auteurs de scripts shell, qui se sont tourns vers dautres langages de scripts ou ont crit des programmes compils pour rsoudre les problmes classiques. La standardisation de WSH dans les systmes dexploitation Windows a offert une alternative robuste aux scripts DOSShell. Malheureusement, cet outil prsentait de nombreux dfauts, comme la expliqu la section prcdente. Dautre part, WSH ne permettait pas une utilisation en ligne de commande telle que la connaissaient depuis des annes les administrateurs UNIX et Linux. cause de labsence dun shell en ligne de commande et des avantages quil procure, les administrateurs Windows ont t raills par leurs collgues du monde UNIX. Heureusement, Jeffrey Snover (larchitecte de PowerShell) et les autres membres de lquipe de dveloppement de PowerShell ont compris que Windows avait besoin dun shell en ligne de commande robuste et sr pour ladministration des systmes. PowerShell a t conu comme un shell, avec un accs complet aux composants de Windows, par lintermdiaire de .NET Framework, des objets COM (Component Object Model) et dautres mthodes. Il offre galement un environnement dexcution familier, simple et scuris. Le nom PowerShell est parfaitement choisi, en ce sens quil augmente la puissance du shell de Windows. Pour les utilisateurs qui souhaitent automatiser leurs systmes Windows, larrive de PowerShell est trs excitante car il combine "la puissance de WSH et la familiarit dun shell". Puisque PowerShell fournit un langage de scripts natif, les scripts peuvent tre placs sur tous les systmes Windows sans avoir sinquiter de linstallation dun interprteur de langage particulier. Vous avez peut-tre appris la syntaxe impose par lemploi de WSH dans Perl, Python, VBScript, JScript ou tout autre langage, pour vous apercevoir que le systme sur lequel vous travaillez prsent ne dispose pas de linterprteur adquat. Chez eux, les utilisateurs peuvent installer tout ce quils souhaitent sur leur systme et assurer sa maintenance comme bon leur semble. En revanche, dans une entreprise, cette situation nest pas toujours viable. PowerShell rsout ce problme en nimposant pas la prsence dinterprteurs non natifs. Par ailleurs, il vite de parcourir les sites Web la recherche dquivalents en ligne de commande aux oprations simples du shell graphique et les coder dans des chiers .cmd. Enn, PowerShell sattaque au problme de scurit de WSH, en fournissant une plate-forme dcriture de scripts Windows srs. Il se concentre sur les fonctionnalits de scurit comme la signature des scripts, labsence dextensions dexcutables et les politiques dexcution (restreintes par dfaut).
20
Partie 1
Introduction PowerShell
Pour quiconque a besoin dautomatiser des tches dadministration sur un systme Windows, PowerShell apporte une puissance bienvenue. Sa nature oriente objet augmente galement ses possibilits. Si vous tes un administrateur de systmes Windows ou un dveloppeur de scripts, nous vous conseillons fortement de devenir un expert PowerShell. PowerShell nest pas un projet secondaire chez Microsoft. Lquipe de dveloppement a russi crer un shell stupant et gagner un soutien au sein de Microsoft. Par exemple, lquipe dExchange a adopt PowerShell comme support de linterface de gestion dExchange Server 2007. Et ce nest que le dbut. Dautres produits de Microsoft, comme System Center Operations Manager 2007, System Center Data Protection Manager V2 et System Center Virtual Machine Manager, vont bncier de tous les avantages de PowerShell. En ralit, PowerShell constitue la solution que Microsoft recherchait pour une interface gnrale de gestion des systmes Windows. Dans le futur, PowerShell pourrait remplacer les interfaces actuelles, comme cmd.exe, WSH, les outils en ligne de commande, etc., et tre totalement intgr aux systmes Windows. Avec la cration de PowerShell, Microsoft a rpondu aux besoins dun shell Windows en ligne de commande. Les administrateurs de systmes Windows et les dveloppeurs de scripts nont plus que leur imagination comme seule limite.
En rsum
Ce chapitre a introduit la notion de shell, lorigine des shells, comment les utiliser et comment crer un script shell de base. En tudiant ces aspects, vous devez avoir compris pourquoi lcriture de scripts est aussi importante pour les administrateurs systme. Comme vous lavez peut-tre dcouvert, les scripts leur permettent dautomatiser les tches rptitives. Ils peuvent ainsi travailler plus efcacement et passer plus de temps sur des tches plus importantes. Dautre part, ce chapitre a prsent PowerShell et les raisons de son existence. Ainsi, PowerShell est le remplaant de WSH, qui, malgr sa puissance, afchait plusieurs dfauts (les plus notables ayant trait la scurit et linteroprabilit). PowerShell tait galement indispensable car il manquait Windows un shell en ligne de commande digne de ce nom, en mesure deffectuer facilement des tches dautomation complexes. Pour remplacer WSH et amliorer linterprteur en ligne de commande de Windows, Microsoft a cr PowerShell. Il sappuie sur .NET Framework et apporte le support tant attendu aux scripts et lautomation sous Windows.
2
Les fondamentaux de PowerShell
Dans ce chapitre
m m m m m m m m m m m m
Introduction Avant de commencer Accder PowerShell Comprendre l'interface en ligne de commande Comprendre les applets de commande Quelques applets de commande utiles Expressions Comprendre les variables Comprendre les alias Squences dchappement Comprendre les portes Premier script
Introduction
Ce chapitre va nous emmener directement dans les bases techniques de PowerShell et de son utilisation. Nous tlchargerons et installerons PowerShell, travaillerons avec son interface en ligne de commande (CLI, Command-line Interface), utiliserons des applets de commande, dnirons des variables, crerons des alias, examinerons les portes et crirons un premier script. Il ne sagit pas dun guide de dmarrage complet mais ce chapitre sintresse aux concepts importants que vous devez comprendre avant daborder les autres.
22
Partie 1
Introduction PowerShell
Avant de commencer
La meilleure manire de dbuter avec PowerShell consiste visiter sa page Web ladresse www.microsoft.com/windowsserver2003/technologies/management/powershell/ default.mspx (voir Figure 2.1).
Figure 2.1
La page daccueil de PowerShell sur le site de Microsoft.
partir de cette page, nous pouvons obtenir des informations sur PowerShell, tlcharger de la documentation et des outils, ainsi quobtenir les dernires nouvelles et les dernires versions de PowerShell. Nous allons tlcharger et installer PowerShell, mais vous devez commencer par vrier que la conguration de votre systme respecte les contraintes suivantes :
m
Windows XP Service Pack 2, Windows 2003 Service Pack 1 ou une version ultrieure de Windows ; Microsoft .NET Framework 2.0.
Chapitre 2
23
Si .NET Framework 2.0 nest pas install sur votre machine, vous pouvez tlcharger son module dinstallation depuis le centre de tlchargement de Microsoft ladresse http://www .microsoft.com/downloads/Search.aspx?displaylang=fr (voir Figure 2.2).
Figure 2.2
Le Centre de tlchargement de Microsoft.
Aprs avoir install .NET Framework 2.0, vous devez tlcharger le module dinstallation de PowerShell partir de www.microsoft.com/windowsserver2003/technologies/management/powershell/download.mspx (voir Figure 2.3). Sur cette page, choisissez le module correspondant votre version de Windows, en mode x86 ou x64. Cliquez sur le lien intitul "Localized Package" pour slectionner la version franaise de PowerShell. Ensuite, lancez linstallation de PowerShell en cliquant sur Ouvrir dans la bote de tlchargement ou en double-cliquant sur le chier tlcharg. (Le nom du chier diffre selon la plate-forme, la version de Windows et la langue.) Aprs le dmarrage de linstallation, suivez les instructions dinstallation afches.
24
Partie 1
Introduction PowerShell
Figure 2.3
Tlcharger Windows PowerShell 1.0.
Vous pouvez galement installer PowerShell en mode silencieux depuis la ligne de commande, en passant loption /quiet au chier dinstallation. Cette mthode peut tre utile si vous prvoyez dinstaller PowerShell sur plusieurs systmes diffrents et souhaitez effectuer linstallation par un script douverture de session, par SMS (Systems Management Server) ou tout autre logiciel dadministration. Pour effectuer une installation silencieuse, procdez comme suit : 1. Cliquez sur Dmarrer > Excuter. 2. Saisissez cmd, puis cliquez sur OK pour ouvrir une invite de commande. 3. Saisissez Nom-du-chier-dinstallation-de-PowerShell /quiet (en remplaant le texte en italique par le nom du chier dinstallation que vous avez tlcharg) et appuyez sur Entre.
Chapitre 2
25
Accder PowerShell
Aprs avoir install PowerShell, vous disposez de trois mthodes pour y accder. Pour employer la premire, utilisez le menu Dmarrer : 1. Cliquez sur Dmarrer > Tous les programmes > Windows PowerShell 1.0. 2. Cliquez sur Windows PowerShell. Voici les tapes de la deuxime mthode : 1. Cliquez sur Dmarrer > Excuter. 2. Saisissez PowerShell dans la bote de dialogue Excuter et cliquez sur OK. Ces deux mthodes ouvrent la console PowerShell prsente la Figure 2.4.
Figure 2.4
La console de PowerShell.
Les tapes de la troisime mthode rpondent une invite de commande : 1. Cliquez sur Dmarrer > Excuter. 2. Saisissez cmd, puis cliquez sur OK pour ouvrir une invite de commande. 3. linvite de commande, saisissez powershell (voir Figure 2.5) et appuyez sur Entre.
26
Partie 1
Introduction PowerShell
Figure 2.5
Ouverture de la console PowerShell depuis linvite de commande.
INFO Dans PowerShell, un paramtre est une variable accepte par une commande, un script ou une fonction. Un argument est une valeur affecte un paramtre. Bien que ces termes soient souvent employs de manire interchangeable, noubliez pas ces dnitions dans le contexte PowerShell.
Chapitre 2
27
Voici un exemple dutilisation dune commande, dun paramtre et dun argument. Il sagit de la commande dir, avec le paramtre /w (qui afche la sortie de dir dans un format large) et largument C:\temp\*.txt :
C:\>dir /w C:\temp*.txt Le volume dans le lecteur C sappelle OS Le numro de srie du volume est 1784-ADF9 Rpertoire de C:\temp Mmo Eric.txt mediapc.txt note.txt Version1.txt 4 chier(s) 953 octets 0 Rp(s) 16 789 958 656 octets libres
C:\>
Le rsultat de cette commande est une liste, dans un format large, de tous les chiers .txt contenus dans le rpertoire C:\temp. Si vous invoquez la commande dir sans paramtres ni arguments, le rsultat est totalement diffrent. Cest galement ainsi que fonctionne PowerShell. Par exemple, voici une commande PowerShell qui afche des informations concernant le processus dexplorer.exe :
PS C:\> get-process -Name explorer Handles ------807 NPM(K) -----20 PM(K) ----31672 WS(K) VM(M) ----- ----14068 149 CPU(s) -----62,95 Id ProcessName -- ----------1280 explorer
PS C:\>
Dans cet exemple, Get-Process est la commande, -Name est le paramtre et explorer est largument. Cette commande afche les informations concernant le processus dexplorer.exe. Si aucun paramtre ni argument nest utilis, elle afche simplement les informations concernant tous les processus en cours et non un seul. Pour modier le comportement dune commande ou lui demander deffectuer autre chose que son opration par dfaut, il faut comprendre sa syntaxe. La commande Get-Help, dcrite la section "Quelques applets de commandes utiles", page 41, fournit des informations dtailles sur le rle dune commande et son utilisation.
28
Partie 1
Introduction PowerShell
Opration ddition
Dplacent le curseur vers la gauche et vers la droite sur la ligne de commande en cours. Parcourent la liste des dernires commandes saisies, vers le dbut et la n. Bascule en mode insertion et remplacement du texte. Supprime le caractre la position courante du curseur. Supprime le caractre qui se trouve juste avant la position courante du curseur. Afche la liste des dernires commandes saisies dans une fentre, par-dessus le shell de commande. Les touches Flche vers le haut et Flche vers le bas permettent de slectionner lune des commandes. La touche Entre excute la commande slectionne. Complte automatiquement les lments de la ligne de commande. La combinaison Maj+Tab permet de revenir en arrire dans la liste des correspondances possibles.
F7
Tab
Heureusement, la plupart des oprations mentionnes au Tableau 2.1 existent dj dans linterprteur de commande de Windows, ce qui permet aux administrateurs systme dadopter plus facilement PowerShell. La principale diffrence rside dans la touche Tab pour la compltion automatique. Elle a t tendue dans PowerShell. Comme linterprteur de commande Windows, PowerShell complte automatiquement les noms de chiers et de rpertoires. Si nous saisissons un nom partiel et appuyons sur la touche Tab, PowerShell retourne le premier nom de chier ou de rpertoire correspondant dans le rpertoire de travail. Si nous appuyons nouveau sur Tab, nous obtenons la deuxime correspondance possible. Les appuis rpts sur Tab parcourent la liste des rsultats.
Chapitre 2
29
La compltion automatique peut galement tenir compte des caractres gnriques, comme le montre lexemple suivant :
PS C:\> cd C:\Doc* <tab> PS C:\> cd C:\Documents and Settings PS C:\Documents and Settings>
La compltion automatique de PowerShell concerne galement les commandes. Par exemple, nous pouvons saisir un nom de commande partiel et appuyer sur la touche Tab an que PowerShell parcoure la liste des commandes possibles :
PS C:\> get-pro <tab> PS C:\> get-process
PowerShell complte galement les noms de paramtres associs une commande. Il suft de saisir une commande et un nom de paramtre partiel, puis dappuyer sur la touche Tab. PowerShell itre alors sur les paramtres de la commande prcise. Cette mthode sapplique galement aux variables associes une commande. Par ailleurs, PowerShell effectue une compltion automatique des mthodes et des proprits des variables et des objets. Prenons lexemple dune variable nomme $Z et xe la valeur "Variable" :
PS C:\> $Z = "Variable" PS C:\> $Z.<tab>
Une fois que vous avez saisi $Z et appuy sur la touche Tab, PowerShell propose toutes les oprations possibles sur la variable $Z. Par exemple, si nous choisissons la proprit $Z.Length et appuyons sur Entre, il retourne la taille de la chane contenue dans la variable $Z :
PS C:\> $Z = "Variable" PS C:\> $Z. <tab> PS C:\> $Z.Length 8 PS C:\>
30
Partie 1
Introduction PowerShell
La compltion automatique des variables distingue les proprits et les mthodes. Les proprits sont afches sans parenthse ouvrante (comme dans lexemple $Z.Length) et les mthodes sont prsentes avec cette parenthse :
PS C:\> $Z = "Variable" PS C:\> $Z.con <tab> PS C:\> $Z.Contains(
Lorsque linvite $Z.Contains( apparat, voici comment dterminer si la variable $Z contient le caractre V :
PS C:\> $Z = "Variable" PS C:\> $Z.Contains("V") True PS C:\
PowerShell corrige automatiquement la casse des noms de mthodes ou de proprits an quelle corresponde leur dnition. Dans la plupart des cas, cette fonctionnalit nest que cosmtique car, par dfaut, PowerShell nest pas sensible la casse.
Types de commandes
Lorsquon excute une commande dans PowerShell, linterprteur en examine le nom an de dnir la tche effectuer. Ce processus dtermine le type de la commande et la manire de lexcuter. Il existe quatre types de commandes PowerShell : applets de commande, fonctions shell, scripts et commandes natives.
Applets de commande
Les premires sortes de commandes sont appeles applets de commande (cmdlet). Elles sont quivalentes aux commandes internes des autres shells en ligne de commande. Cependant, elles sont implmentes laide de classes .NET compiles dans une bibliothque dynamique (DLL, Dynamic Link Library) et charges par PowerShell au moment de lexcution. Cette diffrence signie que les applets de commande intgres ne sont pas ges ; tout le monde peut utiliser le kit de dveloppement (SDK, Software Developers Kit) de PowerShell pour crire ses propres applets et tendre les fonctionnalits de PowerShell.
Chapitre 2
31
Le nom dune applet de commande est toujours compos dun verbe et dun nom spar par un tiret (-). Le verbe prcise lopration effectue par lapplet et le nom indique lobjet concern par lopration. Pour plus dinformations sur les applets de commande et leur syntaxe, consultez la section "Comprendre les applets de commande", page 39.
Fonctions shell
Les fonctions shell reprsentent le deuxime type de commandes. Une fonction shell permet daffecter un nom une liste de commandes. Les fonctions sont comparables aux sous-routines et aux procdures dans dautres langages de programmation. Un script diffre dune fonction en cela quune nouvelle instance du shell est dmarre pour chaque script alors que les fonctions sexcutent dans linstance courante du shell. Voici un exemple de dnition dune fonction simple dans PowerShell :
PS C:\> function ma-fonction-dir {get-childitem | ft Mode,Name}
Aprs avoir dni ma-fonction-dir, nous pouvons lexcuter pour afcher le contenu du rpertoire de travail dans un format particulier :
PS C:\Travail> ma-fonction-dir Mode ---d---d---d---d----a---a---a--Name ---Livres Dev Outils VM Mmo ric.txt Congurer des certicats.doc mediapc.txt
PS C:\Travail>
Nous pouvons examiner le droulement dune fonction dans la console en activant le dbogage. Pour cela, utilisons la commande suivante :
PS C:\Travail> set-psdebug -trace 2
32
Partie 1
Introduction PowerShell
Lorsque la fonction ma-fonction-dir est place sur la pile, PowerShell excute lapplet de commande Get-ChildItem comme indiqu dans la fonction. Pour dsactiver le dbogage, saisissez la commande Set-PSDebug trace 0.
INFO Les fonctions dnies sur la ligne de commande, comme ma-fonction-dir, nexistent que pour la dure de la session PowerShell en cours. Elles sont galement locales et ne sappliquent pas aux nouvelles sessions PowerShell. Pour plus dinformations, consultez la section "Comprendre les portes", page 59.
Mme si une fonction dnie au niveau de la ligne de commande est utile pour crer dynamiquement une suite de commandes dans lenvironnement PowerShell, de telles fonctions rsident uniquement en mmoire et sont effaces lorsque PowerShell est ferm. Par consquent, lcriture de ces fonctions sous forme de scripts peut tre plus pratique.
Scripts
Les scripts, le troisime type de commandes, sont des commandes PowerShell enregistres dans des chiers .ps1. Contrairement aux fonctions shell, qui ne sont pas conserves entre les sessions, ils sont stocks sur le disque et peuvent tre invoqus tout moment. Les scripts peuvent tre excuts dans une session PowerShell ou par linterprteur de commandes de Windows. Pour lancer un script dans PowerShell, saisissez son nom sans lextension. Ce nom peut tre suivi dun nombre quelconque de paramtres. Le shell excute alors le premier chier .ps1 qui correspond au nom indiqu et qui se trouve dans lun des chemins mentionns dans la variable PowerShell $ENV:PATH.
PS C:\> monscript arg1 arg2
Chapitre 2
33
La commande prcdente excute le script monscript.ps1 en utilisant les arguments arg1 et arg2, si le script se trouve dans lun des chemins de la variable $ENV:PATH. Dans le cas contraire, nous devons prciser son emplacement par lune des deux mthodes suivantes :
PS C:\> & C:\Mes Scripts\monscript.ps1 arg1 arg2 PS C:\Scripts> .\monscript.ps1 arg1 arg2
INFO Loprateur dappel & a t utilis dans lexemple prcdent car le chemin du script contient des espaces et son nom doit donc tre plac entre des apostrophes. Cet oprateur demande au shell dvaluer la chane comme une commande. Si le chemin ne contient pas despace, vous pouvez omettre loprateur & ainsi que les apostrophes autour du nom du script.
Pour excuter un script PowerShell depuis linterprteur de commandes de Windows, nous pouvons tout dabord invoquer la commande cd pour aller dans le rpertoire qui contient le script, puis lancer lexcutable de PowerShell avec le paramtre -command, en prcisant le script excuter :
C:\Scripts>powershell -command .\monscript.ps1
Si nous ne souhaitons pas aller dans le rpertoire du script avec la commande pouvons lexcuter en utilisant un chemin absolu :
C:\>powershell -command C:\Scripts\monscript.ps1
cd,
nous
Dans PowerShell, il est important de prter attention aux autorisations de scurit des scripts. Par dfaut, leur excution est interdite. Il sagit l dune mthode de protection contre les scripts malveillants. Cette stratgie peut tre modie laide de lapplet de commande SetExecutionPolicy, que nous tudierons au Chapitre 3, "Prsentation avance de PowerShell".
Commandes natives
Le dernier type de commandes, les commandes natives, est constitu des programmes externes que le systme dexploitation peut excuter. Puisque linvocation dune commande native dclenche la cration dun nouveau processus, elles sont moins efcaces que les autres types
34
Partie 1
Introduction PowerShell
de commandes PowerShell. Elles possdent galement leurs propres paramtres pour le traitement des commandes, qui sont gnralement diffrents des paramtres de PowerShell. La gestion du focus des commandes natives par PowerShell peut reprsenter un problme dutilisation majeur. Lorsquune commande native sexcute, PowerShell peut attendre quelle se termine ou poursuivre son traitement. Prenons lexemple suivant :
PS C:\> .\monchier.txt PS C:\>
Linvite de PowerShell est rafche presque immdiatement et lditeur par dfaut des chiers ayant lextension .txt dmarre et afche C:\monchier.txt. Si lditeur de texte par dfaut na pas t chang, notepad.exe est lanc et ouvre C:\monchier.txt.
INFO PowerShell dispose dune fonction de scurit unique. Pour excuter ou ouvrir un chier du rpertoire de travail, vous devez prxer la commande avec .\ ou ./. Cette caractristique de scurit vite aux utilisateurs de PowerShell de lancer par mgarde une commande native ou un script sans prciser explicitement son excution.
Dans cet exemple, le chier C:\monchier.txt est ouvert dans Notepad et linvite de PowerShell revient immdiatement. Cependant, si nous excutons une commande native au beau milieu dun pipeline (voir le Chapitre 1, "Introduction aux shells et PowerShell"), PowerShell attend la n du processus externe avant de repasser le contrle la console :
PS C:\> Rponse Rponse Rponse Rponse PS C:\> ping monserveur | ndstr de 10.0.0.2 : octets=32 de 10.0.0.2 : octets=32 de 10.0.0.2 : octets=32 de 10.0.0.2 : octets=32 "TTL" temps<1ms temps<1ms temps<1ms temps<1ms
Chapitre 2
35
PowerShell attend la n du processus ping avant de redonner le contrle la console et de terminer le pipeline. Lorsque cette commande est excute (en remplaant monserveur par le nom dun hte sur votre rseau local), linvite de PowerShell disparat brivement pendant que la sortie de la commande ping est envoye la commande ndstr pour quelle recherche la chane "TTL". Linvite de PowerShell ne revient que lorsque la commande native est termine.
Invoquer PowerShell depuis dautres shells
Outre lutilisation en ligne de commande que nous venons de prsenter, il est possible dappeler PowerShell depuis dautres shells, par exemple depuis linterprteur de commandes de Windows. Lorsque PowerShell est invoqu comme une application externe, nous pouvons prciser diffrentes commandes, paramtres et arguments. La commande suivante afche lensemble des commandes, paramtres et arguments disponibles lorsque PowerShell est utilis depuis linterprteur de commandes de Windows :
C:\>powershell -? powershell[.exe] [-PSConsoleFile <le> | -Version <version>] [-NoLogo] [-NoExit] [-NoProle] [-NonInteractive] [-OutputFormat {Text | XML}] [-InputFormat {Text | XML}] [-Command { - | <bloc_script> [-args <tableau_arguments>] | <chane> [<paramtres_commande>] } ] powershell[.exe] -Help | -? | /?
-PSConsoleFile Charge le chier console de Windows PowerShell spci. Pour crer un chier console, utilisez Export-Console dans Windows PowerShell. -Version Dmarre la version de Windows PowerShell spcie. -NoLogo Masque la bannire de copyright au dmarrage. -NoExit Ne quitte pas aprs excution des commandes de dmarrage. -NoProle Nutilise pas le prol utilisateur. -Noninteractive Ne prsente pas dinvite interactive lutilisateur.
36
Partie 1
Introduction PowerShell
-OutputFormat Indique comment la sortie de Windows PowerShell est mise en forme. Les valeurs valides sont "Text" (chanes de texte) ou "XML" (format CLIXML srialis). -InputFormat Dcrit le format des donnes envoyes Windows PowerShell. Les valeurs valides sont "Text" (chanes de texte) ou "XML" (format CLIXML srialis). -Command Excute les commandes spcies (et tous paramtres) comme si elles avaient t tapes linvite de commande de Windows PowerShell, puis quitte sauf si NoExit est spci. La valeur de Command peut tre "-", une chane ou un bloc de script. Si la valeur de Command est "-", le texte de la commande est lu partir de lentre standard. Les blocs de script doivent tre entre accolades ({}). Vous ne pouvez spcier un bloc de script quen excutant PowerShell.exe dans Windows PowerShell. Les rsultants du script sont retourns lenvironnement parent en tant quobjets XML dsrialiss, et non en direct. Si la valeur de Command est une chane, Command doit tre le dernier paramtre de la commande, car tous les caractres taps aprs la commande sont interprts comme des arguments de commande. Pour crire une chane qui excute une commande Windows PowerShell, utilisez le format : "& {<commande>}" dans lequel les guillemets indiquent une chane et loprateur dappel (&) entrane lexcution de la commande. -Help, -?, /? Afche ce message. Si vous tapez une commande powershell.exe dans Windows PowerShell, faites prcder les paramtres de commande dun trait dunion (-), et non dune barre oblique (/). Vous pouvez utiliser un trait dunion ou une barre oblique dans Cmd.exe. EXEMPLES powershell powershell powershell powershell
-psconsolele sqlsnapin.psc1 -version 1.0 -nologo -inputformat text -outputformat XML -command {get-eventlog -logname security} -command & {get-eventlog -logname security}
C:\>
Chapitre 2
37
Grce cette possibilit, nous pouvons excuter des commandes PowerShell partir de linterprteur de commandes de Windows. Lorsque PowerShell est appel avec le paramtre -command, des scripts PowerShell ou dautres applets de commande et commandes peuvent tre utiliss comme arguments de -command. Lexemple suivant montre linvocation de PowerShell depuis linterprteur de commandes de Windows, pour excuter lapplet de commande Get-Service en ne conservant que les services qui se trouvent dans ltat Running, puis pour trier les rsultats en fonction du contenu de la colonne DisplayName du service. La chane complte de la commande est place entre des guillemets an dempcher linterprteur de traiter le tube.
C:\>powershell.exe -command "get-service | where-object {$_.Status -eq Running} | sort DisplayName" Status -----Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running Name ---stisvc helpsvc APC UPS Service RpcSs LmHosts AudioSrv avast! Antivirus aswUpdSv avast! Mail Sca... avast! Web Scanner wscsvc TrkWks Dhcp Dnscache FastUserSwitchi... WZCSVC seclogon Netman ShellHWDetection ProtectedStorage Browser SamSs RasMan dmserver W32Time winmgmt DisplayName ----------Acquisition dimage Windows (WIA) Aide et support APC UPS Service Appel de procdure distante (RPC) Assistance TCP/IP NetBIOS Audio Windows avast! Antivirus avast! iAVS4 Control Service avast! Mail Scanner avast! Web Scanner Centre de scurit Client de suivi de lien distribu Client DHCP Client DNS Compatibilit avec le Changement ra... Conguration automatique sans l Connexion secondaire Connexions rseau Dtection matriel noyau Emplacement protg Explorateur dordinateur Gestionnaire de comptes de scurit Gestionnaire de connexions daccs ... Gestionnaire de disque logique Horloge Windows Infrastructure de gestion Windows
38
Partie 1
Introduction PowerShell
Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running
Eventlog DcomLaunch wuauserv Nla SENS NVSvc SharedAccess Schedule PlugPlay lanmanserver SSDPSRV ALG BITS CryptSvc PolicyAgent TermService Spooler lanmanworkstation EventSystem TapiSrv Themes WebClient UMWdf
Journal des vnements Lanceur de processus serveur DCOM Mises jour automatiques NLA (Network Location Awareness) Notication dvnement systme NVIDIA Display Driver Service Pare-feu Windows / Partage de conne... Planicateur de tches Plug-and-Play Serveur Service de dcouvertes SSDP Service de la passerelle de la couc... Service de transfert intelligent en... Services de cryptographie Services IPSEC Services Terminal Server Spouleur dimpression Station de travail Systme dvnements de COM+ Tlphonie Thmes WebClient Windows User Mode Driver Framework
Chapitre 2
39
Par exemple, le mot "sh" est au singulier ou au pluriel, selon le contexte. Puisque langlais nest sans doute pas votre langue maternelle, il vous sera difcile de savoir ce qui doit tre au pluriel ou dimaginer la forme plurielle correcte.
INFO Le verbe par dfaut de PowerShell est Get. Si aucun autre verbe nest donn, il est donc suppos. Ce fonctionnement par dfaut signie que la commande Process produit le mme rsultat que Get-Process.
Pour connatre les paramtres accepts par une applet de commande, nous pouvons consulter ses informations daide avec lune des commandes suivantes :
PS C:\> nom_cmdlet -? PS C:\> get-help nom_cmdlet
Dautre part, lapplet de commande Get-Command permet de dterminer les paramtres disponibles et leur utilisation. Voici un exemple de sa syntaxe :
PS C:\> get-command nom_cmdlet
En redirigeant la sortie de Get-Command vers lapplet de commande Format-List, nous obtenons une liste plus concise de lutilisation dune applet de commande. Par exemple, voici comment afcher uniquement la dnition de Get-Process :
PS C:\> get-command get-process | format-list Denition
Denition : Get-Process [[-Name] <String[]>] [-Verbose] [-Debug][-ErrorAction <ActionPreference>] [-ErrorVariable <String>][-OutVariable <Stri ng>] [-OutBuffer <Int32>] Get-Process -Id <Int32[]> [-Verbose] [-Debug][-ErrorAction <Actio nPreference>] [-ErrorVariable <String>][-OutVariable <String>] [OutBuffer <Int32>] Get-Process -InputObject <Process[]> [-Verbose] [-Debug] [-ErrorAc tion <ActionPreference>] [-ErrorVariable <String>][-OutVariable < String>] [-OutBuffer <Int32>]
PS C:\>
40
Partie 1
Introduction PowerShell
Paramtres communs
Puisque les applets de commande drivent dune classe de base, quelques paramtres communs toutes les applets permettent doffrir une interface plus cohrente aux applets de commande de PowerShell. Ces paramtres sont dcrits au Tableau 2.2.
Tableau 2.2 Paramtres communs de PowerShell
Paramtre
Verbose
Type de donnes
Boolean
Description
Gnre une information dtaille concernant lopration, de manire analogue un journal de trace ou de transaction. Ce paramtre nest valide quavec les applets de commande qui gnrent des donnes verbeuses. Gnre des dtails de lopration destins au programmeur. Ce paramtre nest valide quavec les applets de commande qui gnrent des donnes de dbogage. Dtermine la rponse de lapplet de commande aux erreurs. Les valeurs acceptes sont Continue (par dfaut), Stop, SilentlyContinue et Inquire. Dsigne une variable qui stocke les erreurs de la commande pendant son excution. Cette variable est modie tout comme $error. Dsigne une variable qui stocke la sortie de la commande pendant son excution. Dtermine le nombre dobjets placer dans le tampon avant dinvoquer lapplet de commande suivante du pipeline. Afche le droulement de lexcution de la commande, mais sans rellement lexcuter. Demande une autorisation lutilisateur avant deffectuer toute action qui modie le systme.
Debug
Boolean
ErrorAction
Enum
ErrorVariable
String
OutVariable
String
OutBuffer
Int32
WhatIf
Boolean
Conrm
Boolean
Chapitre 2
41
INFO Les deux derniers paramtres du Tableau 2.2, WhatIf et Conrm, sont particuliers, car ils exigent que lapplet de commande prenne en charge la mthode .NET ShouldProcess, ce qui nest peut-tre pas le cas de toutes les applets de commande. La mthode ShouldProcess demande une conrmation de lopration lutilisateur, en lui indiquant le nom de la ressource concerne par la modication.
Get-Help
Comme vous devez le deviner, lapplet Get-Help afche une aide sur les applets de commande et dautres thmes. Pour afcher la liste de tous les sujets daide, saisissons Get-Help * linvite de commande de PowerShell :
PS C:\> get-help * Name ---ac asnp clc cli clp clv cpi cpp cvpa diff epal epcsv fc Category -------Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Synopsis -------Add-Content Add-PSSnapin Clear-Content Clear-Item Clear-ItemProperty Clear-Variable Copy-Item Copy-ItemProperty Convert-Path Compare-Object Export-Alias Export-Csv Format-Custom Format-List
42
Partie 1
Introduction PowerShell
foreach ... Get-Command Get-Help Get-History Invoke-History Add-History ForEach-Object Where-Object Set-PSDebug Add-PSSnapin Remove-PSSnapin Get-PSSnapin Export-Console Start-Transcript Stop-Transcript Add-Content Clear-Content Clear-ItemProperty Join-Path Convert-Path Copy-ItemProperty Get-EventLog Get-ChildItem Get-Content Get-ItemProperty Get-WmiObject Move-ItemProperty Get-Location Set-Location Push-Location Pop-Location New-PSDrive Remove-PSDrive Get-PSDrive ... Alias Environment FileSystem Function Registry Variable Certicate
Alias Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Provider Provider Provider Provider Provider Provider Provider
ForEach-Object Obtient des informatio... Afche des informatio... Obtient la liste des c... Excute les commandes ... Ajoute des entres l... Excute une opration ... Cre un ltre qui con... Active et dsactive le... Ajoute un ou plusieurs... Supprime les composant... Obtient les composants... Exporte la congurati... Cre un enregistrement... Arrte une transcription. Ajoute le contenu aux ... Supprime le contenu d... Supprime la valeur du... Combine un chemin dac... Convertit un chemin d... Copie une proprit et... Obtient des informatio... Obtient les lments e... Obtient le contenu de ... Rcupre les proprit... Obtient des instances ... Dplace une proprit ... Obtient des informatio... Dnit lemplacement ... Excute une opration ... Dnit lemplacement ... Installe un nouveau le... Supprime un lecteur Wi... Obtient des informatio... Donne accs Donne accs Fournisseur Donne accs Donne accs Donne accs Donne accs aux alias ... aux variab... de PowerSh... aux foncti... aux cls e... aux variab... aux magasi...
Chapitre 2
43
about_alias about_arithmetic_operators about_array about_assignment_operators about_associative_array about_automatic_variables about_break about_command_search about_command_syntax about_commonparameters about_comparison_operators about_continue about_core_commands about_display.xml about_environment_variable ... PS C:\>
HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile
Utilisation dautres n... Oprateurs pouvant tr... Structure de donnes c... Oprateurs pouvant tr... Structure de donnes c... Variables dnies aut... Instruction permettant... Explique comment Windo... Format de commande dan... Paramtres que chaque ... Oprateurs qui peuvent... Revient immdiatement ... Applets de commande pr... Contrle de lafchag... Comment accder aux va...
Si cette liste semble trop longue pour tre utile, nous pouvons la raccourcir en appliquant un ltre sur le nom du thme et la catgorie. Par exemple, voici comment obtenir une liste de toutes les applets de commande dont le verbe commence par Get :
PS C:\> get-help -Name get-* -Category cmdlet Name ---Get-Command Get-Help Get-History Get-PSSnapin Get-EventLog Get-ChildItem Get-Content ... PS C:\> Category -------Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Synopsis -------Obtient des informatio... Afche des informatio... Obtient la liste des c... Obtient les composants... Obtient des informatio... Obtient les lments e... Obtient le contenu de ...
44
Partie 1
Introduction PowerShell
Aprs avoir choisi un thme, nous pouvons obtenir laide en indiquant le nom du thme en paramtre lapplet de commande Get-Help. Par exemple, la commande suivante fournit de laide sur Get-Content :
PS C:\> get-help get-content
INFO Dans Windows PowerShell RC2, deux paramtres supplmentaires ont t ajouts get-help : -detailed et -full. Le paramtre -detailed afche des informations complmentaires sur une applet de commande, y compris la description des paramtres et des exemples dutilisation. Le paramtre -full afche lintgralit de laide dune applet de commande, y compris des informations techniques concernant ses paramtres.
Laide fournie par PowerShell est divise en rubriques. Le Tableau 2.3 rcapitule les dtails des informations daide sur chaque applet de commande.
Tableau 2.3 Rubriques de laide de PowerShell
Rubrique
Nom Rsum Description dtaille
Description
Le nom de lapplet de commande Courte description du rle de lapplet de commande Description dtaille du comportement de lapplet de commande, gnralement avec des exemples dutilisation Dtails dinvocation de lapplet de commande Paramtres reconnus par lapplet de commande Type de lentre accepte par lapplet de commande Type des donnes retournes par lapplet de commande Si cette rubrique est prsente, elle identie les erreurs qui conduisent larrt prmatur de lapplet de commande
Chapitre 2
45
Description
Identie les erreurs non critiques qui peuvent se produire pendant lexcution de lapplet de commande sans pour cela la terminer Informations dtailles complmentaires sur lutilisation de lapplet de commande, y compris des scnarios particuliers et des limitations possibles ou des curiosits Exemple dutilisation classique de lapplet de commande Rfrences dautres cmdlets qui ralisent des tches similaires
Remarques
Get-Command
Get-Command est galement trs utile, car elle afche la liste de toutes les applets de commande
Get-Command
est plus puissante que Get-Help car elle prsente toutes les commandes disponibles (applets de commande, scripts, alias, fonctions et applications natives) dans une session PowerShell.
46
Partie 1
Introduction PowerShell
Par exemple :
PS C:\> get-command note* CommandType ----------Application Application Name ---NOTEPAD.EXE notepad.exe Denition ---------C:\WINDOWS\NOTEPAD.EXE C:\WINDOWS\system32\notepad.exe
PS C:\>
Lorsque Get-Command est invoque avec des lments autres que des applets de commande, les informations retournes sont lgrement diffrentes de celles retenues pour une applet de commande. Par exemple, pour une application existante, la valeur de la proprit Denition est le chemin de lapplication. Cependant, dautres informations concernant lapplication sont galement disponibles :
PS C:\> get-command ipcong | format-list * FileVersionInfo : File: C:\WINDOWS\system32\ipcong.exe InternalName: ipcong.exe OriginalFilename: ipcong.exe FileVersion: 5.1.2600.2180 (xpsp_sp2_rtm.040803-2158) FileDescription: Utilitaire de conguration IP Product: Systme dexploitation Microsoft Windows ProductVersion: 5.1.2600.2180 Debug: False Patched: False PreRelease: False PrivateBuild: False SpecialBuild: False Language: Franais (France) Path Extension Denition Name CommandType : : : : : C:\WINDOWS\system32\ipcong.exe .exe C:\WINDOWS\system32\ipcong.exe ipcong.exe Application
Chapitre 2
47
PS C:\>
PS C:\>
Avec un script, la proprit Denition contient le chemin du script. Si le script nest pas de type PowerShell (comme un chier .bat ou .vbs), linformation retourne est identique celle des applications natives.
Expressions
PowerShell permet galement dvaluer des expressions. Dans lexemple suivant, il retourne le rsultat dune expression mathmatique simple :
PS C:\> (100 / 2) * 3 150 PS C:\>
48
Partie 1
Introduction PowerShell
INFO Il est important de noter que, dans cet exemple, PowerShell calcule et afche immdiatement le rsultat de lexpression. Ce fonctionnement est diffrent des autres shells et langages de scripts, o le rsultat de lexpression doit tre affect une variable ou pass une commande dafchage avant de pouvoir tre prsent lcran.
Mme si PowerShell afche immdiatement les rsultats des expressions, rien ne nous empche de les stocker dans des variables ou dans des chiers texte pour une utilisation ultrieure. Lexemple suivant enregistre la sortie de lexpression dans la variable $Calc :
PS C:\> $Calc = (100 / 2) * 3 PS C:\> $Calc 150 PS C:\>
Cette technique peut galement tre tendue aux applets de commande. Dans lexemple suivant, la sortie de Get-Process est affecte la variable $Procinfo avec le paramtre -Name :
PS C:\> $Procinfo = get-process -Name explorer PS C:\> $Procinfo Handles ------494 NPM(K) -----12 PM(K) ----14248 WS(K) VM(M) ----- ----24804 83 CPU(s) -----107,45 Id -2964 ProcessName ----------explorer
PS C:\> $Procinfo Handles ------494 NPM(K) -----12 PM(K) ----14248 WS(K) VM(M) ----- ----24804 83 CPU(s) -----107,51 Id -2964 ProcessName ----------explorer
PS C:\>
La variable $Procinfo contient le rsultat de la commande get-process -Name explorer. Nous demandons ensuite PowerShell de retrouver la valeur de $Procinfo. Il afche le
Chapitre 2
49
rsultat pour le processus explorer. Lorsque $Procinfo est afche une seconde fois, la valeur de CPU(s) est diffrente. Cet exemple montre que le contenu de la variable $Procinfo est dynamique. Autrement dit, nous obtenons des informations en temps rel sur le processus explorer.
PS C:\>
Dans cet exemple, la variable $MSProcesses contient une liste des processus Microsoft actuellement en cours dexcution sur le systme.
50
Partie 1
Introduction PowerShell
INFO Un nom de variable peut inclure nimporte quel caractre, y compris les espaces, condition quil soit plac entre des accolades (les symboles { et }). Cependant, si vous dnissez un nom de variable non standard, PowerShell vous signale que cette pratique est dconseille.
Variables internes
Lorsquune session PowerShell dmarre, un certain nombre de variables sont automatiquement dnies :
PS C:\> set-location variable: PS Variable:\> get-childitem Name Value -------Error DebugPreference PROFILE HOME Host MaximumHistoryCount MaximumAliasCount input StackTrace ReportErrorShowSource ExecutionContext true VerbosePreference ShellId false null MaximumFunctionCount ConsoleFileName ReportErrorShowStackTrace FormatEnumerationLimit ? PSHOME MyInvocation PWD
{CommandNotFoundException} SilentlyContinue \\bobshosting.com\homes\tyson\My Documents\P... U:\ System.Management.Automation.Internal.Host.In... 64 4096 System.Array+SZArrayEnumerator System.Management.Automation.CommandDis... 1 System.Management.Automation.EngineIntrinsics True SilentlyContinue Microsoft.PowerShell False 4096 0 4 True C:\Program Files\Windows PowerShell\v1.0 System.Management.Automation.InvocationInfo Variable:\
Chapitre 2
51
^ set-location _ ReportErrorShowExceptionClass 0 ProgressPreference Continue ErrorActionPreference Continue args {} MaximumErrorCount 256 NestedPromptLevel 0 WhatIfPreference 0 $ variable: ReportErrorShowInnerException 0 ErrorView NormalView WarningPreference Continue PID 3124 ConrmPreference High MaximumDriveCount 4096 MaximumVariableCount 4096
PS C:\>
Ces variables internes se rpartissent en deux catgories. La premire a une signication particulire dans PowerShell car elle enregistre des informations de conguration pour la session en cours. Parmi ces variables spciales, les suivantes sont retenir car elles sont souvent employes dans ce livre :
m $_
contient lobjet en cours dans le pipeline. contient les objets derreur de la session PowerShell en cours.
m $Error
PS C:\> get-service | where-object {$_.Name -match "W32Time"} Status -----Running Name ---W32Time DisplayName ----------Horloge Windows
PS C:\>
PS C:\> $Error Vous devez fournir une expression de valeur droite de loprateur * . PS C:\>
52
Partie 1
Introduction PowerShell
La seconde catgorie de variables internes comprend les paramtres de prfrence qui contrlent le comportement de PowerShell. Le Tableau 2.4 les dcrit.
INFO Une stratgie de commande peut tre lune des chanes suivantes : SilentlyContinue, NotifyContinue, NotifyStop ou Inquire.
Description Action effectuer lorsque des donnes sont crites laide de Write-Debug dans un script ou de WriteDebug() dans une applet de commande ou un fournisseur Action effectuer lorsque des donnes sont crites laide de Write-Error dans un script ou de WriteError () dans une applet de commande ou un fournisseur Nombre maximal dalias Nombre maximal de lecteurs autoriss Nombre maximal derreurs places dans $Error Nombre maximal de fonctions pouvant tre dnies Nombre maximal de variables pouvant tre dnies Nombre maximal dentres enregistres dans lhistorique des commandes Action effectuer lorsque ShouldProcess est utilis dans une applet de commande Valeur retourne par ShouldProcess Action effectuer lorsque des donnes sont crites laide de Write-Progress dans un script ou de WriteProgress() dans une applet de commande ou un fournisseur Action effectuer lorsque des donnes sont crites laide de Write-Verbose dans un script ou de WriteVerbose() dans une applet de commande ou un fournisseur
$ErrorActionPreference
Stratgie de commande
$ShouldProcessPreference
$ProcessReturnPreference $ProgressPreference
$VerbosePreference
Stratgie de commande
Chapitre 2
53
Elle est plutt longue saisir. Heureusement, comme la plupart des shells, PowerShell prend en charge les alias dapplets de commande et dexcutables. Ainsi, pour viter de saisir une commande aussi longue, nous pouvons utiliser les alias par dfaut de PowerShell. Dans ce cas, lexemple Get-Process devient :
PS C:\> gps | ? {$_.Company -match .*Microsoft*} | ft Name, ID, Path Autosize
Lconomie nest pas norme, mais les alias peuvent faire gagner du temps et viter les fautes de frappe. Pour obtenir la liste des alias dnis dans la session PowerShell en cours, invoquons Get-Alias :
PS C:\> get-alias CommandType ----------Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Name ---ac asnp clc cli clp clv cpi cpp cvpa diff epal epcsv fc foreach Denition ---------Add-Content Add-PSSnapin Clear-Content Clear-Item Clear-ItemProperty Clear-Variable Copy-Item Copy-ItemProperty Convert-Path Compare-Object Export-Alias Export-Csv Format-Custom Format-List ForEach-Object
54
Partie 1
Introduction PowerShell
Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias
% ft fw gal gc gci gcm gdr ghy gi gl gm gp gps group gsv gsnp gu gv gwmi iex ihy ii ipal ipcsv mi mp nal ndr ni nv oh rdr ri rni rnp rp rsnp rv rvpa sal sasv sc select si
ForEach-Object Format-Table Format-Wide Get-Alias Get-Content Get-ChildItem Get-Command Get-PSDrive Get-History Get-Item Get-Location Get-Member Get-ItemProperty Get-Process Group-Object Get-Service Get-PSSnapin Get-Unique Get-Variable Get-WmiObject Invoke-Expression Invoke-History Invoke-Item Import-Alias Import-Csv Move-Item Move-ItemProperty New-Alias New-PSDrive New-Item New-Variable Out-Host Remove-PSDrive Remove-Item Rename-Item Rename-ItemProperty Remove-ItemProperty Remove-PSSnapin Remove-Variable Resolve-Path Set-Alias Start-Service Set-Content Select-Object Set-Item
Chapitre 2
55
Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias Alias
sl sleep sort sp spps spsv sv tee where ? write cat cd clear cp h history kill lp ls mount mv popd ps pushd pwd r rm rmdir echo cls chdir copy del dir erase move rd ren set type
Set-Location Start-Sleep Sort-Object Set-ItemProperty Stop-Process Stop-Service Set-Variable Tee-Object Where-Object Where-Object Write-Output Get-Content Set-Location Clear-Host Copy-Item Get-History Get-History Stop-Process Out-Printer Get-ChildItem New-PSDrive Move-Item Pop-Location Get-Process Push-Location Get-Location Invoke-History Remove-Item Remove-Item Write-Output Clear-Host Set-Location Copy-Item Remove-Item Get-ChildItem Remove-Item Move-Item Remove-Item Rename-Item Set-Variable Get-Content
PS C:\>
56
Partie 1
Introduction PowerShell
Nous avons dj vu comment utiliser Get-Alias pour obtenir la liste des alias dnis dans la session PowerShell en cours. Les applets de commande Export-Alias et Import-Alias permettent dexporter et dimporter des listes dalias entre des sessions PowerShell. Quant New-Alias et Set-Alias, elles permettent de dnir de nouveaux alias dans la session PowerShell en cours.
INFO Limplmentation des alias dans PowerShell est limite. Comme nous lavons mentionn prcdemment, un alias ne fonctionne que pour les applets de commande et les excutables, sans paramtres. Cependant, certaines mthodes permettent de contourner cette contrainte. Lune delles consiste dnir la commande dans une variable, puis appeler la variable depuis dautres commandes. Mais la variable ne peut tre appele que dans la session PowerShell en cours, sauf si elle est dnie dans le chier prole.ps1. Une autre mthode, conseille, consiste placer la commande dans une fonction.
Chapitre 2
57
Bien que lconomie de saisie soit attirante, nous vous dconseillons dabuser des alias. En effet, ils ne sont pas trs portables. Par exemple, si nous employons de nombreux alias dans un script, nous devons inclure une suite de commandes Set-Alias au dbut du script pour tre certain de lexistence de ces alias, quel que soit le prol de machine ou de session, au moment de lexcution du script. Cependant, leur principal problme nest pas la portabilit mais la confusion ou le masquage de la relle signication des commandes ou des scripts. Si les alias que nous dnissons ont un sens pour nous, tout le monde ne partage pas notre logique. Par consquent, si nous voulons que les autres utilisateurs comprennent nos scripts, nous devons viter de trop en employer. la place, il est prfrable de crer des fonctions rutilisables.
INFO Lorsque vous crez des alias pour des scripts, utilisez des noms comprhensibles par les autres personnes. Par exemple, il ny a aucune raison, autre que celle de vouloir chiffrer vos scripts, de crer des alias constitus uniquement de deux lettres.
Squences dchappement
Le caractre accent grave ou apostrophe inverse (`) joue le rle de caractre dchappement dans PowerShell. Selon son contexte dutilisation, PowerShell interprte les caractres qui le suivent immdiatement de diffrentes manires. Si lapostrophe inverse est utilise la n dune ligne dans un script, elle sert de caractre de continuation. Autrement dit, le rle de ` est quivalent celui de & en VBScript. Elle permet de dcouper les longues lignes de code en morceaux plus petits :
$Reg = get-wmiobject -Namespace Root\Default -computerName ` $Computer -List | where-object ` {$_.Name -eq "StdRegProv"}
58
Partie 1
Introduction PowerShell
Si lapostrophe inverse prcde une variable PowerShell, les caractres venant immdiatement aprs ne sont pas soumis la substitution et ne sont pas interprts :
PS PS La PS La PS C:\> $Chane = "Cela fonctionne-t-il ?" C:\> write-host "La question est : $Chane" question est : Cela fonctionne-t-il ? C:\> write-host "La question est : `$Chane question est : $Chane C:\>
Si lapostrophe inverse est employe dans une chane ou interprte comme une partie dune chane, cela signie que le caractre suivant doit tre considr comme un caractre spcial. Par exemple, pour placer un caractre de tabulation dans une chane, nous utilisons la squence dchappement `t :
PS C:\> $Chane = "Voyez la tabulation :`t [TAB]" PS C:\> write-host $Chane Voyez la tabulation : [TAB] PS C:\>
Signication
Apostrophe Guillemets Caractre nul Alarme (mission dun bip) Espace arrire Saut de page (pour les impressions) Saut de ligne Retour chariot Tabulation horizontale (8 espaces) Tabulation verticale (pour les impressions)
Chapitre 2
59
Porte globale
Comme limplique son nom, une porte globale sapplique lintgralit dune instance PowerShell. Les donnes de la porte globale sont hrites par toutes les portes enfants. Par consquent, nimporte quel script, commande ou fonction a accs aux variables dnies dans la porte globale. Cependant, les portes globales ne sont pas partages entre les diffrentes instances de PowerShell. Lexemple suivant montre la dnition de la variable globale $Processus dans la fonction AfcherProcessus. Puisque la variable $Processus est dnie globalement, nous pouvons consulter la valeur de $Processus.Count aprs la terminaison de AfcherProcessus. Nous obtenons le nombre de processus actifs au moment de lexcution dAfcherProcessus.
PS C:\> function AfcherProcessus {$Global:Processus = get-process} PS C:\> AfcherProcessus PS C:\> $Processus.Count 37
INFO Dans PowerShell, vous pouvez utiliser un indicateur de porte explicite pour xer la porte dune variable. Par exemple, si vous souhaitez quune variable rside dans la porte globale, dnissez-la avec $Global:nomDeLaVariable. Lorsque lindicateur explicite nest pas utilis, la variable rside dans la porte courante.
Porte locale
Une porte locale est cre dynamiquement chaque fois quune fonction, un ltre ou un script sexcute. Une fois la porte locale termine, les informations quelle contenait sont effaces. Une porte locale peut lire les informations dune porte globale, mais elle ne peut pas les modier.
60
Partie 1
Introduction PowerShell
Lexemple suivant montre la variable locale $Processus dnie dans la fonction AfcherProcessus. Aprs la n dAfcherProcessus, la variable $Processus ne contient plus aucune donne car elle a t dnie uniquement dans la fonction AfcherProcessus. Comme vous pouvez le constater, lafchage de la valeur de $Processus.Count, aprs lexcution de la fonction AfcherProcessus, ne produit aucun rsultat.
PS PS PS PS C:\> function AfcherProcessus {$Processus = get-process} C:\> AfcherProcessus C:\> $Processus.Count C:\>
Porte de script
Une porte de script est cre ds quun chier de script sexcute et elle est dtruite une fois le script termin. Pour illustrer ce fonctionnement, crons le script suivant et enregistrons-le sous le nom AfcherProcessus.ps1 :
$Processus = get-process write-host "Voici le premier processus :" -Foregroundcolor Yellow $Processus[0]
Excutons-le ensuite dans une session PowerShell. La sortie doit tre comparable la suivante :
PS C:\> .\AfcherProcessus.ps1 Voici le premier processus : Handles ------105 NPM(K) -----5 PM(K) ----1992 WS(K) VM(M) ----- ----4128 32 CPU(s) -----0,05 Id ProcessName -- ----------916 alg
PS C:\> $Processus[0] Impossible dindexer dans un tableau Null. Au niveau de ligne : 1 Caractre : 12 + $Processus[0 <<<< ] PS C:\>
Chapitre 2
61
Lorsque le script AfcherProcessus.ps1 sexcute, les informations concernant le premier objet de processus dans la variable $Processus sont afches sur la console. En revanche, lorsque nous essayons daccder aux informations contenues dans la variable $Processus depuis la console, une erreur est afche car cette variable nest valide que dans la porte du script. Lorsque le script se termine, cette porte et tout son contenu disparaissent. Que se passe-t-il si nous essayons dutiliser un script dans un pipeline ou dy accder comme une bibliothque de fonctions communes ? Normalement, ce fonctionnement nest pas possible car PowerShell dtruit une porte de script ds la n de son excution. Cela dit, PowerShell offre la commande "point", issue du monde UNIX. La commande point demande PowerShell de charger une porte de script dans la porte de lappelant. Pour utiliser cette fonctionnalit, il suft de prxer le nom de script par un point (.) lors de son invocation :
PS C:\> . .\monscript.ps1
Porte prive
Une porte prive est analogue une porte locale, une diffrence prs : ses dnitions ne sont pas hrites par les portes enfants. Lexemple suivant montre la dnition de la variable prive $Processus dans la fonction AfcherProcessus. Pendant lexcution de cette fonction, la variable $Processus nest pas disponible la porte enfant reprsente par le bloc de script plac entre les caractres { et } (lignes 6 9).
PS C:\> function AfcherProcessus {$Private:Processus = get-process >> write-host "Voici le premier processus :" -Foregroundcolor Yellow >> $Processus[0] >> write-host >> >> &{ >> write-host "Le voici nouveau :" -Foregroundcolor Yellow >> $Processus[0] >> } >> } >> PS C:\> AfcherProcessus
62
Partie 1
Introduction PowerShell
Voici le premier processus : Handles ------105 NPM(K) -----5 PM(K) ----1992 WS(K) VM(M) ----- ----4128 32 CPU(s) -----0,05 Id ProcessName -- ----------916 alg
Le voici nouveau : Impossible dindexer dans un tableau Null. Au niveau de ligne : 7 Caractre : 20 + $Processus[0 <<<< ]
PS C:\>
Cet exemple fonctionne car il utilise loprateur dinvocation &. Il est ainsi possible dexcuter des fragments de code dans une porte locale isole. Cette technique permet disoler un bloc de script et ses variables de la porte parente ou, comme dans cet exemple, dempcher un bloc de script daccder une variable prive.
Premier script
La plupart des commandes dcrites dans ce chapitre sont interactives. Autrement dit, nous saisissons des commandes linvite de PowerShell et la sortie est afche. Mme si lutilisation interactive de PowerShell est pratique pour des tches qui ne doivent tre effectues quune seule fois, cette mthode nest pas efcace pour reproduire des tches dautomation. Heureusement, PowerShell est capable de lire des chiers contenant des commandes. Nous pouvons ainsi crire, enregistrer, puis rappeler une suite de commandes selon les besoins. Lensemble de ces commandes enregistres est gnralement appel script. Les scripts PowerShell sont de simples chiers texte enregistrs avec lextension .ps1. Nous pouvons utiliser nimporte quel diteur de texte, comme Bloc-notes, pour crer un chier qui contient les commandes de notre script PowerShell. Par exemple, ouvrons Bloc-notes et saisissons les commandes suivantes :
get-service | where-object {$_.Status -eq "Stopped"}
AfcherServicesArretes.ps1
Chapitre 2
63
Avant de pouvoir excuter ce script, nous devons ajuster la stratgie dexcution de PowerShell car la conguration par dfaut interdit lexcution des scripts, pour des raisons de protection contre le code malveillant. Pour cela, invoquons Set-ExecutionPolicy comme le montre lexemple suivant. Nous pouvons galement utiliser Get-ExecutionPolicy pour connatre la stratgie dexcution en cours. (Le Chapitre 3 dtaillera la scurit PowerShell et les pratiques conseilles.)
PS C:\> set-executionpolicy RemoteSigned PS C:\> get-executionpolicy RemoteSigned PS C:\>
La stratgie RemoteSigned permet dexcuter les scripts crs localement sans quils soient signs numriquement (un concept qui sera expliqu au Chapitre 4, "Signer du code"). En revanche, les scripts tlchargs sur Internet doivent tre signs. Cette conguration nous donne toute libert dexcuter des scripts non signs provenant de la machine locale, tout en offrant une certaine protection contre les scripts externes non signs. Aprs avoir x la stratgie dexcution de PowerShell RemoteSigned, nous pouvons excuter le script dans une session PowerShell en entrant simplement son chemin de rpertoire complet et son nom de chier. Avec la commande C:\Scripts\AfcherServicesArretes. ps1, nous obtenons la sortie suivante :
PS C:\> C:\Scripts\AfcherServicesArretes.ps1 Status -----Stopped Stopped Stopped Stopped Stopped Stopped Stopped Stopped Stopped Stopped Stopped Stopped Stopped Name ---Alerter AppMgmt aspnet_state CiSvc ClipSrv clr_optimizatio... COMSysApp dmadmin HidServ HTTPFilter IDriverT ImapiService mnmsrvc DisplayName ----------Avertissement Gestion dapplications Service dtat ASP.NET Service dindexation Gestionnaire de lAlbum .NET Runtime Optimization Service v... Application systme COM+ Service dadministration du Gestion... Accs du priphrique dinterface u... HTTP SSL InstallDriver Table Manager Service COM de gravage de CD IMAPI Partage de Bureau distance NetMee...
64
Partie 1
Introduction PowerShell
Stopped Stopped Stopped Stopped Stopped Stopped Stopped Stopped Stopped Stopped Stopped Stopped Stopped Stopped Stopped Stopped Stopped Stopped Stopped Stopped Stopped Stopped Stopped Stopped
MSDTC MSIServer NetDDE NetDDEdsdm NtLmSsp NtmsSvc ose RasAuto RDSessMgr RemoteAccess RemoteRegistry RpcLocator RSVP SCardSvr SwPrv SysmonLog TlntSvr upnphost UPS VSS WmdmPmSN Wmi WmiApSrv xmlprov
Distributed Transaction Coordinator Windows Installer DDE rseau DSDM DDE rseau Fournisseur de la prise en charge d... Stockage amovible Ofce Source Engine Gestionnaire de connexion automatiq... Gestionnaire de session daide sur ... Routage et accs distant Accs distance au Registre Localisateur dappels de procdure ... QoS RSVP Carte puce MS Software Shadow Copy Provider Journaux et alertes de performance Telnet Hte de priphrique universel Plug... Onduleur Clich instantan de volume Service de numro de srie du lecte... Extensions du pilote WMI Carte de performance WMI Service dapprovisionnement rseau
PS C:\>
Bien que ce script dune ligne soit simple, il illustre parfaitement lcriture et lutilisation dun script dans PowerShell. Si ncessaire, nous pouvons inclure dautres commandes pour quil effectue une tche dautomation. En voici un exemple :
param ([string] $DemarrerAvec) $ServicesArretes = get-service | where-object {$_.Status -eq "Stopped"} write-host Les services $DemarrerAvec suivants sont arrts sur" ` "$Env:COMPUTERNAME : -Foregroundcolor Yellow $ServicesArretes | where-object {$_.Name -like $DemarrerAvec} | ` format-table Name, DisplayName
Chapitre 2
65
PS C:\>
Ce script est un peu plus complexe car il peut ltrer les services arrts en fonction de la chane fournie. Il ne sagit pas dun lment dautomation trs compliqu, mais il permet dillustrer quelques possibilits de PowerShell. Pour en bncier, vous devez simplement mieux comprendre les fonctionnalits de PowerShell an dcrire des scripts plus complexes et plus intressants.
En rsum
Vous venez de dcouvrir les bases de PowerShell. Au cours de cet apprentissage, vous avez fait connaissance avec certains concepts, comme les diffrents types de commandes PowerShell, les applets de commandes (cmdlets), les alias, les variables, linterface en ligne de commande et les portes. Aprs cette prsentation, vous avez abord lcriture de scripts PowerShell et dvelopp votre premier script. Cependant, llment le plus important de ce chapitre est que vous avez tlcharg et install PowerShell avant de commencer le manipuler. En utilisant simplement PowerShell, vous avez franchi la premire des nombreuses tapes menant sa matrise complte. Le premier pas est toujours le plus difcile et, une fois fait, la route devient de plus en plus facile. En lisant les chapitres suivants, vous remarquerez que vos comptences augmentent avec lacquisition de nouveaux concepts et lutilisation de PowerShell dans la ralisation de tches dautomation.
3
Prsentation avance de PowerShell
Dans ce chapitre
m m m m m m m m
Introduction Orientation objet Comprendre les fournisseurs Comprendre les erreurs Grer les erreurs Prols Comprendre la scurit Langage
Introduction
Ce chapitre dtaille certaines particularits du fonctionnement de PowerShell que vous devez comprendre avant de passer aux chapitres traitant de lcriture de scripts. Ne vous attachez pas trop aux dtails. Lobjectif est de comprendre les concepts. Puisque PowerShell apporte son lot de changements par rapport lancienne criture des scripts pour Windows, vous devez galement modier vos mthodes de dveloppement. Avec un peu de pratique, lcriture de scripts PowerShell vous sera aussi familire que le dveloppement de scripts en VBScript ou JScript, qui constituent les mthodes standard pour mettre en uvre des tches dautomation sous Windows.
68
Partie 1
Introduction PowerShell
Orientation objet
La plupart des shells oprent dans un environnement de type texte. Cela signie gnralement que la sortie doit tre traite pour effectuer des tches dautomation. Par exemple, si les donnes dune commande doivent tre envoyes une autre commande, la sortie de la premire doit gnralement tre remise en forme an de rpondre aux exigences dentre de la seconde. Mme si cette mthode fonctionne depuis des annes, le traitement de donnes dans un format textuel peut tre difcile et frustrant. Le plus souvent, un travail important est ncessaire pour transformer les donnes textuelles en un format utilisable. Dans PowerShell, Microsoft a dcid de modier les standards. Au lieu de transporter les donnes sous forme de texte brut, PowerShell le fait sous forme dobjets .NET Framework, ce qui permet aux applets de commande daccder directement aux proprits et aux mthodes dun objet. Cette volution simplie galement lusage du shell. Plutt que de modier des donnes textuelles, nous pouvons simplement faire rfrence aux donnes requises par leur nom. De mme, au lieu dcrire du code pour convertir les donnes dans un format utilisable, nous pouvons simplement faire rfrence aux objets et les manipuler comme bon nous semble.
Comprendre le pipeline
Les objets nous apportent une mthode de traitement des donnes plus robuste. Par le pass, les donnes taient transfres dune commande la suivante en utilisant un pipeline (tube). Il est ainsi possible denchaner une suite de commandes an de runir des informations concernant un systme. Cependant, comme nous lavons mentionn prcdemment, la plupart des shells prsentent un inconvnient majeur : les informations fournies par les commandes sont du texte. Ce texte brut doit tre transform en un format compatible avec la commande suivante avant dtre plac dans le pipeline. Pour comprendre ce fonctionnement, examinons lexemple Bash suivant :
$ ps -ef | grep "bash" | cut -f2
Lobjectif est de trouver lidentiant du processus (PID, Process ID) bash. La liste des processus en cours dexcution est obtenue laide de la commande ps. Ensuite, elle est envoye, via un tube (|), la commande grep, qui applique un ltre avec la chane "bash". Les informations restantes sont envoyes la commande cut, qui retourne le second champ, dans lequel se trouve le PID (le dlimiteur de champ est un caractre de tabulation).
Chapitre 3
69
INFO Un dlimiteur est un caractre qui sert sparer les champs de donnes. Le dlimiteur par dfaut de la commande cut est un caractre de tabulation. Pour choisir un autre dlimiteur, vous devez utiliser le paramtre -d.
Daprs les informations des pages de manuel des commandes grep et cut, la commande ps devrait fonctionner. Cependant, le PID nest pas retourn ni afch dans le bon format. La commande ne fonctionne pas car le shell Bash nous oblige manipuler les donnes textuelles pour afcher le PID. La commande ps envoie sa sortie dans un format textuel et sa conversion en un format utilisable ncessite dautres commandes, comme grep et cut. La manipulation des donnes textuelles complique notre tche. Par exemple, pour obtenir le PID partir des donnes renvoyes par la commande grep, nous devons indiquer lemplacement du champ et le dlimiteur pour que la commande cut produise linformation recherche. Pour cela, excutons la premire partie de la commande ps :
$ ps -ef | grep "bash" bob 3628 1 con
16:52:46 /usr/bin/bash
Le champ recherch est le second (3628). Vous remarquerez que la commande ps ne spare pas les colonnes de sa sortie par un caractre de tabulation. la place, elle utilise un nombre variable despaces ou un dlimiteur espace blanc entre les champs.
INFO Un dlimiteur espace blanc est constitu de caractres, comme les espaces ou les tabulations, qui quivalent un espace vide.
La commande cut ne peut savoir que les espaces doivent tre employs comme sparateurs de champ. Il sagit de la raison du dysfonctionnement de la commande. Pour obtenir le PID, nous devons nous servir du langage awk. La commande et la sortie deviennent alors les suivantes :
$ ps -ef | grep "bash" | awk {print $2} 3628
70
Partie 1
Introduction PowerShell
Le point important est que, malgr la puissance des commandes des shells UNIX et Linux, ils peuvent tre compliqus et frustrants. Puisque ces shells utilisent un format textuel, les commandes manquent souvent de fonctionnalits ou ncessitent des commandes ou des outils supplmentaires pour effectuer certaines tches. Pour prendre en charge les diffrences dans les sorties textuelles des commandes du shell, de nombreux utilitaires et langages de scripts ont t dvelopps. Toutes ces conversions ont pour rsultat une arborescence de commandes et doutils qui rendent les shells difciles manier et gourmands en temps. Cest lune des raisons de la prolifration des interfaces de gestion graphiques. Cette tendance se retrouve galement parmi les outils employs par les administrateurs de systmes Windows. En effet, Microsoft sest attach amliorer les interfaces de gestion graphiques aux dpens des interfaces en ligne de commande. Aujourdhui, les administrateurs Windows ont accs aux mmes possibilits dautomation que leurs collgues UNIX et Linux. Cependant, PowerShell et son orientation objet permettent de satisfaire les besoins dautomation que les administrateurs Windows ont exprims depuis les premiers jours des traitements par lots et de WSH : une plus grande facilit dutilisation et moins de conversions. Lexemple suivant montre comment fonctionne le pipeline de commandes PowerShell :
PS C:\> get-process bash | format-table id -autosize Id -3628
PS C:\>
linstar de lexemple Bash, lobjectif est dafcher le PID du processus bash. Tout dabord, les informations concernant ce processus sont obtenues laide de Get-Process. Ensuite, elles sont envoyes lapplet de commande Format-Table, qui retourne un tableau contenant uniquement le PID du processus Bash. Lexemple Bash exige lcriture dune commande shell complexe, contrairement lexemple PowerShell qui ncessite simplement la mise en forme dun tableau. Comme vous pouvez le constater, la structure des applets de commandes PowerShell est beaucoup plus facile comprendre et utiliser.
Chapitre 3
71
bash,
Grce New-Object, nous disposons dune instance de la classe Ping qui permet de dterminer si un ordinateur distant peut tre contact via ICMP (Internet Control Message Protocol). Autrement dit, nous disposons dune version objet de loutil en ligne de commande Ping.exe. Vous vous demandez peut-tre quel est le remplaant de la mthode VBScript CreateObject : il sagit de lapplet de commande New-Object. Nous pouvons galement employer loption comObject de cette applet de commande pour crer un objet COM, simplement en prcisant lidenticateur de programmes (ProgID) de lobjet :
PS PS PS PS C:\> $IE = new-object -comObject InternetExplorer.Application C:\> $IE.Visible=$True C:\> $IE.Navigate("www.france3.fr") C:\>
72
Partie 1
Introduction PowerShell
Crochets
Dans ce livre, vous remarquerez lusage des crochets ([ et ]), qui indiquent que le terme inclus est une rfrence .NET Framework. Voici les rfrences valides :
n .Forest] n n
[System.DirectoryServices.ActiveDirectory
une classe de l'espace de noms System, par exemple [string], [int], [boolean], etc. ; un type abrg, par exemple [ADSI], [WMI], [Regex], etc.
INFO
La dnition dune variable est un bon exemple dutilisation dune rfrence .NET Framework. Dans le cas suivant, une numration est affecte une variable en utilisant une conversion explicite en une classe .NET :
PS C:\> $UnNombre = [int]1 PS C:\> $Identite = [System.Security.Principal.NTAccount]"Administrateur" PS C:\>
Si une numration ne peut tre constitue que dun ensemble g de constantes, que nous ne connaissons pas, nous pouvons utiliser la mthode GetNames de la classe System.Enum pour obtenir cette information :
PS C:\> [enum]::GetNames([System.Security.AccessControl.FileSystemRights]) ListDirectory ReadData WriteData CreateFiles CreateDirectories AppendData ReadExtendedAttributes WriteExtendedAttributes Traverse ExecuteFile DeleteSubdirectoriesAndFiles
Chapitre 3
73
ReadAttributes WriteAttributes Write Delete ReadPermissions Read ReadAndExecute Modify ChangePermissions TakeOwnership Synchronize FullControl PS C:\>
Les crochets ne servent pas uniquement dnir des variables, mais galement utiliser ou invoquer des membres statiques dune classe .NET. Pour cela, il suft de placer deux caractres deux-points (::) entre le nom de la classe et la mthode ou la proprit statique :
PS C:\> [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()
Name Sites Domains GlobalCatalogs ApplicationPartitions ForestMode RootDomain Schema SchemaRoleOwner NamingRoleOwner
: : : : : : : : : :
taosage.internal {HOME} {taosage.internal} {sol.taosage.internal} {DC=DomainDnsZones,DC=taosage,DC=internal, DC=ForestDns Zones,DC=taosage,DC=internal} Windows2003Forest taosage.internal CN=Schema,CN=Conguration,DC=taosage,DC=internal sol.taosage.internal sol.taosage.internal
PS C:\>
74
Partie 1
Introduction PowerShell
Rexion
La rexion est une fonctionnalit .NET Framework qui permet aux dveloppeurs dexaminer des objets et de retrouver leurs mthodes, leurs proprits, leurs champs, etc. Puisque PowerShell sappuie sur .NET Framework, il offre galement cette possibilit, grce lapplet de commande Get-Member. Elle analyse lobjet ou lensemble dobjets que nous lui passons via le pipeline. Par exemple, la commande suivante analyse les objets retourns par Get-Process et afche leurs proprits et leurs mthodes :
PS C:\> get-process | get-member
Les dveloppeurs dsignent souvent ce processus sous le terme "interroger" un objet. Cette solution permet dobtenir plus rapidement des informations sur des objets que dinvoquer lapplet de commande Get-Help (qui, au moment de lcriture de ces lignes, fournit des informations limites), de lire la documentation MSDN ou de faire une recherche sur Internet.
PS C:\> get-process | get-member
TypeName: System.Diagnostics.Process Name ---Handles Name NPM PM VM WS add_Disposed add_ErrorDataReceived add_Exited add_OutputDataReceived BeginErrorReadLine BeginOutputReadLine CancelErrorRead CancelOutputRead Close CloseMainWindow CreateObjRef Dispose Equals MemberType ---------AliasProperty AliasProperty AliasProperty AliasProperty AliasProperty AliasProperty Method Method Method Method Method Method Method Method Method Method Method Method Method Denition ---------Handles = Handlecount Name = ProcessName NPM = NonpagedSystemMemorySize PM = PagedMemorySize VM = VirtualMemorySize WS = WorkingSet System.Void add_Disposed(Event... System.Void add_ErrorDataRecei... System.Void add_Exited(EventHa... System.Void add_OutputDataRece... System.Void BeginErrorReadLine() System.Void BeginOutputReadLine() System.Void CancelErrorRead() System.Void CancelOutputRead() System.Void Close() System.Boolean CloseMainWindow() System.Runtime.Remoting.ObjRef... System.Void Dispose() System.Boolean Equals(Object obj)
Chapitre 3
75
get_BasePriority get_Container get_EnableRaisingEvents ... __NounName BasePriority Container EnableRaisingEvents ExitCode ExitTime Handle HandleCount HasExited Id MachineName MainModule MainWindowHandle MainWindowTitle MaxWorkingSet MinWorkingSet ... Company CPU Description FileVersion Path Product ProductVersion
Method Method Method NoteProperty Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property ScriptProperty ScriptProperty ScriptProperty ScriptProperty ScriptProperty ScriptProperty ScriptProperty
System.Int32 get_BasePriority() System.ComponentModel.IContain... System.Boolean get_EnableRaisi... System.String __NounName=Process System.Int32 BasePriority {get;} System.ComponentModel.IContain... System.Boolean EnableRaisingEv... System.Int32 ExitCode {get;} System.DateTime ExitTime {get;} System.IntPtr Handle {get;} System.Int32 HandleCount {get;} System.Boolean HasExited {get;} System.Int32 Id {get;} System.String MachineName {get;} System.Diagnostics.ProcessModu... System.IntPtr MainWindowHandle... System.String MainWindowTitle ... System.IntPtr MaxWorkingSet {g... System.IntPtr MinWorkingSet {g... System.Object System.Object System.Object System.Object System.Object System.Object System.Object Company {get=$th... CPU {get=$this.T... Description {get... FileVersion {get... Path {get=$this.... Product {get=$th... ProductVersion {...
PS C:\>
Cet exemple montre que les objets retourns par Get-Process possdent des proprits que nous ne connaissions pas. Lexemple suivant utilise ces informations pour gnrer un rapport sur les processus appartenant Microsoft, ainsi que leur emplacement :
PS C:\> get-process | where-object {$_.Company -match ".*Microsoft*"} | format-table Name, ID, Path -Autosize Name ---ctfmon Id Path -- ---4052 C:\WINDOWS\system32\ctfmon.exe
76
Partie 1
Introduction PowerShell
explorer iexplore iexplore mobsync notepad notepad notepad notepad OUTLOOK powershell WINWORD
3024 2468 3936 280 1600 2308 2476 2584 3600 3804 2924
C:\WINDOWS\Explorer.EXE C:\Program Files\Internet Explorer\iexplore.exe C:\Program Files\Internet Explorer\iexplore.exe C:\WINDOWS\system32\mobsync.exe C:\WINDOWS\system32\notepad.exe C:\WINDOWS\system32\notepad.exe C:\WINDOWS\system32\NOTEPAD.EXE C:\WINDOWS\system32\notepad.exe C:\Program Files\Microsoft Ofce\OFFICE11\OUTLOOK.EXE C:\Program Files\Windows PowerShell\v1.0\powershell.exe C:\Program Files\Microsoft Ofce\OFFICE11\WINWORD.EXE
PS C:\>
Une seule ligne de code WSH serait bien incapable dobtenir ces informations sur le processus.
Get-Member nest pas rserve aux objets gnrs par les applets de commande PowerShell. Nous pouvons galement lemployer sur des objets initialiss partir de classe .NET, par exemple : PS C:\> new-object System.DirectoryServices.DirectorySearcher
La classe DirectorySearcher a pour fonction dobtenir des informations sur un utilisateur depuis Active Directory, mais nous ne connaissons pas les mthodes prises en charge par les objets retourns. Pour connatre cette information, excutons Get-Member sur une variable contenant les objets mystrieux :
PS C:\> $Recherche = new-object System.DirectoryServices.DirectorySearcher PS C:\> $Recherche | get-member
TypeName: System.DirectoryServices.DirectorySearcher Name ---add_Disposed CreateObjRef Dispose Equals FindAll MemberType ---------Method Method Method Method Method Denition ---------System.Void add_Disposed(EventHandle... System.Runtime.Remoting.ObjRef Creat... System.Void Dispose() System.Boolean Equals(Object obj) System.DirectoryServices.SearchResul...
Chapitre 3
77
FindOne ... Asynchronous AttributeScopeQuery CacheResults ClientTimeout Container DerefAlias DirectorySynchronization ExtendedDN Filter PageSize PropertiesToLoad PropertyNamesOnly ReferralChasing SearchRoot SearchScope SecurityMasks ServerPageTimeLimit ServerTimeLimit Site SizeLimit Sort Tombstone VirtualListView
Method Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property
System.DirectoryServices.SearchResul... System.Boolean Asynchronous {get;set;} System.String AttributeScopeQuery {g... System.Boolean CacheResults {get;set;} System.TimeSpan ClientTimeout {get;s... System.ComponentModel.IContainer Con... System.DirectoryServices.Dereference... System.DirectoryServices.DirectorySy... System.DirectoryServices.ExtendedDN ... System.String Filter {get;set;} System.Int32 PageSize {get;set;} System.Collections.Specialized.Strin... System.Boolean PropertyNamesOnly {ge... System.DirectoryServices.ReferralCha... System.DirectoryServices.DirectoryEn... System.DirectoryServices.SearchScope... System.DirectoryServices.SecurityMas... System.TimeSpan ServerPageTimeLimit ... System.TimeSpan ServerTimeLimit {get... System.ComponentModel.ISite Site {ge... System.Int32 SizeLimit {get;set;} System.DirectoryServices.SortOption ... System.Boolean Tombstone {get;set;} System.DirectoryServices.DirectoryVi...
PS C:\>
Vous noterez la prsence de la mthode FindAll et de la proprit Filter. Il sagit dattributs dobjets qui peuvent servir rechercher des informations concernant des utilisateurs dans un domaine Active Directory. La premire tape, pour utiliser ces attributs, consiste ltrer les informations renvoyes par DirectorySearcher grce la proprit Filter, qui attend une instruction de ltre analogue celles employes avec LDAP (Lightweight Directory Access Protocol) :
PS C:\> $Recherche.Filter = ("(objectCategory=user)")
78
Partie 1
Introduction PowerShell
Ensuite, nous rcuprons tous les utilisateurs du domaine Active Directory laide de la mthode FindAll :
PS C:\> $Utilisateurs = $Recherche.FindAll()
ce stade, la variable $Utilisateurs englobe une collection dobjets contenant les identiants uniques (DN, Distinguished Name) de tous les utilisateurs du domaine Active Directory :
PS C:\> $Utilisateurs Path Properties ------------LDAP://CN=Administrator,CN=Users,DC=... {homemdb, samaccounttype, countrycod... LDAP://CN=Guest,CN=Users,DC=taosage,... {samaccounttype, objectsid, whencrea... LDAP://CN=krbtgt,CN=Users,DC=taosage... {samaccounttype, objectsid, whencrea... LDAP://CN=admintyson,OU=Admin Accoun... {countrycode, cn, lastlogoff, usncre... LDAP://CN=servmom,OU=Service Account... {samaccounttype, lastlogontimestamp,... LDAP://CN=SUPPORT_388945a0,CN=Users,... {samaccounttype, objectsid, whencrea... LDAP://CN=Tyson,OU=Acc... {msmqsigncerticates, distinguished... LDAP://CN=Maiko,OU=Acc... {homemdb, msexchhomeservername, coun... LDAP://CN=servftp,OU=Service Account... {samaccounttype, lastlogontimestamp,... LDAP://CN=Erica,OU=Accounts,OU... {samaccounttype, lastlogontimestamp,... LDAP://CN=Garett,OU=Accou... {samaccounttype, lastlogontimestamp,... LDAP://CN=Fujio,OU=Accounts,O... {samaccounttype, givenname, sn, when... LDAP://CN=Kiyomi,OU=Accounts,... {samaccounttype, givenname, sn, when... LDAP://CN=servsql,OU=Service Account... {samaccounttype, lastlogon, lastlogo... LDAP://CN=servdhcp,OU=Service Accoun... {samaccounttype, lastlogon, lastlogo... LDAP://CN=servrms,OU=Service Account... {lastlogon, lastlogontimestamp, msmq...
PS C:\>
INFO Les commandes de ces exemples utilisent les paramtres de connexion par dfaut de la classe DirectorySearcher. Autrement dit, la connexion Active Directory emploie le contexte de nommage par dfaut. Si vous souhaitez tablir une connexion un domaine autre que celui par dfaut, vous devez xer les paramtres de connexion appropris.
Chapitre 3
79
Nous disposons prsent dun objet pour chaque utilisateur. Nous pouvons utiliser lapplet de commande Get-Member pour en savoir plus sur ces objets :
PS C:\> $Utilisateurs | get-member
TypeName: System.DirectoryServices.SearchResult Name ---Equals get_Path get_Properties GetDirectoryEntry GetHashCode GetType ToString Path Properties MemberType ---------Method Method Method Method Method Method Method Property Property Denition ---------System.Boolean Equals(Object obj) System.String get_Path() System.DirectoryServices.ResultPropertyCollecti... System.DirectoryServices.DirectoryEntry GetDire... System.Int32 GetHashCode() System.Type GetType() System.String ToString() System.String Path {get;} System.DirectoryServices.ResultPropertyCollecti...
PS C:\>
Pour obtenir les informations concernant ces objets dutilisateurs, il semblerait que nous devions les prendre tour tour et invoquer leur mthode GetDirectoryEntry. Pour connatre les donnes que nous allons obtenir, appelons nouveau Get-Member :
PS C:\> $Utilisateurs[0].GetDirectoryEntry() | get-member -MemberType Property
TypeName: System.DirectoryServices.DirectoryEntry Name ---accountExpires adminCount badPasswordTime badPwdCount cn codePage countryCode description displayName distinguishedName MemberType ---------Property Property Property Property Property Property Property Property Property Property Denition ---------System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property...
80
Partie 1
Introduction PowerShell
homeMDB homeMTA instanceType isCriticalSystemObject lastLogon lastLogonTimestamp legacyExchangeDN logonCount mail mailNickname mDBUseDefaults memberOf msExchALObjectVersion msExchHomeServerName msExchMailboxGuid msExchMailboxSecurityDescriptor msExchPoliciesIncluded msExchUserAccountControl mSMQDigests mSMQSignCerticates name nTSecurityDescriptor objectCategory objectClass objectGUID objectSid primaryGroupID proxyAddresses pwdLastSet sAMAccountName sAMAccountType showInAddressBook textEncodedORAddress userAccountControl uSNChanged uSNCreated whenChanged whenCreated
Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property
System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property... System.DirectoryServices.Property...
PS C:\>
Chapitre 3
81
INFO Le paramtre MemberType demande Get-Member de retrouver un type de membre particulier. Par exemple, pour afcher les mthodes associes un objet, utilisez la commande get-member MemberType Mthode.
Si vous voulez rellement utiliser PowerShell, vous devez vous familiariser avec Get-Member. Si vous ne comprenez pas son fonctionnement, il vous sera parfois difcile de dterminer les possibilits dun objet. Nous savons prsent comment extraire des informations depuis Active Directory. Nous pouvons donc runir toutes les commandes prcdentes :
PS C:\> $Recherche = new-object System.DirectoryServices.DirectorySearcher PS C:\> $Recherche.Filter = ((objectCategory=user)) PS C:\> $Utilisateurs = $Recherche.FindAll() PS C:\> foreach ($Utilisateur in $Utilisateurs){$Utilisateur.GetDirectoryEntry() .sAMAccountName} Administrator Guest krbtgt admintyson servmom SUPPORT_388945a0 Tyson Maiko servftp Erica Garett Fujio Kiyomi servsql servdhcp servrms PS C:\>
Bien que la liste des utilisateurs de ce domaine ne soit pas trs longue, elle montre parfaitement que nous pouvons interroger un ensemble dobjets pour en comprendre les possibilits.
82
Partie 1
Introduction PowerShell
Nous pouvons faire de mme pour les classes statiques. Mais, si lon tente dutiliser Get-Member comme nous lavons fait prcdemment, nous obtenons lerreur suivante :
PS C:\> new-object System.Net.Dns New-Object : Constructeur introuvable. Impossible de trouver un constructeur appropri pour le type System.Net.Dns. Au niveau de ligne : 1 Caractre : 11 + new-object <<<< System.Net.Dns PS C:\>
Ainsi que vous le constatez, la classe System.Net.Dns ne possde pas de constructeur, ce qui ne nous facilite pas la tche. Cependant, Get-Member sait galement comment traiter ce cas. Avec le paramtre Static, nous pouvons obtenir les informations concernant les classes statiques :
PS C:\> [System.Net.Dns] | get-member -Static
TypeName: System.Net.Dns Name ---BeginGetHostAddresses BeginGetHostByName BeginGetHostEntry BeginResolve EndGetHostAddresses EndGetHostByName EndGetHostEntry EndResolve Equals GetHostAddresses GetHostByAddress GetHostByName GetHostEntry GetHostName ReferenceEquals Resolve MemberType ---------Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Denition ---------static System.IAsyncResult BeginGetHostAddr... static System.IAsyncResult BeginGetHostByNa... static System.IAsyncResult BeginGetHostEntr... static System.IAsyncResult BeginResolve(Str... static System.Net.IPAddress[] EndGetHostAdd... static System.Net.IPHostEntry EndGetHostByN... static System.Net.IPHostEntry EndGetHostEnt... static System.Net.IPHostEntry EndResolve(IA... static System.Boolean Equals(Object objA, O... static System.Net.IPAddress[] GetHostAddres... static System.Net.IPHostEntry GetHostByAddr... static System.Net.IPHostEntry GetHostByName... static System.Net.IPHostEntry GetHostEntry(... static System.String GetHostName() static System.Boolean ReferenceEquals(Objec... static System.Net.IPHostEntry Resolve(Strin...
PS C:\
Chapitre 3
83
Nous savons tout de la classe System.Net.Dns et nous pouvons donc la mettre en uvre. Comme exemple, utilisons la mthode GetHostAddress an de connatre ladresse IP du site Web www.digg.com :
PS C:\> [System.Net.Dns]::GetHostAddresses("www.digg.com")
: : : : : : :
PS C:\>
INFO Nous venons de le voir, lapplet de commande Get-Member peut tre un outil trs puissant. Elle peut galement tre pernicieuse car il est facile de passer des heures explorer les possibilits des diffrentes applets de commande et des classes. Pour vous empcher dtre victime du syndrome de lutilisateur stress de Get-Member, essayez de limiter vos sessions de dcouverte deux heures par jour.
Vous pourriez penser que les scripts PowerShell nutilisent aucun systme de type car il est rarement ncessaire de prciser le type dune variable. Mais cest faux. En effet, PowerShell sinterface avec diffrents types dobjets issus de .NET, de WMI (Windows Management Instrumentation), de COM (Component Object Model), dADO (ActiveX Data Objects), dADSI (Active Directory Service Interfaces), de XML (Extensible Markup Language) et mme dobjets personnels. En revanche, les types ne nous concernent gnralement pas car PowerShell sadapte aux diffrents types dobjets et afche son interprtation dun objet notre place. En quelque sorte, PowerShell tente de fournir une couche dabstraction commune qui offre des interactions cohrentes avec les objets, malgr lexistence des types. Cette couche dabstraction est PSObject. Il sagit dun objet commun employ pour tous les accs aux objets.
84
Partie 1
Introduction PowerShell
Il peut encapsuler nimporte quel objet de base (.NET, personnel, etc.), nimporte quel membre dune instance et un accs implicite ou explicite aux membres tendus adapts et du type, selon le type de lobjet de base. Par ailleurs, il peut tablir son type et ajouter des membres dynamiquement. Pour cela, PowerShell utilise le systme de types tendu (ETS, Extended Type System), qui fournit une interface permettant aux dveloppeurs dapplets de commande et de scripts de manipuler et de modier les objets selon les besoins.
INFO Lorsque vous utilisez Get-Member, les informations obtenues proviennent de PSObject. Il arrive que PSObject cache des membres, des mthodes et des proprits de lobjet originel. Si vous souhaitez voir les informations bloques, utilisez la proprit BaseObject dont le nom standard est PSBase. Par exemple, la commande $Procs.PSBase | get-member afche les informations bloques de la collection $Procs. Bien entendu, cet aspect fait partie des sujets avancs, car PSBase nest pas mentionne. Vous devrez lutiliser lorsque PSObject ninterprte pas correctement un objet ou lorsque vous voudrez tudier les aspects cachs de PowerShell.
Par consquent, grce au systme de types tendu, nous pouvons modier des objets en adaptant leur structure nos besoins ou crer de nouveaux objets. Pour manipuler des objets, une solution consiste adapter (tendre) des types existants ou crer de nouveaux types dobjets. Pour cela, il faut dnir les types personnaliss dans un chier de type, dont la structure repose sur le chier des types par dfaut, Types.ps1xml. Dans ce chier, tous les types se trouvent dans un nud <Type></Type> et chaque type peut contenir des membres standard, des membres de donnes et des mthodes dobjet. En nous appuyant sur cette structure, nous pouvons crer notre propre chier de types personnaliss et le charger dans une session PowerShell grce lapplet de commande Update-TypeData :
PS C:\> Update-TypeData D:\PS\Mes.Types.Ps1xml
Cette commande doit tre excute manuellement pour chaque session PowerShell ou ajoute au chier prole.ps1.
Chapitre 3
85
ATTENTION Le chier Types.ps1xml dnit des comportements par dfaut pour tous les objets de PowerShell. Vous ne devez en aucun cas le modier, sinon vous pourriez empcher le fonctionnement de PowerShell.
La seconde faon de manipuler la structure dun objet passe par lapplet de commande Add-Member. Elle permet dajouter un membre dni par lutilisateur une instance dobjet existante :
PS PS >> >> >> PS C:\> $Procs = get-process C:\> $Procs | add-member -Type scriptProperty "TotalDays" { $Date = get-date $Date.Subtract($This.StartTime).TotalDays} C:\>
Ce code cre un membre scriptProperty nomm TotalDays pour la collection dobjets contenue dans la variable $Procs. Le membre scriptProperty peut ensuite tre appel comme nimporte quel autre membre de ces objets :
INFO Lorsque vous crez une mthode de script, la variable $This reprsente lobjet courant.
PS C:\> $Procs | where {$_.name -Match "WINWORD"} | ft Name,TotalDays AutoSize Name TotalDays -----------WINWORD 5,1238899696898148
PS C:\>
Mme si le membre scriptProperty nest pas particulirement utile, il montre bien comment tendre un objet. Cette capacit dextension des objets est extrmement utile, que ce soit pour lcriture dun script ou le dveloppement dune applet de commande.
86
Partie 1
Introduction PowerShell
Chapitre 3
87
Pop-Location Push-Location Set-Location APPLETS DE COMMANDE PATH Join-Path Convert-Path Split-Path Resolve-Path Test-Path APPLETS DE COMMANDE PROPERTY Clear-Itemproperty Copy-ItemProperty Get-ItemProperty Move-ItemProperty New-ItemProperty Remove-ItemProperty Rename-ItemProperty Set-ItemProperty APPLETS DE COMMANDE PROVIDER Get-PSProvider
PS C:\>
88
Partie 1
Introduction PowerShell
Cette liste prsente non seulement les fournisseurs intgrs, mais galement les lecteurs reconnus par chacun deux. Un lecteur est une entit utilise par un fournisseur pour reprsenter un magasin de donnes et au travers duquel ces donnes sont rendues disponibles la session PowerShell. Par exemple, le fournisseur Registry cre un lecteur PowerShell pour les cls HKEY_LOCAL_MACHINE et HKEY_CURRENT_USER. La commande suivante afche tous les lecteurs PowerShell reconnus :
PS C:\> get-psdrive Name ---Alias C cert D E Env F Function G HKCU HKLM U Variable Provider -------Alias FileSystem Certicate FileSystem FileSystem Environment FileSystem Function FileSystem Registry Registry FileSystem Variable Root ---C:\ \ D:\ E:\ F:\ G:\ HKEY_CURRENT_USER HKEY_LOCAL_MACHINE U
PS C:\>
Chapitre 3
89
Get-ChildItem
PS HKLM:\software\microsoft\windows> get-childitem
Hive: Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\software\micros oft\windows SKC --55 0 0 1 0 VC -13 16 36 0 0 Name ---CurrentVersion Help Html Help ITStorage Shell Property -------{DevicePath, MediaPathUnexpanded, SM_... {PINTLPAD.HLP, PINTLPAE.HLP, IMEPADEN... {PINTLGNE.CHM, PINTLGNT.CHM, PINTLPAD... {} {}
PS HKLM:\software\microsoft\windows>
Vous remarquerez quavec le fournisseur Registry, Get-ChildItem donne uniquement la liste des sous-cls dune cl, sans les valeurs du Registre. En effet, les valeurs du Registre sont considres comme des proprits dune cl, non comme un lment valide. Pour obtenir ces valeurs, nous devons utiliser lapplet de commande Get-ItemProperty :
PS HKLM:\software\microsoft\windows> get-itemproperty currentversion
PSPath PSParentPath PSChildName PSDrive PSProvider DevicePath MediaPathUnexpanded SM_GamesName SM_CongureProgramsName ProgramFilesDir
: Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHI NE\software\microsoft\windows\currentversion : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHI NE\software\microsoft\windows : currentversion : HKLM : Microsoft.PowerShell.Core\Registry : C:\WINDOWS\inf : C:\WINDOWS\Media : Jeux : Congurer les programmes par dfaut : C:\Program Files
90
Partie 1
Introduction PowerShell
: : : : : : :
C:\Program Files\Fichiers communs 76487-OEM-0011903-00101 C:\WINDOWS\Web\Wallpaper C:\WINDOWS\Media C:\Program Files Accessoires Accessoires
PS HKLM:\software\microsoft\windows>
Comme pour Get-Process, les donnes obtenues sont une collection dobjets que nous pouvons modier an dobtenir la sortie souhaite :
PS HKLM:\software\microsoft\windows> get-itemproperty currentversion | select ProductId ProductId --------76487-OEM-XXXXXXX-XXXXX
PS HKLM:\software\microsoft\windows>
Laccs aux donnes dun fournisseur FileSystem est tout aussi simple. La mme logique de commandes change lemplacement et afche la structure :
PS HKLM:\software\microsoft\windows> set-location c: PS C:\> set-location "C:\WINDOWS\system32\windowspowershell\v1.0\fr" PS C:\WINDOWS\system32\windowspowershell\v1.0\fr> get-childitem about_a*
Mode ----------------
Chapitre 3
91
-------------
PS C:\WINDOWS\system32\windowspowershell\v1.0\fr>
Dans ce cas, les donnes sont stockes dans un lment au lieu den tre des proprits. Pour obtenir les donnes dun lment, nous devons invoquer lapplet Get-Content :
PS C:\WINDOWS\system32\windowspowershell\v1.0\fr> get-content about_Alias.help.txt RUBRIQUE Alias DESCRIPTION COURTE Utilisation dautres noms pour les applets de commande et les commandes dans Windows PowerShell DESCRIPTION LONGUE Un alias est un autre nom ou surnom utilis pour une applet de commande ou un lment de commande, tel quune fonction, un script, un chier ou un chier excutable. Vous pouvez utiliser lalias au lieu du nom de la commande. Par exemple, si vous tablissez lalias " gas " pour Get-AuthenticodeSignature, vous pouvez taper : gas c:\scripts\sqlscript.ps1 ... PS C:\WINDOWS\system32\windowspowershell\v1.0\fr>
INFO Tous les lecteurs ne sappuient pas sur un magasin de donnes hirarchique. Par exemple, les fournisseurs Environment, Function et Variable ne sont pas hirarchiques. Laccs aux donnes par le biais de ces fournisseurs se fait dans lemplacement racine du lecteur associ.
Monter un lecteur
Il est possible de crer et de supprimer des lecteurs PowerShell, ce qui est trs pratique lorsquun emplacement ou un ensemble demplacements est souvent utilis. Au lieu de changer lemplacement ou demployer un chemin absolu, nous pouvons crer de nouveaux lecteurs (ou "monter un lecteur" dans le jargon PowerShell) qui sont des raccourcis vers ces emplacements.
92
Partie 1
Introduction PowerShell
PS C:\> get-psdrive Name ---Alias C cert D E Env F Function G HKCU HKLM PSScripts U Variable PS C:\> Provider -------Alias FileSystem Certicate FileSystem FileSystem Environment FileSystem Function FileSystem Registry Registry FileSystem FileSystem Variable Root ---C:\ \ D:\ E:\ F:\ G:\ HKEY_CURRENT_USER HKEY_LOCAL_MACHINE D:\Dev\Scripts U:\ CurrentLocation ---------------
software ...crosoft\windows
Chapitre 3
93
software ...crosoft\windows
Au niveau de ligne : 1 Caractre : 4 + dir <<<< z: InvocationName : dir PipelineLength : 1 PipelinePosition : 1 PS C:\>
94
Partie 1
Introduction PowerShell
Grce ces informations, nous pouvons dterminer certains dtails concernant $Error[0], notamment la commande qui a provoqu lerreur. Ces informations sont essentielles pour comprendre les erreurs et les grer efcacement. La commande suivante afche la liste complte des proprits dErrorRecord :
PS C:\> $Error[0] | get-member -MemberType Property
TypeName: System.Management.Automation.ErrorRecord Name ---CategoryInfo ErrorDetails Exception FullyQualiedErrorId InvocationInfo TargetObject MemberType ---------Property Property Property Property Property Property Denition ---------System.Management.Automation.ErrorCategoryI... System.Management.Automation.ErrorDetails E... System.Exception Exception {get;} System.String FullyQualiedErrorId {get;} System.Management.Automation.InvocationInfo... System.Object TargetObject {get;}
PS C:\>
Le Tableau 3.1 rcapitule les dnitions des proprits dErrorRecord afches par lexemple prcdent.
Tableau 3.1 Dnitions des proprits dErrorRecord
Proprit
CategoryInfo ErrorDetails
Dnition
Indique la catgorie de lerreur Lorsquelle nest pas nulle, elle fournit des informations supplmentaires concernant lerreur Lerreur qui sest produite Identie plus prcisment une condition derreur Lorsquelle nest pas nulle, elle dcrit le contexte dans lequel lerreur sest produite Lorsquelle nest pas nulle, elle indique lobjet cible de lopration
TargetObject
Chapitre 3
95
Le paramtre ErrorAction dnit le comportement dune applet de commande lorsquelle rencontre une erreur non fatale. Dans lexemple prcdent, ce paramtre est x SilentlyContinue. Autrement dit, lapplet de commande poursuit son excution sans afcher les erreurs non fatales qui peuvent se produire. Voici les autres options dErrorAction :
n Continue. Afcher
n Inquire. Demander lutilisateur sil souhaite poursuivre, arrter ou suspendre lexcution. n Stop.
INFO Lexpression non fatale est mise en exergue dans cette section car une erreur fatale ne tient pas compte du paramtre ErrorAction et est passe au gestionnaire derreurs par dfaut ou personnalis.
Le paramtre ErrorVariable dnit le nom de la variable pour lobjet derreur gnr par une erreur non fatale. Dans lexemple prcdent, ErrorVariable est x Err. Vous remarquerez que le nom de la variable ninclut pas le prxe $. Cependant, pour accder
96
Partie 1
Introduction PowerShell
en dehors dune applet de commande, le prxe $ est indispensable ($Err). Par ailleurs, aprs que ErrorVariable a t dnie, la variable rsultante est valide dans la session PowerShell en cours ou le bloc de script associ. Autrement dit, dautres applets de commande peuvent ajouter des objets derreur une variable derreur existante en utilisant le prxe + :
ErrorVariable PS C:\> PS C:\> PS C:\> Lecteur PS C:\> Lecteur PS C:\> get-childitem z: -ErrorVariable Err -ErrorAction SilentlyContinue get-childitem y: -ErrorVariable +Err -ErrorAction SilentlyContinue write-host $Err[0] -Foregroundcolor Red introuvable. Il nexiste aucun lecteur nomm z . write-host $Err[1] -Foregroundcolor Red introuvable. Il nexiste aucun lecteur nomm y .
La premire partie, ExceptionType, prcise le type derreur accept par linterception. Sil nest pas prcis, toutes les erreurs sont interceptes. La partie code, facultative, peut tre une commande ou un ensemble de commandes qui sont excutes une fois lerreur envoye au gestionnaire. La dernire partie, mot-cl, prcise si linterception autorise la poursuite de lexcution du bloc de code o lerreur sest produite ou bien si elle doit tre stoppe. Voici les mots cls reconnus :
n Break.
n Continue.
Lexcution de la porte courante peut se poursuivre partir de la ligne qui se trouve aprs celle o sest produite lexception.
[argument].
n Return
Lexcution de la porte courante est arrte et largument est retourn, sil est prcis.
Chapitre 3
97
Si aucun mot cl nest donn, le gestionnaire utilise Return lobjet ErrorRecord initialement pass au gestionnaire.
Exemples dinterception
[argument]
argument
tant
Les deux exemples suivants montrent comment dnir des gestionnaires derreurs. Le premier illustre une interception derreur non fatale produite lorsquun nom de DNS invalide est pass la classe System.Net.Dns. Le second exemple prsente nouveau linterception dune erreur non fatale gnre par lapplet de commande Get-Item. Cependant, dans ce cas, puisque le paramtre ErrorAction a t x Stop, lerreur est en ralit une erreur fatale qui est traite par le gestionnaire. Exemple 1 : traperreur1.ps1
$NomDNS = "www.-nomdnsinvalide-.com" trap [System.Management.Automation.MethodInvocationException]{ write-host ("ERREUR : + $_) -Foregroundcolor Red; Continue} write-host Obtenir ladresse IP de $NomDNS write-host ([System.Net.Dns]::GetHostAddresses("www.$nomdnsinvalide$.com")) write-host Termin"
Dans cet exemple, le paramtre $_ reprsente lobjet ErrorRecord qui a t pass au gestionnaire. Voici la sortie produite par cet exemple :
PS C:\> .\traperreur1.ps1 Obtenir ladresse IP de www.-nomdnsinvalide-.com ERREUR : Exception lors de lappel de GetHostAddresses avec 1 argument(s) : Hte inconnu Termin PS C:\>
INFO Une applet de commande ne gnre pas derreur fatale sauf en cas derreur de syntaxe. Autrement dit, un gestionnaire nintercepte aucune erreur non fatale produite par une applet de commande, sauf si lerreur est transforme en une erreur fatale aprs que le paramtre ErrorAction de lapplet a t x Stop.
98
Partie 1
Introduction PowerShell
Exemple 2 : traperreur2.ps1
write-host "Changer le lecteur pour z:" trap {write-host("[ERREUR] " + $_) -Foregroundcolor Red; Continue} get-item z: -ErrorAction Stop $FichiersTXT = get-childitem *.txt -ErrorAction Stop write-host Termin"
Portes dinterception
Comme nous lavons expliqu au Chapitre 2, "Les fondamentaux de PowerShell", dans PowerShell, une porte dtermine lexcution des interceptions. En gnral, un gestionnaire derreurs est dni et excut au sein de la mme porte. Par exemple, nous pouvons dnir un gestionnaire dans une certaine porte et, lorsquune erreur fatale se produit dans cette porte, il est excut. Si la porte en cours ne contient aucun gestionnaire derreurs mais sil en existe un dans une porte extrieure, les erreurs fatales rencontres sortent de la porte en cours et sont passes au gestionnaire dans la porte externe.
Chapitre 3
99
Voici le script :
param([string]$MonParam = $(throw write-host "Le paramtre MonParam na pas t dni" -Foregroundcolor Red)) write-host $MonParam
Et sa sortie :
PS C:\> .\MonParam.ps1 Le paramtre MonParam na pas t dni ScriptHalted Au niveau de C:\MonParam.ps1 : 1 Caractre : 34 + param([string]$MonParam = $(throw <<<< write-host "Le paramtre MonParam na pas t dni" -Foregroundcolor Red)) PS C:\>
Prols
Un prol est un ensemble enregistr de paramtres qui personnalisent lenvironnement PowerShell. Il existe quatre types de prols, chargs dans un ordre prcis chaque dmarrage de PowerShell. La section suivante explique ces types de prols, o ils doivent tre placs et lordre de leur chargement.
100
Partie 1
Introduction PowerShell
de PowerShell an dexcuter des commandes et des scripts PowerShell. Il sagit alors dune application hte, qui utilise un prol particulier pour contrler la conguration de PowerShell. Le nom du prol dhte spcique inclut lidentiant du shell. Dans la console PowerShell, cet identiant est le suivant :
PS C:\> $ShellId Microsoft.PowerShell PS C:\>
En runissant ces noms, le prol Tous les utilisateurs pour un hte spcique de la console PowerShell sappelle donc Microsoft.PowerShell_prole.ps1. Pour les autres htes, lidentiant du shell et les noms des prols sont diffrents. Par exemple, loutil PowerShell Analyzer (www.powershellanalyzer.com) est un hte qui offre une interface graphique labore pour PowerShell. Son identiant de shell est PowerShellAnalyzer. PSA et son prol Tous les utilisateurs pour un hte spcique est PowerShellAnalyzer.PSA _prole.ps1.
Chapitre 3
101
Comprendre la scurit
Lorsque WSH est arriv avec Windows 98, il a t accueilli comme une aubaine par les administrateurs Windows qui souhaitaient disposer des mmes possibilits dautomation que leurs homologues UNIX. Dans le mme temps, les crateurs de virus ont rapidement dcouvert que WSH constituait galement un vecteur dattaque des systmes Windows. Il est possible dautomatiser et de contrler pratiquement lintgralit dun systme Windows laide de WSH, ce qui constitue un grand avantage pour les administrateurs. En revanche, WSH napporte aucune scurit dans lexcution des scripts. Lorsquon lui dsigne un script, WSH lexcute. Lorigine du script et son rle nont aucune importance. Cest pourquoi WSH sest rapidement fait connatre comme un trou de scurit et non comme un outil dautomation.
Stratgies dexcution
cause des critiques concernant la scurit de WSH, lquipe de dveloppement de PowerShell a dcid dinclure une stratgie dexcution qui rduit les menaces potentielles dun code malveillant. Une stratgie dexcution contraint lexcution des scripts et le chargement des chiers de conguration dans PowerShell. Il en existe quatre, dtailles au cours des sections suivantes : Restricted, AllSigned, RemoteSigned et Unrestricted.
Stratgie Restricted
Par dfaut, PowerShell utilise la stratgie dexcution Restricted. Elle est la plus scurise car PowerShell ne peut alors fonctionner quen mode interactif. Autrement dit, aucun script ne peut tre lanc et seuls les chiers de conguration signs numriquement par un diteur de conance peuvent tre excuts ou chargs.
Stratgie AllSigned
La stratgie dexcution AllSigned est moins contraignante que Restricted. Lorsquelle est active, seuls les scripts et les chiers de conguration signs numriquement par un diteur de conance peuvent tre excuts ou chargs. Voici un exemple de sortie obtenue lorsque la stratgie AllSigned est active :
PS C:\Scripts> .\MonScript.ps1 Impossible de charger le chier C:\Scripts\MonScript.ps1. Le chier C:\Scripts\ MonScript.ps1 nest pas sign numriquement. Le script ne sera pas excut sur le systme. Pour plus dinformations, consultez get-help about_signing .. Au niveau de ligne : 1 Caractre : 24 + .\MonScript.ps1 <<<< PS C:\Scripts>
102
Partie 1
Introduction PowerShell
La signature dun script ou dun chier de conguration exige un certicat de signature de code. Ce certicat peut provenir dune autorit de certication (CA, Certicate Authority) ou nous pouvons en gnrer un avec loutil de cration dun certicat (Makecert.exe). Cependant, il est gnralement prfrable dobtenir un certicat de signature de code auprs dune autorit de certication reconnue, comme Verisign, Thawte ou linfrastructure cls publiques (PKI, Public Key Infrastructure) de votre entreprise. Dans le cas contraire, le partage de vos scripts ou de vos chiers de conguration risque dtre plus difcile car votre ordinateur nest pas, par dfaut, une autorit de certication approuve.
INFO Le Chapitre 4, "Signer du code", explique comment obtenir un certicat de signature du code valide et digne de conance. Nous conseillons fortement de le lire car la signature numrique des scripts et des chiers de conguration est un sujet extrmement important.
Stratgie RemoteSigned
La stratgie dexcution RemoteSigned est conue de manire empcher lexcution ou le chargement automatique des scripts et des chiers de conguration PowerShell distants qui nont pas t signs numriquement par un diteur de conance. Les scripts et les chiers de conguration qui ont t crs localement peuvent tre chargs et excuts, mme sils nont pas t signs. Un script ou un chier de conguration distant peuvent tre obtenus partir dune application de communication, comme Microsoft Outlook, Internet Explorer, Outlook Express ou Windows Messenger. Lexcution ou le chargement dun chier fourni par lune de ces applications produisent le message derreur suivant :
PS C:\Scripts> .\SonScript.ps1 Impossible de charger le chier C:\Scripts\SonScript.ps1. Le chier C:\Scripts\SonScript.ps1 nest pas sign numriquement. Le script ne sera pas excut sur le systme. Pour plus dinformations, consultez get-help about_signing .. Au niveau de ligne : 1 Caractre : 24 + .\SonScript.ps1 <<<< PS C:\Scripts>
Chapitre 3
103
Pour excuter ou charger un script ou un chier de conguration distant non sign, il faut indiquer que le chier est digne de conance. Pour cela, cliquez du bouton droit sur le chier dans lexplorateur Windows et choisissez Proprits. Dans longlet Gnral, cliquez sur le bouton Dbloquer (voir Figure 3.1). Aprs que le chier a t approuv, le script ou le chier de conguration peut tre excut ou charg. Sil est sign numriquement, mais si lditeur nest pas de conance, PowerShell afche linvite suivante :
PS C:\Scripts> .\ScriptSigne.ps1 Voulez-vous excuter le logiciel de cet diteur non approuv ? Le chier C:\Scripts\ScriptSigne.ps1 est publi par CN=companyabc.com, OU=IT, O=companyabc.com, L=Oakland, S=California, C=US et nest pas approuv sur votre systme. Nexcutez que des scripts provenant dditeurs approuvs. [M] Ne jamais excuter [N] Ne pas excuter [O] Excuter une fois [T] Toujours excuter[?] Aide (la valeur par dfaut est N ) :
Dans ce cas, nous devons dcider si nous pouvons faire conance ou non au contenu du chier.
Figure 3.1
Faire conance un script ou un chier de conguration distant.
104
Partie 1
Introduction PowerShell
Stratgie Unrestricted
Comme son nom le suggre, la stratgie dexcution Unrestricted retire pratiquement toutes les restrictions dexcution des scripts ou de chargement des chiers de conguration. Tous les chiers locaux ou signs peuvent tre excuts ou chargs, mais, pour les chiers distants, PowerShell vous demande de choisir ce quil doit faire :
PS C:\Scripts> .\ScriptDistant.ps1 Avertissement de scurit Nexcutez que des scripts que vous approuvez. Bien que les scripts en provenance dInternet puissent tre utiles, ce script est susceptible dendommager votre ordinateur. Voulez-vous excuter C:\Scripts\ScriptDistant.ps1 ? [N] Ne pas excuter [O] Excuter une fois [S] Suspendre [?] Aide (la valeur par dfaut est N ) :
Lors de linstallation de PowerShell, la stratgie dexcution est xe par dfaut Restricted. Comme vous le savez, les congurations par dfaut ne sont pas conserves trs longtemps. Par ailleurs, si PowerShell est install sur de nombreuses machines, la probabilit que la stratgie dexcution passe Unrestricted augmente rapidement.
Chapitre 3
105
Par chance, il est possible de contrler la stratgie dexcution de PowerShell par le biais du Registre. Ce paramtre est une valeur de type REG_SZ baptise ExecutionPolicy, qui se trouve dans la cl HKLM\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell. Ce contrle de la stratgie dexcution par le biais du Registre signie quil est possible dimposer une stratgie sur les machines gres par une stratgie de groupe (GPO, Group Policy Object). Par le pass, la cration dun GPO pour contrler la stratgie dexcution tait simple car linstallation de PowerShell incluait un modle dadministration (ADM, Administrative Template). Cependant, depuis la version PowerShell RC2, le modle dadministration ne fait plus partie de linstallation et nest pas forcment disponible dans un tlchargement spar. Si Microsoft ne fournit aucun ADM pour contrler la stratgie dexcution, vous pouvez toujours crer le vtre, comme le montre lexemple suivant :
CLASS MACHINE CATEGORY !!PowerShell POLICY !!Security KEYNAME SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell EXPLAIN !!PowerShell_ExecutionPolicy PART !!ExecutionPolicy EDITTEXT REQUIRED VALUENAME ExecutionPolicy END PART END POLICY END CATEGORY [strings] PowerShell=PowerShell Security=Paramtres de scurit PowerShell_ExecutionPolicy=Si elle est active, cette stratgie dnira la stratgie dexcution de PowerShell sur une machine la valeur indique. Les valeurs de stratgie dexcution sont Restricted, AllSigned, RemoteSigned ou Unrestricted. Executionpolicy=Stratgie dexcution
Une version oprationnelle de cet ADM est disponible sur la page consacre Windows PowerShell, ladresse www.pearsoneducation.fr. Mme si le chier PowerShellExecutionPolicy.adm a t test et doit fonctionner dans votre environnement, sachez que les paramtres de stratgie dexcution quil contient sont considrs comme des prfrences. Les paramtres de prfrence sont des GPO qui sont des valeurs du Registre places en dehors
106
Partie 1
Introduction PowerShell
des arborescences de stratgies de groupe approuves. Lorsquun GPO qui contient des paramtres de prfrence quitte son tendue, les paramtres de prfrence ne sont pas retirs sur Registre.
INFO Comme pour tous les chiers disponibles sur la page Web ddie Windows PowerShell, essayez le modle dadministration dans un environnement de test avant de dployer un GPO qui lutilise.
Pour congurer le chier PowerShellExecutionPolicy.adm, procdez comme suit : 1. Connectez-vous sur une machine de gestion de la stratgie de groupe en tant quadministrateur GPO. 2. laide de la console MMC de stratgie de groupe (GPMC), crez un GPO nomm PowerShell. 3. Dans larborescence de la console, ouvrez Conguration ordinateur et ensuite Modles dadministration. 4. Cliquez du bouton droit sur Modles dadministration et choisissez Ajout/Suppression de modles dans le menu contextuel. 5. Allez dans le dossier qui contient le chier PowerShellExecutionPolicy.adm. Slectionnez ce chier, cliquez sur Ouvrir, puis sur Fermer. Le nud PowerShell safche alors sous le nud Modles dadministration. 6. Cliquez sur le nud Modles dadministration, puis sur Afchage > Filtrage dans le menu de la MMC stratgie de groupe. Dcochez la case Afcher uniquement les paramtres de stratgie pouvant tre entirement grs. Vous pourrez ainsi administrer les paramtres de prfrences. 7. Cliquez ensuite sur le nud PowerShell sous Modles dadministration. 8. Dans le volet de dtails, cliquez du bouton droit sur Paramtres de scurit et slectionnez Proprits dans le menu contextuel. 9. Cliquez sur Activ. 10. Fixez la stratgie dexcution lune des valeurs suivantes : Restricted, AllSigned, RemoteSigned ou Unrestricted. 11. Fermez le GPO, ainsi que la MMS stratgie de groupe.
Chapitre 3
107
Contrler la stratgie dexcution par le biais dun paramtre de prfrence de GPO ne semble sans doute pas une solution parfaite. En effet, un paramtre de prfrence noffre pas le mme niveau de scurit quun paramtre de stratgie dexcution et les utilisateurs disposant des droits adquats peuvent le modier facilement. Ce manque de scurit est probablement la raison du retrait du chier ADM originel de PowerShell. Une version future de PowerShell pourrait autoriser le contrle de la stratgie dexcution par le biais dun paramtre de stratgie de GPO valide.
Langage
Sur ce point, ce livre diffre des autres ouvrages sur les langages de scripts, qui tentent dexpliquer les concepts de lcriture des scripts au lieu de montrer des scripts oprationnels. Nous voulons mettre laccent sur les applications pratiques de PowerShell. Nous supposons que lcriture de scripts ne vous est pas totalement trangre. Par ailleurs, puisque le langage de PowerShell est analogue Perl, C# et mme VBScript, il ny a aucune raison de perdre du temps prsenter les boucles for, les instructions if...then et les autres aspects fondamentaux de la programmation.
108
Partie 1
Introduction PowerShell
Il est vrai que certains points sont spciques au langage de PowerShell, mais vous pouvez alors consulter sa documentation. Ce livre nest pas un ouvrage de rfrence du langage, mais sattache illustrer lapplication de PowerShell des cas rels. Pour une information dtaille sur le langage de PowerShell, vous pouvez consulter le Guide de lutilisateur disponible via le menu Dmarrer.
En rsum
Vous venez de faire connaissance de manire plus approfondie avec PowerShell et son fonctionnement. Vous avez abord des sujets comme les fournisseurs, le traitement des erreurs, les prols et les stratgies dexcution. Cependant, de tous les points tudis, le concept le plus important retenir est que PowerShell sappuie sur .NET Framework. Par consquent, il ne ressemble pas aux autres shells car il est orient objet et il tente de prsenter tous les objets sous une forme commune qui peut tre utilise sans autre modication dans les commandes et les scripts. partir de l et avec les connaissances acquises aux Chapitres 2 et 3, vous allez explorer lcriture de scripts PowerShell. Les scripts des chapitres suivants vont devenir de plus en plus complexes, au fur et mesure de la prsentation des diffrents aspects de lautomation de Windows avec PowerShell.
4
Signer du code
Dans ce chapitre
m m m m m m
Introduction Qu'est-ce que la signature du code ? Obtenir un certicat de signature du code Signer des scripts Vrier des signatures numriques Distribuer du code sign
Introduction
Pour apprendre signer les scripts et les chiers de conguration de PowerShell, vous avez pass du temps faire des recherches sur Internet, lu plusieurs blogs qui traitent de ce sujet, consult la documentation PowerShell et mme parcouru plusieurs livres sur PowerShell. Plus vous vous renseignez sur la signature du code, moins cela vous semble clair. Pour nir, vous ouvrez votre console PowerShell et saisissez la commande suivante :
set-executionpolicy unrestricted
Avant dentrer cette commande, noubliez pas ce que vous avez appris propos des stratgies dexcution au Chapitre 3, "Prsentation avance de PowerShell". Le paramtre Unrestricted annihile une couche de scurit importante conue pour empcher lexcution du code malveillant sur votre systme. La signature du code est une autre composante essentielle de la scurit de PowerShell, mais nombreux sont ceux la croire trop complexe et utiliser une stratgie dexcution Unrestricted pour ne pas avoir lemployer. En rponse un billet
110
Partie 1
Introduction PowerShell
concernant la signature de code sur le blog de Scott Hanselman (www.hanselman.com/blog), un internaute a fait le commentaire suivant : "La gestion des certicats de signature du code dpasse les capacits de nombreux utilisateurs, y compris des dveloppeurs et des administrateurs normaux." Cette rponse montre bien un rel besoin dexplications. Ce chapitre se consacre donc la signature du code. En surface, cela semble complexe, mais, avec des explications claires, la procdure est facile comprendre. Les crateurs de scripts, les dveloppeurs et les administrateurs doivent se familiariser avec elle, car il sagit dun lment essentiel de la mise en place dune scurit.
Chapitre 4
Signer du code
111
4. Le destinataire cre un autre code de hachage sens unique du contenu et dchiffre le code de hachage laide de la cl publique de lmetteur. 5. Le destinataire compare les deux codes de hachage. Sils sont identiques, la signature numrique est valide et le contenu na pas t modi.
INFO Une fonction de hachage sens unique (galement appele condensat de message, empreinte ou somme de contrle) est un algorithme cryptographique qui convertit des donnes en une suite binaire de longueur xe. Le terme " sens unique" vient du fait quil est difcile de retrouver les donnes originelles partir de la suite obtenue.
Pour associer une entit, comme un organisme, une personne ou un ordinateur, une signature numrique, un certicat numrique est utilis. Il est constitu de la cl publique et des informations didentication du propritaire de la paire de cls. Pour en garantir lintgrit, il est galement sign numriquement. Un certicat numrique peut tre sign par son propritaire ou par un tiers de conance appel autorit de certication (CA, Certicate Authority). Lassociation dun code lentit qui la cr et publi supprime lanonymat de lexcution du code. Par ailleurs, lassociation dune signature numrique un certicat de signature du code peut tre compare lutilisation dune marque pour tablir une relation de conance et de abilit. Pourvus de ces informations, les utilisateurs de scripts et de chiers de conguration PowerShell peuvent faire des choix en toute connaissance de cause sur lexcution dun script ou le chargement de chiers de conguration. En rsum, cest pour cela que la signature du code est importante pour la scurit dans PowerShell.
112
Partie 1
Introduction PowerShell
conguration PowerShell sur dautres machines, votre certicat doit tre ajout en tant quautorit principale de conance et en tant quditeur approuv. Bien quil soit possible de modier les lments approuvs, il existe deux problmes. Premirement, les entits situes hors de votre zone dinuence peuvent dcider de ne pas faire conance votre certicat car rien ne leur permet de vrier votre identit. Deuximement, si la cl prive associe au certicat auto-sign vient tre compromise ou invalide, il est impossible de grer la validit du certicat chez les autres entits. cause de ces inconvnients, les certicats auto-signs ne doivent tre employs que sur une machine locale ou dans une phase de test. Si vous envisagez de signer numriquement vos scripts et vos chiers de conguration an de les utiliser dans une entreprise ou de les rendre publics, vous devez choisir la seconde mthode dobtention dun certicat de signature du code : une CA depuis une PKI valide. Une PKI valide peut tre une entreprise commerciale bien connue et digne de conance, comme www.globalsign.net, www.thawte.com ou www.verisign.com, ou une infrastructure interne qui appartient et qui est gre par votre socit. Si vous respectez quelques mises en garde, lobtention dun certicat de signature du code depuis une PKI externe peut tre rapide et simple. Tout dabord, un certicat doit tre achet auprs du propritaire de la PKI externe. Ensuite, puisque lachat du certicat se fait auprs de lidentit externe, cela signie que vous placez une grande conance dans lintgrit de cet organisme. Cest pourquoi les certicats de signature du code acquis auprs de PKI commerciales doivent se limiter aux certicats utiliss pour signer des scripts et les chiers de conguration destins une distribution publique. De ce fait, une PKI interne doit tre utilise pour les scripts et les chiers de conguration rservs un usage priv. Noubliez pas que son dploiement et sa gestion demandent une organisation, des efforts et de largent (les modules matriels de scurit, les consultants en scurit, etc., peuvent tre trs coteux). La plupart des entreprises ont tendance viter den mettre en place. Elles prfrent installer des CA ad hoc, acheter des certicats auprs de PKI commerciales ou ignorer les besoins. Une PKI commerciale napportera peut-tre pas le niveau de conance ncessaire votre entreprise et lapproche ad hoc est dconseille car elle diminue le crdit des certicats gnrs par des CA illgitimes, cest--dire dont lintgrit nest pas totalement garantie. Ne pas avoir de PKI valide risque de compliquer la distribution interne des chiers signs numriquement. Enn, les entreprises qui ignorent les besoins en PKI illustrent un autre inconvnient de la mise en place dune PKI interne : le temps.
Chapitre 4
Signer du code
113
Si votre entreprise ne possde pas sa PKI, lobtention dun certicat de signature du code peut demander beaucoup de temps. Cela ne se fait pas en une nuit. Si vous avez identi un besoin de PKI pour vos scripts, vous en dcouvrirez probablement dautres au sein de votre socit. Il faut dabord les identier et les tudier. La mise en place dune PKI autour de vos besoins propres nest pas la meilleure technique pour un service qui doit satisfaire les besoins de toute une entreprise. Aprs avoir prsent vos besoins de PKI, vous devrez sans doute attendre que les services soient oprationnels. Cependant, une fois la PKI en place, vous pouvez obtenir des certicats de signature du code en sachant que linfrastructure prend totalement en charge la distribution de vos scripts et de vos chiers de conguration PowerShell signs.
114
Partie 1
Introduction PowerShell
Directory: Microsoft.PowerShell.Security\Certicate::CurrentUser\My
Thumbprint ---------944E910757A862B53DE3113249E12BCA9C7DD0DE
PS C:\>
Chapitre 4
Signer du code
115
Figure 4.1
Exemple de demande de certicat de signature du code.
Figure 4.2
Bote de message Violation de script potentielle.
10. Ensuite, si ncessaire, xez le niveau de scurit de la cl prive en fonction de la stratgie mise en place dans votre entreprise (voir Figure 4.3), puis cliquez sur OK. 11. Si la stratgie de votre entreprise exige lapprobation dun administrateur de certicats, demandez-lui dapprouver la demande que vous venez de soumettre. Sinon, passez directement ltape 16. 12. Aprs lapprobation de la demande de certicat, utilisez Internet Explorer pour accder au site des services dinscription Web de lautorit de certication ladresse https:// NomServeurCA/certsrv (en remplaant NomServeurCA par le nom de votre serveur). 13. Cliquez sur le lien Afcher le statut dune requte de certicat en attente.
116
Partie 1
Introduction PowerShell
Figure 4.3
Bote de dialogue Cration dune nouvelle cl dchange RSA.
14. Sur la page suivante, cliquez sur le lien de demande adquat. 15. Sur la page Certicat mis, cliquez sur le lien Installer ce certicat. 16. Dans la bote de message Violation de script potentielle qui safche (voir Figure 4.4), cliquez sur Oui pour continuer.
Figure 4.4
Bote de message Violation de script potentielle.
17. Enn, le site des services dinscription Web de lautorit de certication signale que le certicat a t install avec succs. Saisissez la commande PowerShell suivante pour vrier son installation :
PS C:\> get-childitem cert:\CurrentUser\My -codesign
Directory: Microsoft.PowerShell.Security\Certicate::CurrentUser\My
Thumbprint ---------5CBCE258711676061836BC45C1B4ACA6F6C7D09E
PS C:\>
Chapitre 4
Signer du code
117
Pour importer la combinaison SPC+PVK, vous devez utiliser loutil de Microsoft appel PVK Digital Certicate Files Importer. Il est disponible sur le site de tlchargement de Microsoft ladresse www.microsoft.com/downloads/details.aspx?FamilyID=F9992C94B129-46BC-B240-414BDFF679A7&displaylang=EN. Ensuite, saisissez la commande suivante pour importer les chiers SPC et PVK, en indiquant vos propres chiers :
pvkimprt -IMPORT "moncerticat.spc" "macleprivee.pvk"
118
Partie 1
Introduction PowerShell
Set-AuthenticodeSignature,
PS C:\Scripts> set-authenticodesignature lePath ScriptSigne.ps1 certicate @(get-childitem cert:\CurrentUser\My -codeSigningCert)[0] includeChain "All"
Rpertoire : C:\Scripts
SignerCerticate ----------------661BC0A2A11850CEF4862F97D7335B40FCCCCF06
Status -----Valid
Path ---ScriptSigne.ps1
PS C:\>
Pour obtenir le certicat depuis votre propre magasin, vous devez utiliser lapplet de commande Get-ChildItem avec le paramtre codeSigningCert. Ce paramtre ne peut tre employ quavec le fournisseur Certicate et joue le rle de ltre an dobliger Get-ChildItem ne rcuprer que les certicats de signature du code. Enn, pour tre certain que lintgralit de la chane du certicat est incluse dans la signature numrique, le paramtre includeChain est dni. Aprs lexcution de lapplet de commande Set-AuthenticodeSignature, le chier sign possde un bloc de signature valide qui contient la signature numrique. Un bloc de signature se trouve toujours la n du script ou du chier de conguration PowerShell. Il est facile identier car il est plac entre les balises SIG # Begin signature block et SIG # End signature block :
write-host ("Ce script est sign !") -Foregroundcolor Green # SIG # Begin signature block # MIIEGwYJKoZIhvcNAQcCoIIEDDCCBAgCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUSuRNU62C2nvVTbf/JyWBXqC6 # puigggIyMIICLjCCAZegAwIBAgIQnewYWKhDlYdNnO6cjYQWBDANBgkqhkiG9w0B ... # AQQBgjcCARUwIwYJKoZIhvcNAQkEMRYEFA+YleMX8BYxLif8zxiKQi5T1QR3MA0G # CSqGSIb3DQEBAQUABIGApcdFZz2vnLWFbFYIgsjFsCTgPgAgOCa7iAVsyXz+Z/ga # LwbgwtZpqIZhczQQ4UezAooaUPMkBMKhpJ2XITiFLgDDf8bAnPVxuxoLbmO9iH8Z # weDJypYlMKe5ion5+S3Ahm3h92UnTk+kXav7m20bdLSw8x+R4yS2z2pL+0iGaX4= # SIG # End signature block
Chapitre 4
Signer du code
119
INFO Ce processus de signature numrique des scripts sapplique galement aux chiers de conguration PowerShell. Comme nous lavons expliqu au Chapitre 3, les chiers de conguration, selon la stratgie dexcution en place, peuvent galement avoir besoin dtre signs pour tre chargs dans une session PowerShell.
Rpertoire : C:\Scripts
SignerCerticate ----------------661BC0A2A11850CEF4862F97D7335B40FCCCCF06
Status -----Valid
Path ---ScriptSigne.ps1
tat invalide :
PS C:\Scripts> Get-AuthenticodeSignature ScriptSigne.ps1
Rpertoire : C:\Scripts
SignerCerticate ----------------661BC0A2A11850CEF4862F97D7335B40FCCCCF06
Status -----HashMismatch
Path ---ScriptSigne.ps1
120
Partie 1
Introduction PowerShell
PS C:\Scripts> .\ScriptSigne.ps1 Impossible de charger le chier C:\Scripts\ScriptSigne.ps1. Le contenu du chier C:\Scripts\ScriptSigne.ps1 peut avoir t falsi, car le hachage du chier ne correspond pas celui qui gure dans la signature numrique. Le scriptne sera pas excut sur le systme. Pour plus dinformations, consultez get-help about_signing .. Au niveau de ligne : 1 Caractre : 26 + C:\Scripts\ScriptSigne.ps1 <<<< PS C:\>
Daprs lerreur afche par lexemple prcdent, le script a t modi, falsi ou corrompu. Sil a t modi par son propritaire, il doit tre nouveau sign avant de pouvoir tre utilis. Sil a t falsi, il doit tre supprim car sa validit et son authenticit ne sont plus garanties.
Chapitre 4
Signer du code
121
Figure 4.5
Le chemin de certication.
Figure 4.6
Magasin de certicats Autorits de certication racines de conance.
Si un diteur est approuv, son certicat de signature du code rside dans le magasin diteurs approuvs (voir Figure 4.7).
122
Partie 1
Introduction PowerShell
Figure 4.7
Magasin de certicats diteurs approuvs.
Si un diteur nest pas approuv, PowerShell demande lutilisateur de choisir si le code sign peut tre excut :
PS C:\Scripts> .\ScriptSigne.ps1 Voulez-vous excuter le logiciel de cet diteur non approuv ? Le chier C:\Scripts\ScriptSigne.ps1 est publi par CN=companyabc.com, OU=IT, O=companyabc.com, L=Oakland, S=California, C=US et nest pas approuv sur votre systme. Nexcutez que des scripts provenant dditeurs approuvs. [M] Ne jamais excuter [N] Ne pas excuter [O] Excuter une fois [T] Toujours excuter[?] Aide (la valeur par dfaut est N ) :
[M] Ne jamais excuter. Cette option place le certicat de lditeur dans le magasin Certicats non autoriss. Lorsque le certicat dun diteur a t dclar non digne de conance, PowerShell interdit tout jamais lexcution du code provenant de cet diteur, sauf si le certicat est retir du magasin Certicats non autoriss ou si la stratgie dexcution est xe Unrestricted ou RemoteSigned. [N] Ne pas excuter. Cette option, par dfaut, interrompt lexcution du code non approuv.
Chapitre 4
Signer du code
123
n n
[O] Excuter une fois. Cette option autorise une seule excution du code non approuv. [T] Toujours excuter. Cette option place le certicat de lditeur dans le magasin diteurs approuvs. Par ailleurs, le certicat de lautorit de certication racine est plac dans le magasin Autorits de certication racines de conance, sil ne sy trouve pas dj.
En rsum
Ce chapitre a prsent en dtail la signature du code. Avec ce que vous avez appris, vous devez prsent comprendre limportance de la signature du code dans la scurit de PowerShell et comment vous en servir. Si vous navez pas encore assimil cet impratif, nous rptons que la signature du code doit tre comprise et utilise dans le dveloppement de vos scripts. Vous devez galement mieux comprendre linfrastructure requise pour que la signature du code constitue une mthode viable pour accorder sa conance du code dans une entreprise. Mme si la PKI nest pas simple matriser, lun des premiers objectifs de ce chapitre tait de la prsenter du point de vue de lcriture des scripts cette option a t choisie an que vous ne soyez pas trop drout et quelle soit associe son utilisation dans PowerShell. Grce ces connaissances, vous devez prsent tre capable de dterminer, ou tout au moins dindiquer, un besoin de PKI et dorienter un projet de manire que les scripts que vous dveloppez puissent tre approuvs dans votre entreprise.
5
Suivre les bonnes pratiques
Dans ce chapitre
m m m m m
Introduction Dvelopper des scripts Concevoir des scripts Scuriser des scripts Utiliser les standards d'criture
Introduction
Il existe de nombreux guides pour apprendre les bonnes pratiques de dveloppement des scripts. Le plus souvent, ils traitent dun langage spcique, de concepts gnraux ou mme des prfrences dun dveloppeur. Quel que soit le type de guide consult, lobjectif reste toujours lamlioration de la manire dcrire des scripts. Ce chapitre propose quelques mthodes de programmation de scripts fondes sur une exprience de dveloppement de logiciels. Le dveloppement de scripts est analogue celui de logiciels car ces deux activits impliquent lcriture de code de manire sense. Par ailleurs, de nombreux aspects dun projet de dveloppement logiciel sappliquent galement aux projets de scripts. Les bonnes pratiques du dveloppement de logiciels constituent de bonnes bases lamlioration des scripts.
126
Partie 1
Introduction PowerShell
Chapitre 5
127
Par ailleurs, le pseudo-code permet de saffranchir du langage et peut tre crit de manire que dautres personnes, en particulier celles qui doivent commenter la conception de scripts, puissent le lire et le comprendre facilement. En voici un exemple :
Param domaine Param chier CSV de comptes de ressources Se lier au domaine Ouvrir et lire le chier CSV Pour chaque compte de ressource dans le chier CSV: - crer un nouveau compte dans lUO indique ; - xer le mot de passe (14 caractres gnrs alatoirement) ; - journaliser le mot de passe dans larchive des mots de passe ; - xer les attributs du compte dutilisateurs en fonction des informations donnes par le chier CSV ; - activer le courrier lectronique sur le compte ; - ajouter lutilisateur au groupe adquat en fonction des informations donnes par le chier CSV. Suivant
Analyse
Figure 5.1
Les tapes dun projet de script.
Conception
Architecture
Retour au dveloppement
Test
Dploiement
Maintenance
128
Partie 1
Introduction PowerShell
Chapitre 5
129
Windows fondent la gestion de leurs environnements. Grce cette volution, la souplesse et la puissance brute des scripts sont de plus en plus considres comme une solution aux besoins dautomation et leur dveloppement doit donc se faire avec professionnalisme. Pour crer des scripts professionnels, le travail accompli doit satisfaire un certain niveau de qualit. Cela implique de dvelopper des standards pour tous les scripts, dcrire une documentation claire et concise, de respecter les bonnes pratiques en termes de planication et dorganisation, deffectuer des tests consciencieux, etc. Une adhsion aux standards professionnels permet galement de sassurer que les autres intervenants du projet seront bien disposs quant lacceptation du travail.
130
Partie 1
Introduction PowerShell
Cette pratique permet galement de rduire les erreurs dues la modication de la conguration du script. Si les informations de conguration sont rparties dans tout le script, il risque dtre mal congur, de contenir des doublons ou des oublis.
Chapitre 5
131
des paramtres ou des chiers de conguration, comme le montre lexemple suivant, an que les utilisateurs puissent congurer plus aisment le script.
param([string] $CheminRechercheADSI=$(throw "Veuillez indiquer le chemin ADSI ! "))
132
Partie 1
Introduction PowerShell
Description : Ce script permet ajouter des adresses de proxy secondaires aux utilisateurs, conformment au chier CSV import. Avant dajouter ces adresses, il vrie les conditions suivantes : Lutilisateur existe-t-il ? Dispose-t-il de courrier lectronique ? Ladresse du proxy existe-t-elle dj ? Ce script cre un journal chacune de ses excutions. Format du chier CSV : [NomCompteSAM],[AdressesProxy] tyson,tyson@cco.com;tyson@taosage.net maiko,maiko@cco.com bob,bob@cco.com erica,erica@cco.com Pour placer plusieurs adresses de proxy dans la colonne AdressesProxy, utilisez le caractre ; comme sparateur.
Chapitre 5
133
Pour viter ce problme, tous les paramtres requis doivent tre valids, comme le montre lexemple suivant :
param([string] $CheminModele = $(throw write-host ` Veuillez prciser le chemin du modle source de la structure de dossiers" ` " copier. -Foregroundcolor Red), [string] $FichierImport = $(throw ` write-host Veuillez prciser le nom du chier CSV importer." ` -Foregroundcolor Red)) write-host "Vrication du chemin du modle" -NoNewLine if (!(test-path $CheminModele)){ throw write-host `t $CheminModele nest pas un dossier valide !" ` -Foregroundcolor Red } else { write-host `t "[OK]" -Foregroundcolor Green } write-host Vrication du chier dimportation" -NoNewLine if (!(test-path $FichierImport)){ throw write-host `t $FichierImport nest pas un chier valide !" ` -Foregroundcolor Red } else { write-host `t "[OK]" -Foregroundcolor Green }
134
Partie 1
Introduction PowerShell
La rutilisabilit est une bonne pratique importante. Dans PowerShell, le concept de rutilisabilit prend tout son sens car les chiers de scripts et de bibliothque sont faciles importer, en invoquant du code rutilisable depuis une console PowerShell ou en chargeant le chier de script ou de bibliothque laide de linstruction point. Lexemple suivant montre une suite de chiers de scripts appels depuis la console PowerShell au sein dun pipeline.
PS C:\> .\get-utilisateursinvalides.ps1 mondomaine.fr | .\sortie-html.ps1 | .\sortie-ie.ps1
Chapitre 5
135
Figure 5.2
Exemple dafchage dinformations dtat.
136
Partie 1
Introduction PowerShell
Dans cet exemple, lobjet de processus retourn par Get-Process correspond explorer. exe. Normalement, si un objet de processus est envoy lapplet de commande Stop-Process, le processus correspondant est arrt. Cependant, lorsque le paramtre WhatIf est pass lapplet Stop-Process, la commande retourne des informations sur les changements qui se seraient produits si elle avait t rellement excute. Par exemple, supposons que nous saisissions la commande suivante :
ATTENTION Nexcutez pas la commande suivante. Il sagit dun exemple quil ne faut pas suivre.
Sans le paramtre WhatIf, cette commande arrterait la console PowerShell, ainsi que le systme. Parce que WhatIf a t ajout, les informations afches permettent de comprendre que la commande va conduire au dysfonctionnement du systme :
PS C:\> WhatIf: WhatIf: WhatIf: WhatIf: WhatIf: WhatIf: WhatIf: WhatIf: WhatIf: WhatIf: WhatIf: WhatIf: get-process | stop-process -WhatIf Opration Stop-Process en cours sur Opration Stop-Process en cours sur Opration Stop-Process en cours sur Opration Stop-Process en cours sur Opration Stop-Process en cours sur Opration Stop-Process en cours sur Opration Stop-Process en cours sur Opration Stop-Process en cours sur Opration Stop-Process en cours sur Opration Stop-Process en cours sur Opration Stop-Process en cours sur Opration Stop-Process en cours sur
la la la la la la la la la la la la
cible cible cible cible cible cible cible cible cible cible cible cible
alg (1048) . ati2evxx (1400) . ati2evxx (1696) . atiptaxx (3644) . BTSTAC~1 (2812) . BTTray (3556) . btwdins (1652) . csrss (1116) . ctfmon (1992) . eabservr (3740) . explorer (2172) . googletalk (1888) .
Chapitre 5
137
Le paramtre Conrm vite les modications inattendues en obligeant PowerShell consulter lutilisateur avant deffectuer tout changement :
PS C:\> get-process expl* | stop-process -conrm Conrmer tes-vous sr de vouloir effectuer cette action ? Opration Stop-Process en cours sur la cible explorer (2172) . [O] Oui [T] Oui pour tout [N] Non [U] Non pour tout [S] Suspendre [?] Aide(la valeur par dfaut est O ) :
Les bonnes pratiques recommandent dutiliser les paramtres WhatIf et Conrm ds que possible an didentier les changements potentiellement dangereux et de donner aux utilisateurs la possibilit dinterrompre la commande.
INFO Les paramtres WhatIf et Conrm ne sont reconnus que par les applets de commande qui effectuent des modications.
138
Partie 1
Introduction PowerShell
INFO La signature du code ne concerne pas exclusivement les scripts et les chiers de conguration PowerShell. Les mmes principes sappliquent dautres lments, comme les chiers excutables, les macros, les DLL, dautres scripts, les pilotes de priphriques, les images de micrologiciel et ainsi de suite. Tout code peut bncier de la scurit des signatures numriques et vous pouvez ainsi limiter les possibilits dexcution dun code illgitime dans votre environnement.
Chapitre 5
139
2. N.d.T : Les commentaires et les messages afchs par les scripts tudis dans ce livre ont t traduits an den faciliter la comprhension. Cependant, le code source disponible dans larchive tlchargeable est rest en anglais. En effet, les scripts sont signs et il nest donc pas possible den modier le contenu sans quils soient considrs comme corrompus, ce qui est parfaitement cohrent avec lobjectif des signatures numriques.
140
Partie 1
Introduction PowerShell
Configuration du script
Corps
Procdures
Fonctions
Figure 5.3
Organisation dun script WSF.
Paramtres
Fonctions
Configuration du script
Corps
Figure 5.4
Organisation dun script PowerShell.
Quatrimement, un certicat de signature numrique du code a t achet auprs de Thawte et tous les scripts PowerShell ont t signs par lentit companyabc.com. Si vous avez respect les bonnes pratiques concernant la stratgie dexcution, vous devez dnir companyabc.com comme un diteur approuv avant dexcuter les scripts PowerShell.
Chapitre 5
141
ATTENTION Les scripts fournis avec ce livre sont oprationnels. Ils ont t tests et doivent se comporter comme nous lexpliquons. Cependant, cela ne signie pas quils peuvent tre utiliss dans un environnement de production. Si vous envisagez dexcuter lun de ces scripts dans un tel environnement, vous devez commencer par le tester.
Enn, les scripts PowerShell et VBScript ont tendance offrir le mme type dinteraction quant aux entres et aux sorties, bien quil existe certaines diffrences pour les concepts nouveaux. Cependant, les mthodes dentre et de sortie sont claires et concises, grce lutilisation de la console PowerShell, des chiers de journalisation et des classes Windows Forms.
En rsum
Au l de ce chapitre, nous avons vu un certain nombre de bonnes pratiques pour lcriture des scripts PowerShell. Elles concernent leur dveloppement, leur conception et leur scurisation. Lobjectif est galement damliorer vos qualits de programmeur de scripts. Lorigine de ces pratiques se trouve autant dans le dveloppement de logiciels que dans une exprience pratique du dveloppement de scripts. Leur mise en uvre nest en aucun cas ge. Le vritable objectif de ce chapitre tait de vous inviter rchir sur la mise en place dun bon processus dcriture des scripts. Vous choisirez peut-tre dtendre ces pratiques lorsque vous les inclurez dans votre prochain dveloppement de scripts PowerShell. Lquipe PowerShell a fait beaucoup defforts pour tenter de produire le shell parfait et vous pouvez la remercier en tentant dcrire des scripts bien penss, bien conus et srs.
II
Appliquer ses connaissances PowerShell
6
PowerShell et le systme de chiers
Dans ce chapitre
m m m m
Introduction Grer le systme de chiers depuis WSH et PowerShell Manipuler les autorisations De VBScript PowerShell
Introduction
Ce chapitre sintresse la gestion du systme de chiers de Windows depuis PowerShell. Pour cela, il prsente des exemples dtaills fonds sur WSH (Windows Script Host) et sur PowerShell. Ils sont donns sous ces deux formes an que le lecteur puisse passer PowerShell en bnciant de son exprience de lcriture de scripts pour Windows. Outre la comparaison des exemples, ce chapitre dcrit galement un script oprationnel pour la gestion des chiers dans un cas rel. Lobjectif est de donner au lecteur la possibilit dappliquer les techniques de scripts PowerShell des besoins dautomation rels.
146
Partie 2
Chapitre 6
147
Dans PowerShell, nous pouvons obtenir des informations sur un lecteur laide des applets de commande Get-PSDrive et Get-Item. Cependant, comme nous lavons expliqu au Chapitre 3, PowerShell traite les lecteurs diffremment de WSH. Par consquent, si nous voulons les mmes informations que celles fournies par lobjet FSO Drive, nous devons utiliser la classe .NET approprie, comme le montre lexemple suivant, ou WMI :
PS PS PS PS La PS C:\> $LecteurC = new-object System.IO.DriveInfo C C:\> $TailleLecteur = ($LecteurC.TotalSize / 1024) / 1000 /1000 C:\> $TailleLecteur = {0:N0} -f $TailleLecteur C:\> write-host La taille du lecteur C est gale $TailleLecteur Go." taille du lecteur C est gale 69 Go. C:\>
Dans PowerShell, les applets de commande principales ralisent les mmes tches :
PS C:\> get-item C:\outils | select LastAccessTime LastAccessTime -------------06/10/2007 14:03:20
PS C:\>
148
Partie 2
Dans PowerShell, les applets de commande principales permettent daccder aux informations dun chier et de manipuler des chiers :
PS C:\outils> $Fichier = get-item Plan_Domination_Monde_R1.doc PS C:\outils> $Fichier.extension .doc PS C:\outils>
Comme le montrent ces exemples, les mthodes de manipulation du systme de chiers Windows avec FSO et PowerShell sont similaires. Les applets de commande principales de PowerShell permettent de raliser pratiquement les mmes tches que les objets FSO.
Chapitre 6
149
rpertoires, les partages de chiers et les partages dimprimantes. Il peut galement tre utilis sur le Registre, les services systme et mme la mtabase IIS (Internet Information Services). Vous pouvez tlcharger SubInACL ladresse www.microsoft.com/downloads/ details.aspx?FamilyId=E8BA3E56-D8FE-4A91-93CF-ED6985E3927B&displaylang=en. La syntaxe de SubInACL prend la forme [/Option] /type_objet nom_objet [[/Action[=Paramtre]..]. Bien que cette syntaxe semble simple, SubInACL est un outil complexe qui permet
de rpondre diverses situations. Quel que soit loutil utilis, les changements dautorisation suivants sont les plus rpandus :
n n n n
devenir le propritaire ; effacer des autorisations ; ajouter des autorisations ; retirer des autorisations.
Cette liste nest en rien exhaustive, mais elle peut servir de base au dveloppement de fonctions trs souvent utilises. Lcriture de fonctions rutilisables est une bonne pratique fortement recommande. Elles peuvent servir dans de nombreux scripts et rduire les temps de dveloppement. Pour modier les autorisations du systme de chiers, lcriture de fonctions rutilisables prend tout son sens car travailler avec les interfaces reconnues par WSH ou les outils existants peut demander beaucoup de temps. Par consquent, les fonctions SubInACL dcrites la section suivante ont t cres de manire tre rutilises dans des scripts.
Fonctions SubInACL
Nous proposons quatre fonctions SubInACL : SetOwner, DumpPerm, AddPerm et RemovePerm. Chacune delles attend des arguments et construit une chane de commande destine SubInACL. En utilisant un objet WshShell, nous excutons SubInACL avec la chane de commande prpare. Ensuite, le contenu du chier log.temp gr par SubInACL est examin, la recherche derreurs, grce la fonction ParseTempFile. Selon les informations derreurs trouves, un code de succs ou dchec est nalement crit sur la console.
Function SetOwner(path, account) Fixer le propritaire dun dossier ou de sous-dossiers. On Error Resume Next strCommand = subinacl /verbose /output=log.temp _ & "/subdirectories """ & path & """ /setowner=""" & account & """"
150
Partie 2
ErrorCode = objWS.Run(strCommand, 0, TRUE) If ErrorCode <> 0 Then StdOut.Write(" " & account & ":" _ & [chec de SetOwner] sur " & path) Else return = inStr(1, ParseTempFile("log.temp"), "ne sera pas examin") If Not return = 0 Then StdOut.Write(" " & account & ":" _ & [chec de SetOwner] sur " & path) Else StdOut.Write(" " & account & ":" _ & [Succs de SetOwner] sur " & path) End If End If ErrorCode = vbNullString End Function Function DumpPerm(path) Effacer les autorisations dun dossier ou de sous-dossiers. On Error Resume Next strCommand = subinacl /verbose /output=log.temp _ & "/subdirectories """ & path & """ /perm" ErrorCode = objWS.Run(strCommand, 0, TRUE) If ErrorCode <> 0 Then StdOut.Write( Autorisations non effaces sur " & path) Else StdOut.Write(" Autorisations effaces sur " & path) End If ErrorCode = vbNullString End Function Function AddPerm(path, account, access) Accorder des droits un utilisateur sur un dossier ou des sous-dossiers. On Error Resume Next strCommand = subinacl /verbose /output=log.temp _ & " /subdirectories """ & path & """ /grant=""" _ & account & """ =" & access ErrorCode = objWS.Run(strCommand, 0, TRUE)
Chapitre 6
151
If ErrorCode <> 0 Then StdOut.Write(" " & account & ": " & access _ & [chec de AddPerm] sur " & path) Else return = inStr(1, ParseTempFile("log.temp"), "ne sera pas examin") If Not return = 0 Then StdOut.Write(" " & account & ": " & access _ & [chec de AddPerm] sur " & path) Else StdOut.Write(" " & account & ": " & access _ & [Succs de AddPerm] sur " & path) End If End If ErrorCode = vbNullString End Function Function RemovePerm(path, account, access) Retirer des droits lutilisateur sur un dossier ou des sous-dossiers. On Error Resume Next strCommand = subinacl /verbose /output=log.temp _ & " /subdirectories """ & path & """ /revoke=""" _ & account & """ =" & access ErrorCode = objWS.Run(strCommand, 0, TRUE) If ErrorCode <> 0 Then StdOut.Write(" " & account & ": " & access _ & [chec de AddPerm] sur " & path) Else return = inStr(1, ParseTempFile("log.temp"), "ne sera pas examin") If Not return = 0 Then StdOut.Write(" " & account & ": " & access _ & [chec de AddPerm] sur " & path) Else StdOut.Write(" " & account & ": " & access _ & [Succs de AddPerm] sur " & path) End If End If ErrorCode = vbNullString End Function
152
Partie 2
Ltape la plus difcile comprendre reste la construction de la rgle daccs. Celle-ci est constitue de trois paramtres qui dnissent un utilisateur ou un groupe, un droit daccs et un type de contrle daccs. Le premier paramtre, Identity, dsigne lutilisateur ou le groupe ajouter la rgle daccs. Le deuxime, FileSystemRights, est plus subtil car il demande de comprendre les droits du systme de chiers avant de pouvoir dnir laccs. La commande suivante gnre la liste des droits reconnus :
PS C:\> [enum]::GetNames([System.Security.AccessControl.FileSystemRights]) ListDirectory ReadData WriteData CreateFiles
Chapitre 6
153
CreateDirectories AppendData ReadExtendedAttributes WriteExtendedAttributes Traverse ExecuteFile DeleteSubdirectoriesAndFiles ReadAttributes WriteAttributes Write Delete ReadPermissions Read ReadAndExecute Modify ChangePermissions TakeOwnership Synchronize FullControl PS C:\>
partir de cette liste, nous pouvons dnir un seul droit, comme Modify (modier), ou combiner des droits dans une liste, comme Read (lire), Write (crire) et Delete (supprimer). Le troisime paramtre, AccessControlType, accepte uniquement les valeurs Allow (autoriser) et Deny (refuser).
Fonctions PowerShell
Comme pour SubInACL, nous pouvons dvelopper un ensemble de fonctions rutilisables pour la gestion des autorisations. Voici des exemples de telles fonctions :
#------------------------------------------------# Clear-Inherit #------------------------------------------------# Usage : Se protger contre les rgles daccs hrites et # retirer toutes les rgles hrites indiques. # $Object : Le chemin du dossier ou du chier ("c:\monDossier" ou # "c:\monFichier.txt"). function Clear-Inherit{ param ($Object)
154
Partie 2
Clear-Inherit
nest peut-tre pas le nom appropri pour cette fonction car, si elle empche lapplication des autorisations hrites depuis lobjet parent et si elle efface les autorisations hrites de lobjet racine et des sous-objets, elle efface galement les autorisations dnies sur les sous-objets. Par consquent, avant de linvoquer, il est prfrable que vous deveniez le propritaire de lobjet ou que vous vriiez que vous avez dni explicitement vos droits sur lobjet du systme de chiers racines. Si vous ntes pas certain davoir accs aux objets du systme de chiers, vous risquez de rencontrer des messages "accs refus" aprs avoir effac les droits hrits. La fonction suivante, Set-Owner, xe le propritaire dun objet du systme de chiers :
#------------------------------------------------# Set-Owner #------------------------------------------------# Usage : Fixer le propritaire dun dossier ou dun chier. # $Object : Le chemin du dossier ou du chier ("c:\monDossier" ou # "c:\monFichier.txt"). # $Identity : Nom dutilisateur ou de groupe ("Administrateurs" ou # "monDomaine\utilisateur1"). function Set-Owner{ param ($Object, [System.Security.Principal.NTAccount]$Identity) # Obtenir llment modier. $Item = get-item $Object # Fixer son propritaire. $SD = $Item.GetAccessControl() $SD.SetOwner($Identity) $Item.SetAccessControl($SD) }
Chapitre 6
155
Clear-SD
#------------------------------------------------# Clear-SD #------------------------------------------------# Usage : Effacer toutes les autorisations dun dossier ou dun chier. # $Object : Le chemin du dossier ou du chier ("c:\monDossier" ou # "c:\monFichier.txt"). function Clear-SD{ param ($Object) # Obtenir le descripteur de scurit de lobjet. $SD = get-acl $Object # Fixer le descripteur de scurit Tout le monde - Contrle total. # # Effectivement, cela ne fait pas partie des bonnes pratiques. Si cela ne # convient pas, xer le descripteur de scurit lutilisateur # courant. $SD.SetSecurityDescriptorSddlForm("D:PAI(A;OICI;FA;;;WD)") set-acl $Object $SD }
Bien que la fonction Clear-SD ne soit pas utilise dans le script de gestion du systme de chiers dcrit plus loin, elle illustre bien la dnition dun descripteur de scurit laide du langage SDDL (Security Descriptor Denition Language). SDDL permet de dcrire un descripteur de scurit sous forme dune chane de texte. Si la fonction Clear-SD est utilise, le descripteur de scurit dun objet est effac, puis il est x FullControl (contrle total) pour le groupe Everyone (tout le monde), la chane "D:PAI(A;OICI;FA;;;WD)" tant employe.
INFO Pour plus dinformations sur la construction dun descripteur de scurit laide dune chane, consultez la page http://msdn.microsoft.com/library/default.asp?url=/library/en-us/secauthz/ security/security_descriptor_string_format.asp.
156
Partie 2
La fonction suivante, Add-ACE, accorde des droits un utilisateur ou un groupe sur un objet du systme de chiers. Bien quelle soit analogue lexemple donn au dbut de cette section, elle montre galement comment contrler les paramtres dhritage dune nouvelle ACE (Access Control Entry) avec les numrations System.Security.AccessControl. PropagationFlags et System.Security.AccessControl.InheritanceFlags :
#------------------------------------------------# Add-ACE #------------------------------------------------# Usage : Accorder des droits un dossier ou un chier. # $Object : Le chemin du dossier ou du chier ("c:\monDossier" ou # "c:\monFichier.txt"). # $Identity : Nom dutilisateur ou de groupe ("Administrateurs" ou # "monDomaine\utilisateur1"). # $AccessMask : Les droits utiliser pour la cration de la rgle daccs # ("FullControl", "ReadAndExecute, Write", etc.). # $Type : Accorder ou refuser les droits ("Allow" ou "Deny"). function Add-ACE{ param ($Object, [System.Security.Principal.NTAccount]$Identity, [System.Security.AccessControl.FileSystemRights]$AccessMask, [System.Security.AccessControl.AccessControlType]$Type) $InheritanceFlags = ` [System.Security.AccessControl.InheritanceFlags]` "ContainerInherit, ObjectInherit" $PropagationFlags = ` [System.Security.AccessControl.PropagationFlags]"None" # Obtenir le descripteur de scurit de lobjet. $SD = get-acl $Object # Ajouter les rgles daccs. $Rule = new-object ` System.Security.AccessControl.FileSystemAccessRule($Identity, ` $AccessMask, $InheritanceFlags, $PropagationFlags, $Type) $SD.AddAccessRule($Rule) set-acl $Object $SD }
Chapitre 6
157
Ne vous laissez pas perturber par le nom de ces indicateurs. Ils dterminent lapplication dune ACE un objet et tous ses sous-objets. Dans la fonction Add-ACE, les indicateurs sont dnis de manire que lACE soit applique "Ce dossier et tous les sous-dossiers et chiers". Autrement dit, elle est non seulement applique lobjet en cours de modication, mais elle est galement propage tous les sous-objets de cet objet. Cette propagation devrait sufre pour la plupart des tches de gestion du systme de chiers. Si ce nest pas le cas, vous pouvez toujours modier la fonction an quelle accepte des paramtres dhritage en arguments. La dernire fonction se nomme Remove-ACE. Elle supprime une ACE dans une ACL :
#------------------------------------------------# Remove-ACE #------------------------------------------------# Usage : Retirer des droits un dossier ou un chier. # $Object : Le chemin du dossier ou du chier ("c:\monDossier" ou # "c:\monFichier.txt"). # $Identity : Nom dutilisateur ou de groupe ("Administrateurs" ou # "monDomaine\utilisateur1"). # $AccessMask : Les droits utiliser pour la cration de la rgle daccs # ("FullControl", "ReadAndExecute, Write", etc.). # $Type : Accorder ou refuser les droits ("Allow" ou "Deny"). function Remove-ACE{ param ($Object, [System.Security.Principal.NTAccount]$Identity, [System.Security.AccessControl.FileSystemRights]$AccessMask, [System.Security.AccessControl.AccessControlType]$Type) # Obtenir le descripteur de scurit de lobjet. $SD = get-acl $Object # Retirer la rgle laccs. $Rule = new-object ` System.Security.AccessControl.FileSystemAccessRule($Identity, ` $AccessMask, $Type) $SD.RemoveAccessRule($Rule) set-acl $Object $SD }
158
Partie 2
De VBScript PowerShell
Si cet ouvrage prsente des applications pratiques de PowerShell, il montre galement comment convertir des scripts VBScript en scripts PowerShell. Le premier exemple est un script de cration de comptes pour lentreprise companyabc.com, un fournisseur daccs Internet la croissance rapide. Lors de lajout de nouveaux comptes, un dossier de site Web est galement cr pour chaque compte. Pour cela, un modle de structure est recopi vers les dossiers de site Web des nouveaux utilisateurs. Par le pass, la socit companyabc.com demandait des employs ou des contractuels de crer ces dossiers et de xer les autorisations de larborescence. Aprs plusieurs erreurs de conguration des autorisations et des suppressions accidentelles de dossiers, le service informatique a dcid que cette manire de procder tait loin dtre satisfaisante. Pour remplacer le processus manuel, il a souhait automatiser la cration du dossier Web de lutilisateur, la copie de la structure modle dans ce dossier et la dnition des autorisations.
Le script ProvisionWebFolders.wsf
ProvisionWebFolders.wsf
est un script VBScript de type WSF (Windows Script File) dvelopp pour rpondre aux besoins dautomation de la socit companyabc.com. Vous le trouverez dans le dossier Scripts\Chapitre 6\ProvisionWebFolders et vous pouvez le tlcharger depuis www.pearsoneducation.fr. Ce script attend deux paramtres.
Tout dabord, largument de templatepath doit dsigner le chemin du dossier modle recopier dans le dossier Web des nouveaux utilisateurs. Ensuite, largument dimportle doit prciser le nom dun chier CSV, qui dnit les nouveaux utilisateurs, et lemplacement de leur dossier Web. Voici la commande qui permet dexcuter le script ProvisionWebFolders. wsf. Un exemple dexcution est prsent la Figure 6.1 :
cscript ProvisionWebFolders.wsf /templatepath:".\Template" /importle:" .\users.csv"
Voici les actions effectues par le script ProvisionWebFolders.wsf : 1. Il vrie le chemin du dossier modle. 2. Ensuite, il ouvre et lit le contenu du chier CSV (nouveaux utilisateurs et emplacement du dossier) dans un tableau.
Chapitre 6
159
Figure 6.1
Excution du script ProvisionWebFolders.wsf.
3. Pour chaque utilisateur dans le tableau, il invoque xcopy an de recopier larborescence du dossier modle dans le dossier Web du nouvel utilisateur. 4. Il utilise ensuite SubInACL pour xer les autorisations de chaque dossier : Administrateurs : Propritaire Administrateurs : Contrle total Systme : Contrle total Nouvel utilisateur : Contrle total
160
Partie 2
INFO Ce script utilise diffrentes fonctions de sortie vers la console ou un chier de journalisation : Mess, StatStart et StatDone. Lorsque vous crivez des scripts destins aux administrateurs qui ne sont pas eux-mmes des dveloppeurs de scripts, faites en sorte que les interactions avec lutilisateur soient cohrentes. Cela amliore lutilisabilit des scripts et leur donne un niveau professionnel. Le code source de ces fonctions se trouve la n du script.
Notre premier exemple de code est constitu des lments XML initiaux dun chier WSF. Ils dnissent les paramtres accepts, dcrivent le script, donnent des exemples dutilisation et prcisent le langage employ :
<?xml version="1.0" encoding="ISO-8859-1" ?> <package> <job id=ProvisionWebFolders> <runtime> <description> *********************************************************************** Ce script cre le dossier Web des utilisateurs indiqus dans une liste. *********************************************************************** </description> <named name="templatepath" helpstring="Chemin du modle de larborescence de dossiers copier." type="string" required="1" /> <named name="importle" helpstring="Chemin du chier CSV importer. type=string required=1 /> <example> Exemple : cscript ProvisionWebFolders.wsf /templatepath:"C:\Dossiers Modles\Dossier1" /importle:"c:\temp\utilisateurs.csv" </example> </runtime> <script language="VBScript"> <![CDATA[
Ensuite, le script vrie que les arguments des paramtres obligatoires templatepath et importle sont dnis. Si ce nest pas le cas, il afche les informations dutilisation (voir le
Chapitre 6
161
code prcdent) sur la console et se termine. Si les arguments sont dnis, il tablit son environnement en dnissant les variables utilises par la suite :
On Error Resume Next =================================================================== Vrier les arguments obligatoires. =================================================================== If WScript.Arguments.Named.Exists("templatepath") = FALSE Then WScript.Arguments.ShowUsage() WScript.Quit End If If WScript.Arguments.Named.Exists("importle") = FALSE Then WScript.Arguments.ShowUsage() WScript.Quit End If =================================================================== Dnir lenvironnement de travail. =================================================================== Const ForReading = 1 ReDim arrTargs(0) Dim StdOut Dim FSO, objWS Dim strTemplatePath, strImportFile Set StdOut = WScript.StdOut Set FSO = CreateObject("Scripting.FileSystemObject") Set objWS = CreateObject("WScript.Shell") strTemplatePath = WScript.Arguments.Named("templatepath") strImportFile = WScript.Arguments.Named("importle")
Lexemple de code suivant correspond au dbut de lautomation. Tout dabord, le script afche son en-tte sur la console, puis vrie que templatepath correspond un chemin valide du systme de chiers. Si ce nest pas le cas, il se termine. Vous remarquerez comment les
162
Partie 2
informations de validit du chemin donnes par templatepath et ltat de lexcution du script sont afchs sur la console an que ladministrateur puisse les consulter laide des fonctions StatStart et StatDone :
=================================================================== Commencer le travail. =================================================================== Mess "########################################" Mess "# ProvisionWebFolders #" Mess "########################################" Mess vbNullString =================================================================== Mess vbNullString ------------------- Conrmer lexistence de TemplatePath. -------------------StatStart Vrication du chemin des modles" If (FSO.FolderExists(strTemplatePath)) Then StatDone Else StdOut.WriteLine(Erreur fatale : le chemin des modles nexiste pas...") WScript.Quit() End If
Dans le code suivant, la fonction ParseFile lit chaque ligne du chier CSV, en sautant la premire, et lajoute en tant qulment dun tableau existant. Elle est crite de manire appeler la fonction Xerror en cas derreur. Xerror stoppe lexcution, afche lerreur sur la console et quitte le script :
------------------- Vrier le chier CSV. -------------------StatStart "Vrication du chier import" ParseFile strImportFile, arrTargs StatDone
Chapitre 6
163
Lexemple de code suivant montre lutilisation de xcopy pour crer le dossier Web dun utilisateur et y recopier la structure modle :
------------------- Crer les dossiers Web. -------------------Mess vbNullString Mess "Cration des dossiers Web :" For Each Targ In arrTargs arrTargRecord = split(Targ, ",") strUserName = arrTargRecord(0) strPath = arrTargRecord(1) StdOut.Write(" " & strPath) StdOut.Write("\" & strUserName) strCommand = "xcopy """ & strTemplatePath & """ """ & strPath & "\" _ & strUserName & """ /O /E /I /Y" ErrorCode = objWS.Run(strCommand, 0, TRUE) If ErrorCode <> 0 Then StdOut.WriteLine( [ECHEC][Commande invoque : " & strCommand & "]") Else StdOut.WriteLine(" [COPIE]")
Pour lappel xcopy, le script utilise une chane qui dnit la commande (strCommand) et un objet WScript.Shell nomm objWS. Nous pourrions obtenir les mmes rsultats avec un objet FSO, mais xcopy rduit le nombre de lignes de code ncessaires cette opration. Une fois le dossier Web de lutilisateur cr, ltape suivante consiste en xer les autorisations. Pour cela, le script se sert de loutil SubInACL en invoquant les fonctions DumpPerm, SetOwner et AddPerm. Dans lexemple de code suivant, faites particulirement attention la manire dont les fonctions sont appeles deux fois lorsque les autorisations dun objet sont modies.
164
Partie 2
Administrateurs devient le propritaire du dossier. SetOwner strPath & "\" & strUserName, "Administrateurs" Mess vbNullString Administrateurs devient le propritaire de tout le contenu du dossier. SetOwner strPath & "\" & strUserName & "\*.*", "Administrateurs" Mess vbNullString Effacer les autorisations du dossier. DumpPerm strPath & \ & strUserName Mess vbNullString Effacer les autorisations du contenu du dossier. DumpPerm strPath & \ & strUserName & \*.* Mess vbNullString Ajouter le groupe Administrateurs. AddPerm strPath & "\" & strUserName, "Administrateurs", "F" Mess vbNullString Ajouter le groupe Administrateurs tout le contenu du dossier. AddPerm strPath & "\" & strUserName & "\*.*", "Administrateurs", "F" Mess vbNullString Ajouter SYSTEM. AddPerm strPath & \ & strUserName, SYSTEM, F Mess vbNullString Ajouter SYSTEM tout le contenu du dossier. AddPerm strPath & "\" & strUserName & "\*.*", "SYSTEM", "F" Mess vbNullString Ajouter lutilisateur. AddPerm strPath & \ & strUserName, strUserName, F Mess vbNullString Ajouter lutilisateur tout le contenu du dossier moins AddPerm strPath & "\" & strUserName & "\*.*", strUserName, "F" Mess vbNullString End If Mess vbNullString ErrorCode = vbNullString Next Mess "Termin : les dossiers Web ont t crs"
Chapitre 6
165
Le premier appel SubInACL modie les autorisations sur le dossier racine, tandis que le second modie celles des sous-dossiers et chiers du dossier racine. Le deuxime appel nest sans doute pas ncessaire si les autorisations du dossier racine ont t effaces. Cependant, effacer les autorisations dune arborescence de dossiers ne xe pas toujours correctement les paramtres dhritage. Certains sous-dossiers et chiers risquent alors de ne pas hriter des autorisations du dossier racine. En appelant une seconde fois SubInACL pour modier les autorisations des sous-dossiers et des chiers du dossier racine, il semble que nous rsolvions le problme dhritage. Le dernier exemple de code est constitu des procdures et des fonctions utilises tout au long du script et des lments XML terminant le script. Il est inutile de dtailler cette partie nale du script car ces procdures et fonctions sont sufsamment comprhensibles par ellesmmes et ont dj t prsentes :
=================================================================== Procdures. =================================================================== ------------------- Procdure gnrale pour les messages. -------------------Sub Mess(Message) crire sur la console. StdOut.WriteLine(Message) End Sub ------------------- Procdure gnrale pour le dbut dun message. -------------------Sub StatStart(Message) crire sur la console. StdOut.Write(Message) End Sub ------------------- Procdure gnrale pour la n dun message. -------------------Sub StatDone crire sur la console. StdOut.Write(vbTab & vbTab) StdOut.WriteLine("[OK]") End Sub
166
Partie 2
------------------- Procdure gnrale pour Xerror. -------------------Sub Xerror If Err.Number <> 0 Then crire sur la console. StdOut.WriteLine(" Erreur fatale : " & CStr(Err.Number) _ & " " & Err.Description) WScript.Quit() End If End Sub =================================================================== Fonctions. =================================================================== Function ParseFile(le, arrname) Cette fonction lit un chier et retourne un tableau de son contenu. La premire ligne est saute !!! On Error Resume Next count = -1 Ouvrir le chier en lecture. Set objFile = FSO.OpenTextFile(le, ForReading) objFile.SkipLine note : cette ligne donne les en-ttes des colonnes. Xerror Lire chaque ligne du chier et la placer dans un tableau. Do While objFile.AtEndOfStream <> True count = count + 1 If count > UBound(arrname) Then ReDim Preserve arrname(count) arrname(count) = objFile.Readline Loop Xerror Fermer le chier. objFile.Close() Set objFile = Nothing count = 0 End Function Function ParseTempFile(path) Ouvrir un chier en lecture. Set objFile = FSO.OpenTextFile(path, ForReading)
Chapitre 6
167
templeinfo = vbNullString Do While objFile.AtEndOfStream <> True templeinfo = templeinfo & objFile.Readline Loop ParseTempFile = templeinfo objFile.Close() Set objFile = Nothing End Function Function SetOwner(path, account) Fixer le propritaire dun dossier ou de sous-dossiers. On Error Resume Next strCommand = subinacl /verbose /output=log.temp _ & "/subdirectories """ & path & """ /setowner=""" & account & """" ErrorCode = objWS.Run(strCommand, 0, TRUE) If ErrorCode <> 0 Then StdOut.Write(" " & account & ":" _ & [chec de SetOwner] sur " & path) Else return = inStr(1, ParseTempFile("log.temp"), "ne sera pas examin") If Not return = 0 Then StdOut.Write(" " & account & ":" _ & [chec de SetOwner] sur " & path) Else StdOut.Write(" " & account & ":" _ & [Succs de SetOwner] sur " & path) End If End If ErrorCode = vbNullString End Function Function DumpPerm(path) Effacer les autorisations dun dossier ou de sous-dossiers. On Error Resume Next strCommand = subinacl /verbose /output=log.temp _ & "/subdirectories """ & path & """ /perm"
168
Partie 2
ErrorCode = objWS.Run(strCommand, 0, TRUE) If ErrorCode <> 0 Then StdOut.Write( Autorisations non effaces sur " & path) Else StdOut.Write(" Autorisations effaces sur " & path) End If ErrorCode = vbNullString End Function Function AddPerm(path, account, access) Accorder des droits un utilisateur sur un dossier ou des sous-dossiers. On Error Resume Next strCommand = subinacl /verbose /output=log.temp _ & " /subdirectories """ & path & """ /grant=""" _ & account & """ =" & access ErrorCode = objWS.Run(strCommand, 0, TRUE) If ErrorCode <> 0 Then StdOut.Write(" " & account & ": " & access _ & [chec de AddPerm] sur " & path) Else return = inStr(1, ParseTempFile("log.temp"), "ne sera pas examin") If Not return = 0 Then StdOut.Write(" " & account & ": " & access _ & [chec de AddPerm] sur " & path) Else StdOut.Write(" " & account & ": " & access _ & [Succs de AddPerm] sur " & path) End If End If ErrorCode = vbNullString End Function ]]> </script> </job> </package>
Chapitre 6
169
Le script ProvisionWebFolders.ps1
ProvisionWebFolders.ps1 est une conversion en PowerShell du script ProvisionWebFolders. wsf. ProvisionWebFolders
Vous en trouverez une version oprationnelle dans le dossier Scripts\Chapitre et en tlchargement sur le site www.pearsoneducation.fr.
6\
Ce script attend deux paramtres. Tout dabord, largument de TemplatePath doit dsigner le chemin du dossier modle recopier dans le dossier Web des nouveaux utilisateurs. Ensuite, largument dImportFile doit prciser le nom dun chier CSV qui dnit les nouveaux utilisateurs et lemplacement de leur dossier Web. Voici la commande qui permet dexcuter le script ProvisionWebFolders.ps1. Un exemple dexcution est prsent la Figure 6.2 :
PS D:\Travail> .\ProvisionWebFolders.ps1 .\template .\users.csv
Figure 6.2
Excution du script ProvisionWebFolders.ps1.
170
Partie 2
Voici les actions effectues par le script ProvisionWebFolders.ps1 : 1. Il vrie que le chemin du dossier modle existe. 2. Ensuite, il vrie que le chemin du chier import existe. 3. Il importe le chier CSV dans la variable $Targets. 4. Pour chaque utilisateur dans la variable $Targets, il copie larborescence du dossier modle dans le dossier Web du nouvel utilisateur. 5. Pour nir, le script xe les autorisations de chaque dossier : Administrateurs : Propritaire Administrateurs : Contrle total Systme : Contrle total Nouvel utilisateur : Contrle total Le premier exemple de code contient len-tte du script ProvisionWebFolders.ps1. Cet entte inclut des informations sur lobjectif du script, la date de sa dernire mise jour, ainsi que le nom de son auteur. Les paramtres du script viennent ensuite :
################################################## # ProvisionWebFolders.ps1 # Ce script cre le dossier Web des nouveaux utilisateurs. # # Cr le : 12/09/2006 # Auteur : Tyson Kopczynski ################################################## param([string] $TemplatePath = $(throw write-host ` Veuillez prciser le chemin du modle source de la structure de dossiers" ` " copier. -Foregroundcolor Red), [string] $ImportFile = $(throw `write-host Veuillez prciser le nom du chier CSV importer." `-Foregroundcolor Red))
Notez lutilisation du mot cl throw dans la dclaration param. Il gnre une erreur lorsquun argument de paramtre nest pas prcis. Cette technique impose la dnition dun paramtre en arrtant lexcution du script et en afchant lutilisateur des informations concernant le paramtre requis, avec lapplet de commande Write-Host. Cette applet accepte un paramtre Foregroundcolor, qui xe la couleur du texte afch. Cette fonctionnalit permet dattirer lattention sur des dtails de ltat du script (voir Figure 6.3).
Chapitre 6
171
Figure 6.3
Texte afch en vert et en rouge sur la console pour indiquer ltat du script.
Ensuite, le script place les fonctions de gestion du systme de chiers dans sa porte. Il est inutile de les expliquer plus en dtail car elles ont dj t dcrites prcdemment :
################################################## # Fonctions. ################################################## #------------------------------------------------# Clear-Inherit #------------------------------------------------# Usage : Se protger contre les rgles daccs hrites et # retirer toutes les rgles hrites indiques. # $Object : Le chemin du dossier ou du chier ("c:\monDossier" ou # "c:\monFichier.txt"). function Clear-Inherit{ param ($Object) $SD = get-acl $Object $SD.SetAccessRuleProtection($True, $False) set-acl $Object $SD }
172
Partie 2
#------------------------------------------------# Set-Owner #------------------------------------------------# Usage : Fixer le propritaire dun dossier ou dun chier. # $Object : Le chemin du dossier ou du chier ("c:\monDossier" ou # "c:\monFichier.txt"). # $Identity : Nom dutilisateur ou de groupe ("Administrateurs" ou # "monDomaine\utilisateur1"). function Set-Owner{ param ($Object, [System.Security.Principal.NTAccount]$Identity) # Obtenir llment modier. $Item = get-item $Object # Fixer son propritaire. $SD = $Item.GetAccessControl() $SD.SetOwner($Identity) $Item.SetAccessControl($SD) } #------------------------------------------------# Add-ACE #------------------------------------------------# Usage : Accorder des droits un dossier ou un chier. # $Object : Le chemin du dossier ou du chier ("c:\monDossier" ou # "c:\monFichier.txt"). # $Identity : Nom dutilisateur ou de groupe ("Administrateurs" ou # "monDomaine\utilisateur1"). # $AccessMask : Les droits utiliser pour la cration de la rgle daccs # ("FullControl", "ReadAndExecute, Write", etc.). # $Type : Accorder ou refuser les droits ("Allow" ou "Deny"). function Add-ACE{ param ($Object, [System.Security.Principal.NTAccount]$Identity, [System.Security.AccessControl.FileSystemRights]$AccessMask, [System.Security.AccessControl.AccessControlType]$Type) $InheritanceFlags = ` [System.Security.AccessControl.InheritanceFlags]` "ContainerInherit, ObjectInherit"
Chapitre 6
173
$PropagationFlags = ` [System.Security.AccessControl.PropagationFlags]"None" # Obtenir le descripteur de scurit de lobjet. $SD = get-acl $Object # Ajouter les rgles daccs. $Rule = new-object ` System.Security.AccessControl.FileSystemAccessRule($Identity, ` $AccessMask, $InheritanceFlags, $PropagationFlags, $Type) $SD.AddAccessRule($Rule) set-acl $Object $SD }
Le prochain exemple de code commence la partie dautomation du script. Tout dabord, il vrie si la chane contenue dans la variable $TemplatePath correspond un chemin de dossier valide, puis si la variable $ImportFile dsigne un chemin de chier valide. Pour raliser ces tests, les instructions if...then utilisent lapplet de commande Test-Path. Cette applet trs pratique permet de vrier si un dossier ou un chier (-pathType container ou leaf) est valide. Si lun des chemins nest pas valide, lexcution du script est arrte et des informations concernant les chemins invalides sont afches loprateur de script :
################################################## # Code principal. ################################################## write-host "----------------------------------------" write-host "ProvisionWebFolders -" write-host "----------------------------------------" write-host write-host Vrication du chemin des modles" -NoNewLine if (!(test-path $TemplatePath -pathType container)){ throw write-host `t $TemplatePath nest pas un rpertoire valide !" -Foregroundcolor Red } else { write-host `t "[OK]" -Foregroundcolor Green } write-host Vrication du chier import" -NoNewLine
174
Partie 2
if (!(test-path $ImportFile -pathType leaf)){ throw write-host `t "$ImportFile nest pas un chier valide ! -Foregroundcolor Red } else { write-host `t [OK] -Foregroundcolor Green }
Puis, nous dnissons les autres variables employes dans le script. La premire, $Owner, dnit le propritaire de larborescence du dossier Web de chaque utilisateur, qui, dans ce cas, est le groupe local Administrateurs. Ensuite, nous dnissons la variable $Targets laide de lapplet de commande Import-Csv, laquelle permet de lire des valeurs depuis un chier CSV import ($ImportFile) dans la variable $Targets, qui sert ensuite crer les dossiers Web des nouveaux utilisateurs :
#-------------------# Dnir les variables. #-------------------$Owner = "Administrateurs" $Targets = import-csv $ImportFile
Dans le code suivant, le script utilise le chemin et lutilisateur indiqus dans la variable $Targets pour construire le chemin nal, en invoquant lapplet de commande Join-Path. Puis, lapplet Copy-Item copie les dossiers modles vers le chemin de destination :
#-------------------# Crer les dossiers Web. #-------------------write-host write-host "Cration des dossiers Web :" foreach ($Target in $Targets){ $Path = join-path $Target.DestPath $Target.UserName $UserName = $Target.UserName write-host $Path if (!(test-path $Path)){ copy-item $TemplatePath -Destination $Path -Recurse `
Chapitre 6
175
-ErrorVariable Err -ErrorAction SilentlyContinue if (!$Err){ write-host " Dossier " -NoNewLine write-host "[COPIE]" -Foregroundcolor Green # Pour arrter les boucles. $Err = $False
Ensuite, la fonction Set-Owner dnit le groupe local Administrateurs comme propritaire de larborescence du dossier Web de lutilisateur :
.{ trap{write-host "[ERREUR] Impossible de changer de propritaire !" ` -Foregroundcolor Red; $Script:Err = $True; Continue} # Fixer le propritaire. write-host " SetOwner pour $Owner " -NoNewLine Set-Owner $Path $Owner if ($Err -eq $False){ $Items = get-childitem $Path -Recurse [void]($Items | foreach-object ` {Set-Owner $_.FullName $Owner}) } else{ # Arrter la boucle. Continue } write-host "[OK]" -Foregroundcolor Green }
Vous vous demandez peut-tre pourquoi le code de Set-Owner est plac lintrieur dun bloc de script. Loprateur dappel point (.) qui prcde le bloc de script demande PowerShell dexcuter ce bloc au sein de la porte courante. Sil ntait pas utilis, PowerShell nexcuterait pas le bloc de script. En crant un bloc de script indpendant pour grer lappel
176
Partie 2
Set-Owner, nous nous assurons que la porte de linstruction trap est limite ce bloc de code. Cette technique de contrle de la porte de trap sera souvent employe dans ce livre.
.{ trap{write-host "[ERREUR] Impossible dajouter des droits !" ` -Foregroundcolor Red; $Script:Err = $True; Continue} # Ajouter le groupe Administrateurs. write-host " AddACE pour Administrateurs " -NoNewLine Add-ACE $Path "Administrateurs" "FullControl" "Allow" if ($Err -eq $False){ write-host "[OK]" -Foregroundcolor Green } else{ # Arrter la boucle. Continue } } .{ trap{write-host "[ERREUR] Impossible deffacer les autorisations hrites !" -Foregroundcolor Red; $Script:Err = $True; Continue} # Effacer les autorisations hrites. write-host " ClearInherit " -NoNewLine Clear-Inherit $Path if ($Err -eq $False){ write-host "[OK]" -Foregroundcolor Green } else{ # Arrter la boucle. Continue } }
Chapitre 6
177
Comme nous lavons mentionn prcdemment, la fonction Clear-Inherit supprime les autorisations hrites pour le dossier racine, ses sous-dossiers et ses chiers, ainsi que les autorisations explicitement dnies sur tous les sous-dossiers et les chiers. Si le groupe Administrateurs navait pas dni explicitement des droits sur le dossier racine, la suite du script ne sexcuterait pas par manque de droits.
INFO Les autorisations dnies explicitement sont celles qui sont spcies directement pour un utilisateur sur un objet. Les autorisations dnies implicitement sont celles qui sont hrites ou dnies par lappartenance un groupe.
Dans le dernier exemple de code, lautorisation FullControl sur le dossier Web de lutilisateur est donne SYSTEM et lutilisateur. Pour nir, le script signale loprateur la n de son travail :
# Ajouter SYSTEM. write-host " AddACE pour SYSTEM " -NoNewLine if ((Add-ACE $Path "SYSTEM" "FullControl" "Allow") -eq $True){ write-host "[OK]" -Foregroundcolor Green } # Ajouter lutilisateur. write-host AddACE pour $UserName -NoNewLine if ((Add-ACE $Path $UserName "FullControl" "Allow") -eq $True){ write-host "[OK]" -Foregroundcolor Green } } else { write-host " Dossier " -NoNewLine write-host "Erreur : $Err -Foregroundcolor Red } } else { write-host Dossier -NoNewLine write-host [EXISTE] -Foregroundcolor Yellow } write-host } write-host Termin : les dossiers Web ont t crs"
178
Partie 2
En rsum
Ce chapitre sest attach dcrire la gestion du systme de chiers de Windows quand on utilise WSH et PowerShell. Mme si ces deux solutions de scripts disposent de mthodes de gestion du systme de chiers, le fournisseur FileSystem de PowerShell permet de mettre en uvre une mthode de type source de donnes. Lors du dveloppement de vos prochains scripts ou de lutilisation de PowerShell depuis la console, vous remarquerez sans doute que la mthode de PowerShell apporte une plus grande libert daccs, de consultation et de manipulation du systme de chiers. Vous avez pu comprendre les diffrences entre WSH et PowerShell, quant la manipulation du systme de chiers de Windows. Ce chapitre a galement expliqu la gestion des autorisations lorsque ces deux interfaces de scripts sont utilises. Vous pensiez peut-tre que la manipulation des autorisations au travers de ces interfaces tait une tche difcile. Mme si cest un peu vrai, vous devez prsent reconnatre quelle est loin dtre insurmontable. La gestion des autorisations laide dun script dautomation peut devenir un outil trs puissant. Par exemple, vous pouvez dvelopper des scripts qui imposent des autorisations en fonction dune stratgie dnie, qui vrient si les autorisations respectent un modle ou recherchent des instances sur lesquelles un utilisateur ou un groupe possde des droits.
7
PowerShell et le Registre
Dans ce chapitre
m m m
Introduction
Ce chapitre sintresse la gestion du Registre de Windows depuis PowerShell. Pour cela, il prsente des exemples dtaills fonds sur WSH (Windows Script Host) et sur PowerShell. Ils sont donns sous ces deux formes an que vous puissiez passer PowerShell en bnciant de votre exprience de lcriture de scripts pour Windows. Outre la comparaison des exemples, ce chapitre propose tout un ensemble de fonctions oprationnelles pour la gestion du Registre. Lobjectif est de donner au lecteur la possibilit dappliquer les techniques de scripts PowerShell des besoins dautomation rels.
180
Partie 2
ou la modication du Registre local. Pour ces dernires oprations, lobjet trois mthodes :
n RegDelete n RegRead
WshShell
offre
n RegWrite
cre de nouvelles cls, ajoute une nouvelle valeur nomme une cl existante ou modie une valeur nomme existante.
Lutilisation de lobjet WshShell et de ses mthodes de manipulation du Registre est simple. Il sagit dun objet COM et, en tant que tel, il peut tre cr laide de la mthode CreateObject() de WSH. Une fois cette opration effectue, les mthodes du registre de cet objet peuvent tre invoques comme nimporte quelle autre mthode dans WSH. Dans PowerShell, laccs au Registre se fait diffremment. Comme nous lavons expliqu au Chapitre 3, "Prsentation avance de PowerShell", PowerShell dispose dun fournisseur intgr, Registry, qui permet daccder au Registre et de le manipuler sur la machine locale. Les ruches du Registre accessibles au travers de ce fournisseur sont HKEY_LOCAL_MACHINE (HKLM) et HKEY_CURRENT_USER (HKCU). Elles sont reprsentes par deux objets PSDrive supplmentaires nomms HKLM: et HKCU:.
INFO Lobjet WshShell nest pas limit aux ruches HKLM: et HKCU:. Il permet galement daccder HKEY_CLASSES_ROOT (HKCR), HKEY_USERS et HKEY_CURRENT_CONFIG. Pour manipuler ces ruches depuis PowerShell, il faut employer lapplet de commande Set-Location an de modier lemplacement de la racine du fournisseur Registry.
Le Chapitre 3 a galement expliqu que lutilisation du fournisseur Registry signie que PowerShell traite les donnes des objets HKLM: et HKCU: comme nimporte quel magasin de donnes hirarchique. Par consquent, la manipulation des donnes de ces PSDrive ne peut se faire quavec les applets de commande principales de PowerShell :
PS C:\> set-location hkcu: PS HKCU:\> get-childitem Hive: Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER
Chapitre 7
PowerShell et le Registre
181
SKC --2 2 24 0 1 4 3 32 0 2 0 0
VC -0 32 1 2 6 0 1 1 0 0 1 8
Name ---AppEvents Console Control Panel Environment Identities Keyboard Layout Printers Software UNICODE Program Groups Windows 3.1 Migration Status SessionInformation Volatile Environment
Property -------{} {ColorTable00, ColorTable01, ColorTab... {Opened} {TEMP, TMP} {Identity Ordinal, Migrated5, Last Us... {} {DeviceOld} {(default)} {} {} {ProgramCount} {LOGONSERVER, HOMESHARE, HOMEPATH, US...
PS HKCU:\> get-itemproperty Volatile Environment PSPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Volatile Environment PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER PSChildName : Volatile Environment PSDrive : HKCU PSProvider : Microsoft.PowerShell.Core\Registry LOGONSERVER : \\SOL HOMESHARE : \\taosage.internal\homes\tyson HOMEPATH : \ USERDNSDOMAIN : TAOSAGE.INTERNAL CLIENTNAME : SESSIONNAME : Console APPDATA : C:\Documents and Settings\tyson\Application Data HOMEDRIVE : U:
PS HKCU:\>
Grce aux applets de commande principales de PowerShell, nous pouvons manipuler le Registre local, tout comme avec les mthodes de Registre de lobjet WshShell. Cependant, la syntaxe et la mthodologie sont un tantinet diffrentes. Dans WSH, nous crons un objet puis nous utilisons ses mthodes pour intervenir sur le Registre. Dans PowerShell, nous accdons
182
Partie 2
au Registre et nous le manipulons de la mme manire que le systme de chiers. Par exemple, pour lire une valeur du Registre en WSH, nous invoquons la mthode RegRead :
Dim objWS Set objWS = CreateObject("WScript.Shell") strKey = "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\ WScript.Echo objWS.RegRead(strKey & ProductName)
La cration ou la modication dune valeur du registre dans WSH se font avec la mthode RegWrite :
Dim objWS Set objWS = CreateObject("WScript.Shell") strKey = "HKEY_CURRENT_USER\Software\" objWS.RegWrite strKey & "PSinfo", "Vive_PowerShell" WScript.Echo objWS.RegRead(strKey & "PSinfo")
Chapitre 7
PowerShell et le Registre
183
Noubliez pas que le Registre de Windows gre diffrents types de valeurs. Set-ItemProperty accepte le paramtre Type pour la cration ou la modication des valeurs du Registre. Les bonnes pratiques conseillent de toujours dnir explicitement les valeurs lors de lutilisation de Set-ItemProperty. Sinon, lapplet de commande donne la valeur le type par dfaut, cest--dire String. Voici les autres types existants :
n ExpandString n Binary n DWord
; ;
n MultiString n Qword.
INFO La valeur des donnes doit tre dans le format qui correspond la valeur du Registre en cours de cration ou de modication. Par exemple, si la valeur du registre est de type REG_ BINARY, vous devez utiliser une valeur binaire, comme $Bin = 101, 118, 105.
Pour supprimer une valeur du Registre dans WSH, la mthode RegDelete doit tre invoque :
Dim objWS Set objWS = CreateObject("WScript.Shell") strKey = "HKEY_CURRENT_USER\Software\" objWS.RegDelete strKey & PSinfo
Dans PowerShell, cette opration est ralise par lapplet de commande Remove-ItemProperty :
PS C:\> $Chemin = "HKCU:\Software" PS C:\> remove-itemproperty -path $Chemin -name PSinfo PS C:\>
184
Partie 2
Ces exemples illustrent la manire daccder au Registre. Elle reste assez simple, partir du moment o nous avons compris comment utiliser les applets de commande principales et noublions pas quelle ressemble normment laccs au systme de chiers de Windows. Cependant, aucune applet ne permet daccder au Registre dune machine distante. Cette absence est tout fait comprhensible, car il nexiste aucun fournisseur PowerShell pour accder des magasins de donnes distants. En attendant que quelquun crive un fournisseur permettant de grer distance un Registre, nous devons nous tourner vers une mthode alternative existante, comme lexplique la section suivante.
De VBScript PowerShell
Cette section dtaille un script VBScript qui permet de lire et de manipuler le Registre, puis sa conversion en PowerShell. La socit companyabc.com tait en cours dvaluation de lefcacit de son service informatique. Lors de lanalyse des dveloppements des scripts dautomation, les valuateurs ont not une rptition de certaines tches dans de nombreux scripts. Ces tches incluaient la cration des comptes dutilisateurs, la dnition des informations des comptes, la gestion distance des machines, la mise en uvre des activits de maintenance, etc. Lquipe dvaluation a conclu que le regroupement du code rptitif dans une bibliothque rutilisable permettrait de rduire le temps ncessaire au dveloppement des scripts. Cette mthode simple consiste crire une fonction ou un script gnrique qui ralise une tche frquente, comme la gnration dun mot de passe alatoire. Lorsquun nouveau script a besoin de cette opration, il nest plus ncessaire dcrire du code. Dans WSH et PowerShell, il suft dinclure ou de charger le chier de la bibliothque correspondante dans le script ou depuis la console. Les exemples de scripts donns ici incluent un ensemble de fonctions permettant de lire et de modier le Registre sur une machine locale ou distante. Ils ont t dvelopps pour lentreprise companyabc.com. Pour utiliser ces fonctions, les programmeurs peuvent simplement les copier dans un script ou les appeler depuis une bibliothque qui a t incluse ou charge dans le script. Outre la diminution des temps de dveloppement des scripts, lemploi dun code rutilisable enregistr dans un chier de bibliothque permet dobtenir du code plus normalis et interchangeable. En ralit, Jeffrey Snover, larchitecte de PowerShell, a souvent recommand cette bonne pratique pour lcriture de scripts.
Chapitre 7
PowerShell et le Registre
185
Le script LibraryRegistry.vbs
LibraryRegistry.vbs
est un chier VBScript qui fournit des fonctions de lecture et de modication du Registre sur la machine locale ou une machine distante. Vous le trouverez dans le dossier Scripts\Chapitre 7\LibraryRegistry et vous pouvez le tlcharger depuis le site www.pearsoneducation.fr. Pour lutiliser dans un autre script, il doit tre inclus dans celui-ci. Ensuite, le script appelant a accs aux fonctions, aux routines, aux constantes, etc., dnies dans le chier inclus.
Dans VBScript, il existe deux mthodes pour inclure un chier de script dans un autre. La premire ne fonctionne quavec les chiers VBScript (.vbs) et repose sur linstruction ExecuteGlobal. Cette instruction attend une valeur de type chane et lexcute comme une instruction VBScript dans lespace de noms global du script. Celui-ci peut ensuite accder au contenu de la valeur chane. Le code suivant illustre cette procdure :
Mthode pour inclure des chiers VBScript. Sub Include(strFileName) On Error Resume Next Dim objFSO, objFile, strScript Set objFSO = CreateObject("Scripting.FileSystemObject") If objFSO.FileExists(strFileName) Then Set objFile = objFSO.OpenTextFile(strFileName) strScript = objFile.ReadAll objFile.Close ExecuteGlobal strScript End If Set objFSO = Nothing Set objFile = Nothing End Sub
Cette mthode prsente cependant plusieurs inconvnients. Tout dabord, nous risquons dcraser des variables et des fonctions globales au moment de lexcution. Deuximement, il nexiste aucune bonne manire de dboguer le contenu de la chane passe ExecuteGlobal. En effet, cette valeur nest quune chane qui est excute. Troisimement, VBScript noffre aucune instruction dinclusion ofcielle et cette mthode nest quune solution de rechange.
186
Partie 2
Pour toutes ces raisons, linstruction ExecuteGlobal nest pas une solution conseille pour inclure des chiers dans un script. La mthode plus able et robuste consiste passer par un chier WSF, car ce format prend en charge les instructions dinclusion :
<job> <script src="MaBibliotheque.js" language="JScript" /> <script language=vbscript> strEvent = Cest les vacances !" strDate = GetCalendarDate(strEvent) WScript.Echo strDate </script> </job>
Comme le montre cet exemple, une tche VBScript dans un chier WSF peut parfaitement inclure un chier JScript. Lopration inverse est galement possible ; une tche JScript peut inclure un chier VBScript. Il est galement possible dincorporer les deux types de chiers dans un script ou de crer un seul chier WSF qui effectue plusieurs tches en utilisant des langages (moteurs) diffrents pour chacune. Quelle que soit la mthode choisie, aprs avoir inclus un chier de script, nous avons accs ses fonctions, ses constantes, ses routines, etc. depuis notre script. Chaque fonction du script LibraryRegistry.vbs utilise la classe WMI StdRegProv, qui se trouve dans lespace de noms root\default. Elles offrent des mthodes permettant de lire et de manipuler les cls et les valeurs du Registre, dans le but deffectuer les tches suivantes :
n n n n
vrier quun utilisateur dispose des autorisations indiques ; crer, numrer et supprimer des cls du Registre ; crer, numrer et supprimer des valeurs du Registre ; obtenir ou actualiser un descripteur de scurit pour une cl du Registre (uniquement dans Vista ou Longhorn).
La suite de cette section donne des exemples de code qui illustrent les fonctions de LibraryRegistry.vbs.
Chapitre 7
PowerShell et le Registre
187
La fonction ReadRegValue :
------------------- ReadRegValue -------------------Function ReadRegValue(strComputer, strKeyPath, strValueName, strType) On Error Resume Next const HKEY_LOCAL_MACHINE = &H80000002 Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" _ & strComputer & \root\default:StdRegProv) If strType = BIN Then objReg.GetBinaryValue HKEY_LOCAL_MACHINE, strKeyPath,_ strValueName, arrValue ReadRegValue = arrValue End If If strType = DWORD Then objReg.GetDWORDValue HKEY_LOCAL_MACHINE, strKeyPath,_ strValueName, strValue ReadRegValue = strValue End If If strType = EXP Then objReg.GetExpandedStringValue HKEY_LOCAL_MACHINE, strKeyPath,_ strValueName, strValue ReadRegValue = strValue End If If strType = MULTI Then objReg.GetMultiStringValue HKEY_LOCAL_MACHINE, strKeyPath,_ strValueName, arrValue ReadRegValue = arrValue End If If strType = STR Then objReg.GetStringValue HKEY_LOCAL_MACHINE, strKeyPath,_ strValueName, strValue ReadRegValue = strValue End If End Function
188
Partie 2
La fonction ReadRegValue retourne la valeur de donne du Registre qui correspond aux valeurs nommes de la ruche HKEY_LOCAL_MACHINE. Elle attend les paramtres suivants :
n strComputer.
Le nom ou ladresse IP de lordinateur dont nous voulons examiner le Registre ; "." dsigne la machine locale. Le chemin de la cl qui contient la valeur du Registre. Le nom de la valeur du Registre dont nous voulons obtenir les donnes.
n strKeyPath.
n strValueName. n strType.
Une chane qui reprsente le type de la valeur du Registre dont nous voulons obtenir les donnes, comme BIN (REG_BINARY), DWORD (REG_DWORD), EXP (REG_EXPAND_SZ), MULTI (REG_MULTI_SZ) et STR (REG_SZ).
En fonction de la valeur de strType, la fonction ReadRegValue invoque la mthode StdRegProv adquate pour retrouver les donnes de la valeur du Registre indique. Les donnes retournes peuvent tre sous la forme dune chane de caractres, dun entier ou dun tableau. Elles doivent tre traites conformment au type de la valeur du Registre lue. Par exemple, si la valeur est de type REG_BINARY, les donnes retournes par ReadRegValue se trouvent dans un tableau qui contient des valeurs binaires. Pour les lire, nous devons parcourir le tableau de la manire suivante :
Set StdOut = WScript.StdOut strServer = "serverxyz.companyabc.com" binValue = ReadRegValue(strServer, "SOFTWARE\Turtle_Worm", "binValue", "BIN") StdOut.WriteLine Valeur BIN :" For i = lBound(binValue) to uBound(binValue) StdOut.WriteLine binValue(i) Next
La fonction CreateRegKey :
Function CreateRegKey(strComputer, strKeyPath) On Error Resume Next const HKEY_LOCAL_MACHINE = &H80000002 Set objReg = GetObject(winmgmts:{impersonationLevel=impersonate}!\\ &_ strComputer & \root\default:StdRegProv)
Chapitre 7
PowerShell et le Registre
189
La fonction CreateRegKey cre une cl dans la ruche paramtres suivants : "." dsigne la machine locale.
n strKeyPath.
HKEY_LOCAL_MACHINE.
La fonction CreateRegValue :
Function CreateRegValue(strComputer, strKeyPath,_ strValueName, strvalue, strType) On Error Resume Next const HKEY_LOCAL_MACHINE = &H80000002 Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" &_ strComputer & \root\default:StdRegProv) If strType = BIN Then objReg.SetBinaryValue HKEY_LOCAL_MACHINE, strKeyPath,_ strValueName, strValue End If If strType = DWORD Then objReg.SetDWORDValue HKEY_LOCAL_MACHINE, strKeyPath,_ strValueName, strValue End If If strType = EXP Then objReg.SetExpandedStringValue HKEY_LOCAL_MACHINE, strKeyPath,_ strValueName, strValue
190
Partie 2
End If If strType = MULTI Then objReg.SetMultiStringValue HKEY_LOCAL_MACHINE, strKeyPath,_ strValueName, strValue End If If strType = STR Then objReg.SetStringValue HKEY_LOCAL_MACHINE, strKeyPath,_ strValueName, strValue End If End Function
La fonction
CreateRegValue
LOCAL_MACHINE.
cre ou modie une valeur du Registre dans la ruche Elle attend les paramtres suivants :
HKEY_
n strComputer.
Le nom ou ladresse IP de lordinateur sur lequel nous voulons crer ou modier une valeur du Registre ; "." dsigne la machine locale. Le chemin de la cl qui contient la valeur du Registre. Le nom de la valeur du Registre que nous voulons crer ou modier.
n strKeyPath.
Une chane qui reprsente le type de la valeur du Registre que nous voulons crer ou modier, comme BIN (REG_BINARY), DWORD (REG_DWORD), EXP (REG_EXPAND_SZ), MULTI (REG_MULTI_SZ) et STR (REG_SZ).
La valeur passe dans le paramtre strValue dpend du type de la valeur du Registre que nous crons ou modions. Si la valeur est de type REG_BINARY, celle passe la fonction CreateRegValue doit tre un tableau contenant des valeurs binaires. Pour le type REG_MULTI_ SZ, la valeur doit tre un tableau contenant des chanes de caractres. Pour REG_SZ et REG_ EXPAND_SZ, les valeurs doivent prendre la forme dune chane de caractres. Cependant, avec REG_EXPAND_SZ, elle doit galement inclure une variable denvironnement valide. Dans le cas contraire, la mthode GetExpandedStringValue ne parviendra pas dvelopper la chane lors de lobtention de la valeur. Enn, lors de la cration ou de la modication dune valeur de type REG_DWORD, il faut que la valeur passe CreateRegValue soit un DWORD valide. Voici un exemple dutilisation de cette fonction :
Set StdOut = WScript.StdOut strServer = "serverxyz.companyabc.com" Multi = Array("PowerShell", "est", "super !) CreateRegValue strServer, SOFTWARE\Turtle_Worm, multiValue, Multi,_ MULTI
Chapitre 7
PowerShell et le Registre
191
La fonction DeleteRegKey :
Function DeleteRegKey(strComputer, strKeyPath) On Error Resume Next const HKEY_LOCAL_MACHINE = &H80000002 Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" &_ strComputer & \root\default:StdRegProv) objReg.DeleteKey HKEY_LOCAL_MACHINE, strKeyPath End Function
La fonction DeleteRegKey supprime une cl dans la ruche HKEY_LOCAL_MACHINE. Elle attend les paramtres suivants :
n strComputer.
Le nom ou ladresse IP de lordinateur sur lequel nous voulons supprimer la cl ; "." dsigne la machine locale. Le chemin de la cl du Registre supprimer.
n strKeyPath.
INFO La suppression dune cl supprime galement toutes les sous-cls et leurs valeurs.
La fonction DeleteRegValue :
Function DeleteRegValue(strComputer, strKeyPath, strValueName) On Error Resume Next const HKEY_LOCAL_MACHINE = &H80000002
192
Partie 2
Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" &_ strComputer & \root\default:StdRegProv) objReg.DeleteValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName End Function
La fonction DeleteRegValue supprime une valeur dans la ruche attend les paramtres suivants :
m strComputer.
HKEY_LOCAL_MACHINE.
Elle
Le nom ou ladresse IP de lordinateur sur lequel nous voulons supprimer une valeur du Registre ; "." dsigne la machine locale. Le chemin de la valeur du Registre. Le nom de la valeur du Registre supprimer.
m strKeyPath.
m strValueName.
Le script LibraryRegistry.ps1
LibraryRegistry.ps1
est la version PowerShell du chier VBScript LibraryRegistry.vbs. Vous le trouverez dans le dossier Scripts\Chapitre 7\LibraryRegistry et en tlchargement depuis le site www.pearsoneducation.fr. Avant dutiliser cette bibliothque dans une session PowerShell, vous devez la charger comme nous lavons expliqu au Chapitre 3. Le format de la commande point est un point suivi dun espace, puis du nom du chier. Par exemple, . .\monScript.ps1. Ainsi, pour charger LibraryRegistry.ps1 dans une session PowerShell, saisissez la commande suivante :
PS C:\> . "D:\Scripts\LibraryRegistry.ps1"
Cependant, cette procdure de chargement dun script chaque fois que nous voulons utiliser lune de ses fonctions est vite fastidieuse. Lorsquun chier de script est charg avec la commande point, son contenu est plac dans la porte globale de la session PowerShell en cours. Tout ce qui se trouve dans la porte globale disparat si nous fermons cette session et en ouvrons une nouvelle, et nous devons recharger le chier de script chaque nouvelle session.
Chapitre 7
PowerShell et le Registre
193
Pour viter ce problme, nous pouvons utiliser un prol PowerShell an de dnir la conguration de la console PowerShell. Grce un prol comme Prole.ps1 et en utilisant la commande point dans ce prol, nous pouvons charger des chiers de script dans la porte globale chaque fois que nous dmarrons une nouvelle session de console. Voici un exemple de chier Prole.ps1 :
. "D:\Scripts\LibraryRegistry.ps1"
set-location C:\ cls # Message de bienvenue. Bienvenue dans votre session PowerShell : " + $ENV:UserName
INFO
LibraryRegistry.ps1 peut galement tre lu par la commande point dans un chier de script. Dans ce cas, PowerShell charge le chier dans la porte du script appelant. Noubliez pas que la porte parente dun script peut tre une session PowerShell ou un autre script.
Une fois le prol Prole.ps1 personnalis charg dans la session, linvite de console ressemble la suivante :
Bienvenue dans votre session PowerShell : script_master_snover PS C:\>
En rcuprant les informations fournies par lobjet PSDrive Function, comme le montre lexemple suivant, nous pouvons dterminer si les fonctions du Registre dnies dans LibraryRegistry.ps1 ont t charges dans la session PowerShell en cours :
PS C:\> get-childitem Function: CommandType ----------Function Function Function Name ---prompt TabExpansion Clear-Host Denition ---------PS + $(Get-Location) + $(... ... $spaceType = [System.Managem...
194
Partie 2
Function Function Function Function Function Function Function Function ... Function Function Function Function Function Function Function Function Function
param([string[]]$paths); if... param([string]$Name,[string[... param([string]$Name,[string[... param([string[]]$paths); New... param([string[]]$paths); New... Set-Location A: Set-Location B: Set-Location C:
PS C:\>
Lexemple prcdent montre que nos cinq fonctions de manipulation du Registre peuvent tre employes dans la session PowerShell en cours. Nous allons prsent les examiner. La fonction Get-RegValue :
#------------------------------------------------# Get-RegValue #------------------------------------------------# Usage : Lire une valeur dans la ruche HKLM, sur une machine locale # ou distante. # $Computer : Nom de lordinateur. # $KeyPath : Chemin de la cl du registre # ("SYSTEM\CurrentControlSet\Control"). # $ValueName : Nom de la valeur ("CurrentUser"). # $Type : Type de la valeur ("BIN", "DWORD", "EXP", "MULTI" ou "STR"). function Get-RegValue{ param ($Computer, $KeyPath, $ValueName, $Type)
Chapitre 7
PowerShell et le Registre
195
$HKEY_LOCAL_MACHINE = 2147483650 trap{write-host "[ERREUR] $_" -Foregroundcolor Red; Continue} $Reg = get-wmiobject -Namespace Root\Default -computerName ` $Computer -List | where-object ` {$_.Name -eq "StdRegProv"} if ($Type -eq "BIN"){ return $Reg.GetBinaryValue($HKEY_LOCAL_MACHINE, $KeyPath, ` $ValueName) } elseif ($Type -eq "DWORD"){ return $Reg.GetDWORDValue($HKEY_LOCAL_MACHINE, $KeyPath, ` $ValueName) } elseif ($Type -eq "EXP"){ return $Reg.GetExpandedStringValue($HKEY_LOCAL_MACHINE, ` $KeyPath, $ValueName) } elseif ($Type -eq MULTI){ return $Reg.GetMultiStringValue($HKEY_LOCAL_MACHINE, ` $KeyPath, $ValueName) } elseif ($Type -eq STR){ return $Reg.GetStringValue($HKEY_LOCAL_MACHINE, ` $KeyPath, $ValueName) } }
La fonction Get-RegValue retrouve dans le Registre la valeur qui correspond aux valeurs nommes sous la ruche HKEY_LOCAL_MACHINE. Elle attend les paramtres suivants :
n $Computer.
Le nom ou ladresse IP de lordinateur dont nous voulons examiner le Registre ; "." dsigne la machine locale. Le chemin de la cl qui contient la valeur du Registre. Le nom de la valeur du Registre dont nous voulons obtenir les donnes.
n $KeyPath.
n $ValueName.
n $Type. Une chane qui reprsente le type de la valeur du Registre dont nous voulons obte-
nir les donnes, comme BIN (REG_BINARY), DWORD (REG_DWORD), EXP (REG_EXPAND_SZ), MULTI (REG_MULTI_SZ) et STR (REG_SZ).
196
Partie 2
La fonction Set-RegKey :
#------------------------------------------------# Set-RegKey #------------------------------------------------# Usage : Crer ou xer une cl dans la ruche HKLM sur une machine # locale ou distante. # $Computer : Nom de lordinateur. # $KeyPath : Chemin de la cl du registre # ("SYSTEM\CurrentControlSet\Control"). function Set-RegKey{ param ($Computer, $KeyPath) $HKEY_LOCAL_MACHINE = 2147483650 trap{write-host "[ERREUR] $_" -Foregroundcolor Red; Continue} $Reg = get-wmiobject -Namespace Root\Default -computerName ` $Computer -List | where-object ` {$_.Name -eq "StdRegProv"} return $Reg.CreateKey($HKEY_LOCAL_MACHINE, $KeyPath) }
La fonction Set-RegKey cre une cl du Registre dans la ruche attend les paramtres suivants :
m $Computer.
HKEY_LOCAL_MACHINE.
Elle
Le nom ou ladresse IP de lordinateur sur lequel nous voulons crer la cl ; "." dsigne la machine locale. Le chemin de la nouvelle cl du Registre.
m $KeyPath.
Chapitre 7
PowerShell et le Registre
197
La fonction Set-RegValue :
#------------------------------------------------# Set-RegValue #------------------------------------------------# Usage : Crer ou xer une valeur dans la ruche HKLM, sur une machine # locale ou distante. # $Computer : Nom de lordinateur. # $KeyPath : Chemin de la cl du registre # ("SYSTEM\CurrentControlSet\Control"). # $ValueName : Nom de la valeur ("CurrentUser"). # $Value : Nouvelle valeur ("valeur1", Array, Integer). # $Type : Type de la valeur ("BIN", "DWORD", "EXP", "MULTI" ou "STR"). function Set-RegValue{ param ($Computer, $KeyPath, $ValueName, $Value, $Type) $HKEY_LOCAL_MACHINE = 2147483650 trap{write-host "[ERREUR] $_" -Foregroundcolor Red; Continue} $Reg = get-wmiobject -Namespace Root\Default -computerName ` $Computer -List | where-object ` {$_.Name -eq "StdRegProv"} if ($Type -eq "BIN"){ return $Reg.SetBinaryValue($HKEY_LOCAL_MACHINE, $KeyPath, ` $ValueName, $Value) } elseif ($Type -eq "DWORD"){ return $Reg.SetDWORDValue($HKEY_LOCAL_MACHINE, $KeyPath, ` $ValueName, $Value) } elseif ($Type -eq "EXP"){ return $Reg.SetExpandedStringValue($HKEY_LOCAL_MACHINE, ` $KeyPath, $ValueName, $Value) } elseif ($Type -eq "MULTI"){ return $Reg.SetMultiStringValue($HKEY_LOCAL_MACHINE, ` $KeyPath, $ValueName, $Value) } elseif ($Type -eq "STR"){ return $Reg.SetStringValue($HKEY_LOCAL_MACHINE, ` $KeyPath, $ValueName, $Value) } }
198
Partie 2
La fonction Set-RegValue cre ou modie une valeur du Registre dans la ruche HKEY_LOCAL_ MACHINE. Elle attend les paramtres suivants :
n $Computer. Le nom ou ladresse IP de lordinateur sur lequel nous voulons crer ou modi-
Le chemin de la cl qui contient la valeur du Registre. Le nom de la valeur du Registre que nous voulons crer ou modier.
n $ValueName. n $Value.
n $Type. Une chane qui reprsente le type de la valeur du Registre dont nous voulons obte-
nir les donnes, comme BIN (REG_BINARY), DWORD (REG_DWORD), EXP (REG_EXPAND_SZ), MULTI (REG_MULTI_SZ) et STR (REG_SZ). Voici comment utiliser cette fonction :
PS C:\> $Multi = "PowerShell", "est", "super ! PS C:\> set-regvalue Arus SOFTWARE\Voltron Lion_Statement $Multi MULTI
La fonction Remove-RegKey :
#------------------------------------------------# Remove-RegKey #------------------------------------------------# Usage : Supprimer une cl dans la ruche HKLM, sur une machine # locale ou distante. # $Computer : Nom de lordinateur. # $KeyPath : Chemin de la cl du registre # ("SYSTEM\CurrentControlSet\Control"). function Remove-RegKey{ param ($Computer, $KeyPath) $HKEY_LOCAL_MACHINE = 2147483650 trap{write-host "[ERREUR] $_" -Foregroundcolor Red; Continue} $Reg = get-wmiobject -Namespace Root\Default -computerName ` $Computer -List | where-object ` {$_.Name -eq "StdRegProv"} return $Reg.DeleteKey($HKEY_LOCAL_MACHINE, $KeyPath) }
Chapitre 7
PowerShell et le Registre
199
La fonction Remove-RegKey supprime une cl du Registre dans la ruche HKEY_LOCAL_MACHINE. Elle attend les paramtres suivants :
m $Computer.
Le nom ou ladresse IP de lordinateur sur lequel nous voulons supprimer la cl ; "." dsigne la machine locale. Le chemin de la cl du Registre supprimer.
m $KeyPath.
La fonction Remove-RegValue :
#------------------------------------------------# Remove-RegValue #------------------------------------------------# Usage : Supprimer une valeur dans la ruche HKLM, sur une machine # locale ou distante. # $Computer : Nom de lordinateur. # $KeyPath : Chemin de la cl du registre # ("SYSTEM\CurrentControlSet\Control"). # $ValueName : Nom de la valeur ("CurrentUser"). function Remove-RegValue{ param ($Computer, $KeyPath, $ValueName) $HKEY_LOCAL_MACHINE = 2147483650 trap{write-host "[ERREUR] $_" -Foregroundcolor Red; Continue} $Reg = get-wmiobject -Namespace Root\Default -computerName ` $Computer -List | where-object ` {$_.Name -eq "StdRegProv"} return $Reg.DeleteValue($HKEY_LOCAL_MACHINE, $KeyPath, $ValueName) }
La fonction Remove-RegValue supprime une valeur du Registre dans la ruche MACHINE. Elle attend les paramtres suivants : valeur du Registre ; "." dsigne la machine locale.
m $KeyPath.
HKEY_LOCAL_
m $Computer. Le nom ou ladresse IP de lordinateur sur lequel nous voulons supprimer une
Le chemin de la cl qui contient la valeur du Registre. Le nom de la valeur du Registre que nous voulons supprimer.
m $ValueName.
200
Partie 2
Utiliser la bibliothque
prsent que les fonctions de manipulation du Registre dveloppes dans le script LibraryRegistry.ps1 sont parfaitement comprises, nous pouvons les employer dans diffrentes situations. La premire tape consiste crer une cl de Registre nomme Turtle_ Worm sous la cl HKLM\Software sur un contrleur de domaine Active Directory appel DC1. Pour cela, saisissons la commande suivante :
PS C:\> set-regkey "DC1" "SOFTWARE\Turtle_Worm"
__GENUS __CLASS __SUPERCLASS __DYNASTY __RELPATH __PROPERTY_COUNT __DERIVATION __SERVER __NAMESPACE __PATH ReturnValue
: : : : : : : : : : :
2 __PARAMETERS __PARAMETERS 1 {}
PS C:\>
La commande retourne un objet WMI qui ne contient aucune information. Si une erreur se produit, le gestionnaire dni dans la fonction afche les informations concernant cette erreur, par exemple :
PS C:\> set-regkey "Pinky" "SOFTWARE\Turtle_Worm" [ERREUR] Le serveur RPC nest pas disponible. (Exception de HRESULT: 0x800706BA) PS C:\>
Chapitre 7
PowerShell et le Registre
201
Ensuite, nous invoquons les commandes suivantes pour crer des valeurs dans la cl de Registre Turtle_Worm :
PS C:\> $Bin = 101, 118, 105, 108, 95, 116, 117, 114, 116, 108, 101 PS C:\> set-regvalue DC1 SOFTWARE\Turtle_Worm binValue $Bin BIN
__GENUS __CLASS __SUPERCLASS __DYNASTY __RELPATH __PROPERTY_COUNT __DERIVATION __SERVER __NAMESPACE __PATH ReturnValue
: : : : : : : : : : :
2 __PARAMETERS __PARAMETERS 1 {}
PS C:\> $Null = set-regvalue DC1 SOFTWARE\Turtle_Worm PS C:\> $Null = set-regvalue DC1 SOFTWARE\Turtle_Worm system32\Turtle_Hacker.dll EXP PS C:\> $Multi = PowerShell, est, super ! PS C:\> $Null = set-regvalue DC1 SOFTWARE\Turtle_Worm MULTI PS C:\> $Null = set-regvalue DC1 SOFTWARE\Turtle_Worm modication du Registre !" "STR" PS C:\>
Ces tapes illustrent la cration dune cl du registre et de ses valeurs. Ensuite, nous utilisons les fonctions de notre bibliothque pour dterminer si certaines valeurs existent. Pour cela, nous invoquons la fonction Get-RegValue :
PS C:\> get-regvalue "DC1" "SOFTWARE\Turtle_Worm" "binValue" "BIN"
: 2 : __PARAMETERS : : __PARAMETERS :
202
Partie 2
: : : : : : :
2 {}
__GENUS __CLASS __SUPERCLASS __DYNASTY __RELPATH __PROPERTY_COUNT __DERIVATION __SERVER __NAMESPACE __PATH ReturnValue uValue
: : : : : : : : : : : :
2 __PARAMETERS __PARAMETERS 2 {}
0 1
__GENUS __CLASS __SUPERCLASS __DYNASTY __RELPATH __PROPERTY_COUNT __DERIVATION __SERVER __NAMESPACE __PATH ReturnValue sValue
: : : : : : : : : : : :
2 __PARAMETERS __PARAMETERS 2 {}
0 C:\WINDOWS\system32\Turtle_Hacker.dll
Chapitre 7
PowerShell et le Registre
203
__GENUS __CLASS __SUPERCLASS __DYNASTY __RELPATH __PROPERTY_COUNT __DERIVATION __SERVER __NAMESPACE __PATH ReturnValue sValue
: : : : : : : : : : : :
2 __PARAMETERS __PARAMETERS 2 {}
__GENUS __CLASS __SUPERCLASS __DYNASTY __RELPATH __PROPERTY_COUNT __DERIVATION __SERVER __NAMESPACE __PATH ReturnValue sValue
: : : : : : : : : : : :
2 __PARAMETERS __PARAMETERS 2 {}
PS C:\>
204
Partie 2
Comme vous pouvez le constater avec lobjet WMI retourn, si une valeur existe, ces informations sont donnes dans une proprit sValue ou uValue. Si la valeur ou la cl nexiste pas, la proprit ReturnValue a la valeur entire 2. Si cette proprit est gale 0, cela signie que la mthode WMI sest parfaitement excute. Nous avons vri que les valeurs existent sous la cl du registre Turtle_Worm sur la machine DC1. Il est temps prsent de supprimer cette cl et ses valeurs. Deux mthodes permettent deffectuer cette tche. Nous pouvons supprimer chaque valeur en utilisant Remove-RegValue :
PS C:\> remove-regvalue "DC1" "SOFTWARE\Turtle_Worm" "binValue"
__GENUS __CLASS __SUPERCLASS __DYNASTY __RELPATH __PROPERTY_COUNT __DERIVATION __SERVER __NAMESPACE __PATH ReturnValue
: : : : : : : : : : :
2 __PARAMETERS __PARAMETERS 1 {}
PS C:\>
Mais nous pouvons galement invoquer Remove-RegKey pour supprimer la cl Turtle_Worm et, par voie de consquence, toutes ses sous-cls et leurs valeurs :
PS C:\> remove-regkey "DC1" "SOFTWARE\Turtle_Worm"
: : : : : : : :
2 __PARAMETERS __PARAMETERS 1 {}
Chapitre 7
PowerShell et le Registre
205
: : : 0
PS C:\>
En rsum
Ce chapitre sest focalis sur la gestion du Registre de Windows par le biais de lutilisation de WSH et PowerShell. Bien que ces deux interfaces de script fournissent des mthodes de gestion du Registre, la version PowerShell est plus robuste car elle considre le Registre comme un magasin de donnes hirarchique. Cependant, limplmentation actuelle a pour inconvnient de ne proposer aucune mthode de gestion du Registre sur une machine distante (cest galement le cas de WSH). Pour contourner ce problme, nous avons combin PowerShell et WMI an daccder au Registre dune machine distante. Grce WMI et PowerShell, vous pourrez accomplir nimporte quelle tche dautomation du Registre qui se prsentera vous. Nous avons galement abord la rutilisation du code et les chiers de bibliothque. Comme nous lavons expliqu au Chapitre 5, "Suivre les bonnes pratiques", la rutilisation du code est une pratique trs importante qui permet de rduire le temps de dveloppement dun script. Ce chapitre a dvelopp ce thme en montrant comment placer du code rutilisable, issu dun exemple rel, dans un chier de bibliothque.
8
PowerShell et WMI
Dans ce chapitre
m m m
Introduction Comparer l'utilisation de WMI dans WSH et dans PowerShell De VBScript PowerShell
Introduction
Ce chapitre explique comment utiliser PowerShell pour la gestion des systmes laide de WMI (Windows Management Instrumentation) et compare les mthodes employes par WSH (Windows Script Host) et PowerShell pour mener bien des tches WMI. Nous examinons galement quelques scripts qui utilisent WSH pour raliser certaines tches WMI, puis avec PowerShell. Enn, nous prsentons la conversion dun script VBScript en PowerShell an de mettre en uvre une tche dautomation fonde sur WMI. Lobjectif est de donner au lecteur la possibilit dappliquer les techniques de scripts PowerShell des besoins dautomation rels.
208
Partie 2
Il existe deux mthodes pour se connecter un objet WMI. La premire consiste crer un objet SWbemServices laide de la mthode CreateObject() correspondante, puis se connecter lobjet WMI en prcisant son chemin. Cependant, dans notre description, nous nous limitons la seconde mthode. Elle sappuie sur le moniker "winmgmts:" (mcanisme COM standard pour encapsuler lemplacement et la liaison avec un autre objet COM). Ces deux mthodes sont similaires, mais la premire est souvent choisie pour des raisons lies la gestion des erreurs et de lauthentication, tandis que la seconde est prfre pour des raisons pratiques car une seule instruction permet dtablir une connexion.
Si nous enregistrons ce script dans le chier ObtenirMemoire.vbs et lexcutons avec cscript, nous obtenons les rsultats suivants :
C:\>cscript ObtenirMemoire.vbs Microsoft (R) Windows Script Host Version 5.6 Copyright (C) Microsoft Corporation 1996-2001. Tous droits rservs. Taille de la mmoire RAM : 774 Mo C:\>
Chapitre 8
PowerShell et WMI
209
Les sections suivantes reviennent pas pas sur ce script et expliquent comment il obtient des informations concernant la mmoire installe sur la machine Jupiter.
tape 1
Tout dabord, nous nous connectons lobjet de service WMI dans lespace de noms root\ cimv2 sur la machine Jupiter :
Set objWMIService = GetObject("winmgmts:\\" & strComputerName _ & \root\cimv2)
tape 2
Ensuite, nous invoquons la mthode ExecQuery() de lobjet de service WMI en utilisant WQL (WMI Query Language) pour crer un objet li une instance de la classe Win32_ ComputerSytem :
Set colItems = objWMIService.ExecQuery _ ("Select * from Win32_ComputerSystem")
tape 3
Enn, laide de la variable colItems et dune boucle for, nous parcourons la nouvelle collection dobjets cre et obtenons les informations recherches partir de la proprit TotalPhysicalMemory. Nous mettons en forme la valeur numrique en appelant la fonction FormatNumber, puis nous afchons le rsultat (en mgaoctets) sur la console :
For Each objItem in colItems WScript.Echo Taille de la mmoire RAM : " _ & FormatNumber((objItem.TotalPhysicalMemory \ 1024) _ \ 1000, 0, 0, 0, -1) & " Mo" Next
210
Partie 2
La premire mthode, cest--dire les espaces de noms System.Management et System. Management.Instrumentation, nest pas dcrite ici car elle nest pas aussi simple que les deux autres. Elle doit servir de solution de repli lorsque PowerShell nencapsule pas correctement un objet dans un objet PSObject ncessaire aux deux autres mthodes. La deuxime mthode, lapplet de commande Get-WmiObject, obtient des objets WMI et runit des informations propos des classes WMI. Cette applet est relativement simple. Par exemple, pour obtenir une instance locale de la classe Win32_ComputerSystem, il suft dindiquer son nom :
PS C:\> get-wmiobject "Win32_ComputerSystem" Domain Manufacturer Model Name PrimaryOwnerName TotalPhysicalMemory : : : : : : companyabc.com Hewlett-Packard Pavilion dv8000 (ES184AV) Wii Damon Cortesi 2145566720
PS C:\>
Lexemple suivant, qui est plus robuste, se connecte la machine distante Jupiter et obtient une instance de la classe Win32_Service dont le nom dinstance est Virtual Server. Le rsultat est un objet contenant des informations propos du service Virtual Server sur Jupiter :
PS C:\> get-wmiobject -class "Win32_Service" -computerName "Jupiter" -lter "Name=Virtual Server"
: : : : : :
PS C:\>
Chapitre 8
PowerShell et WMI
211
La commande suivante retourne les mmes informations, mais partir dune requte WQL :
PS C:\> get-wmiobject -computerName "Jupiter" -query "Select * From Win32_ Service Where Name=Virtual Server"
: : : : : :
PS C:\>
Enn, voici comment employer Get-WmiObject pour obtenir des informations propos dune classe WMI :
PS C:\> get-wmiobject -namespace "root/cimv2" -list | where {$_.Name -eq "Win32_Product"} | format-list *
Name __GENUS __CLASS __SUPERCLASS __DYNASTY __RELPATH __PROPERTY_COUNT __DERIVATION __SERVER __NAMESPACE __PATH
: : : : : : : : : : :
PS C:\>
Mme si lutilisation de Get-WmiObject reste simple, il est souvent ncessaire de saisir une longue chane de commande. Cet inconvnient nous amne la troisime mthode, les types WMI abrgs. La section suivante prsente les abrviations de types et lutilisation des types WMI abrgs de PowerShell.
212
Partie 2
Abrviations de types
Nous avons dj employ les abrviations de types au cours des chapitres prcdents, mais elles nont pas encore t vritablement expliques. Une abrviation de type nest rien dautre quun alias permettant dindiquer un type .NET. Sans les abrviations de types, la dnition du type dune variable impose la saisie du nom de classe complet :
PS C:\> $Utilisateur = [System.DirectoryServices.DirectoryEntry]"LDAP:// CN=Fujio Saitoh,OU=Accounts,OU=Managed Objects,DC=companyabc,DC=com" PS C:\> $Utilisateur distinguishedName ----------------{CN=Fujio Saitoh,OU=Accounts,OU=Managed Objects,DC=companyabc,DC=com}
PS C:\>
Au lieu de saisir lintgralit de ce nom, nous pouvons simplement employer le type abrg [ADSI] pour dnir le type de la variable :
PS C:\> $Utilisateur = [ADSI]"LDAP://CN=Fujio Saitoh,OU=Accounts,OU=Managed Objects,DC=companyabc,DC=com" PS C:\> $Utilisateur distinguishedName ----------------{CN=Fujio Saitoh,OU=Accounts,OU=Managed Objects,DC=companyabc,DC=com}
PS C:\>
Lquipe de dveloppement de PowerShell a inclus les abrviations de types principalement pour rduire la saisie ncessaire la dnition dun type dobjet. Cependant, les types abrgs ne sont pas dcrits dans la documentation de PowerShell, mme si on retrouve des rfrences [WMI], [ADSI] et dautres sur de nombreux blogs. Malgr leur absence dans la documentation, labrviation de types est une caractristique plutt utile de PowerShell. Le Tableau 8.1 donne la liste des types abrgs les plus employs.
Chapitre 8
PowerShell et WMI
213
Type
typeof(int) typeof(int[]) typeof(long) typeof(long[]) typeof(string) typeof(string[]) typeof(char) typeof(char[]) typeof(bool) typeof(bool[]) typeof(byte) typeof(double) typeof(decimal) typeof(oat) typeof(oat) typeof(System.Text.RegularExpressions.Regex) typeof(System.Array) typeof(System.Xml.XmlDocument) typeof(System.Management.Automation.ScriptBlock) typeof(System.Management.Automation.SwitchParameter) typeof(System.Collections.Hashtable) typeof(System.Type) typeof(System.Management.Automation.PSReference) typeof(System.Management.Automation.PSObject) typeof(System.Management.ManagementObject) typeof(System.Management.ManagementObjectSearcher) typeof(System.Management.ManagementClass) typeof(System.DirectoryServices.DirectoryEntry)
214
Partie 2
Les sections suivantes expliquent comment utiliser les types WMI abrgs de PowerShell.
Le type abrg [WMI]
Ce type abrg pour la classe ManagementObject prend un chemin dobjet WMI sous forme dune chane et obtient un objet WMI li une instance de la classe WMI indique :
PS C:\> $InfoOrdi = [WMI]"\\.\root\cimv2:Win32_ComputerSystem.Name=PLANX" PS C:\> $InfoOrdi
: : : : : :
PS C:\>
INFO Pour tablir une liaison directement un objet WMI, vous devez inclure la proprit cl dans le chemin de lobjet WMI. lexemple prcdent, la proprit cl est Name.
Ce type abrg pour la classe ManagementClass prend un chemin dobjet WMI sous forme dune chane et obtient un objet WMI li la classe WMI indique :
PS C:\> $ClasseOrdi = [WMICLASS]"\\.\root\cimv2:Win32_ComputerSystem" PS C:\> $ClasseOrdi
: Win32_ComputerSystem : 1 : Win32_ComputerSystem
Chapitre 8
PowerShell et WMI
215
: : : : :
CIM_UnitaryComputerSystem CIM_ManagedSystemElement Win32_ComputerSystem 54 {CIM_UnitaryComputerSystem, CIM_ComputerSystem, CIM_System, CIM_LogicalElement...} : PLANX : ROOT\cimv2 : \\PLANX\ROOT\cimv2:Win32_ComputerSystem
PS C:\>
Ce type abrg pour la classe ManagementObjectSearcher prend une chane WQL et cre un objet de recherches WMI. Ensuite, nous pouvons appeler la mthode Get() pour obtenir un objet WMI li une instance de la classe WMI indique :
PS C:\> $ClasseOrdi = [WMISearcher]"Select * From Win32_ComputerSystem" PS C:\> $ClasseOrdi.Get()
: : : : : :
PS C:\
De VBScript PowerShell
Cette section dtaille la conversion dun script VBScript en son quivalent PowerShell. Ce script est utilis pour surveiller des machines virtuelles sur un hte Microsoft Virtual Server 2005. Avant le dveloppement de ce script, la socit companyabc.com tait en cours de remplacement de la plupart de ses serveurs dapplications matriels par des machines virtuelles.
216
Partie 2
Ce basculement devait galement inclure une mthode simple mais efcace pour surveiller les machines virtuelles hberges par chaque Microsoft Virtual Server. Cependant, une plateforme de surveillance relle, comme MOM (Microsoft Operations Manager), ntait pas en place. Le service informatique a suggr de dvelopper un script dautomation qui remplirait les besoins de supervision court terme de lentreprise, et cest ce qui a t ralis.
Le script MonitorMSVS.wsf
MonitorMSVS.wsf
est un chier VBScript dvelopp pour rpondre aux besoins de companyabc.com quant la surveillance dune machine virtuelle. Vous le trouverez dans le dossier Scripts\Chapitre 8\MonitorMSVS et vous pouvez le tlcharger depuis le site www.pearsoneducation.fr. Pour lexcuter, il faut dnir le paramtre servername, dont largument indique le nom du systme Virtual Server qui hberge les machines virtuelles superviser. Voici la commande qui permet dexcuter MonitorMSVS.wsf, dont la sortie est illustre la Figure 8.1 :
D:\Scripts>cscript MonitorMSVS.wsf /servername:vsserver01
Figure 8.1
Excution du script MonitorMSVS.wsf.
Chapitre 8
PowerShell et WMI
217
Voici la suite des oprations ralises par MonitorMSVS.wsf : 1. Le script envoie un ping vers le MSVS (Microsoft Virtual Server) indiqu an de vrier que le serveur est oprationnel. 2. Puis, il se connecte lhte MSVS en utilisant une chane de moniker et, par consquent, en crant un objet de service WMI. 3. Ensuite, il invoque la mthode ExecQuery() de lobjet de service WMI, en lui passant une requte WQL qui demande une collection dinstances de la classe VirtualMachine. 4. Enn, pour chaque machine virtuelle active (prsente dans la collection), le script crit sur la console les valeurs actuelles des proprits Uptime, CpuUtilization, PhysicalMemoryAllocated et DiskSpaceUsed. Le premier extrait de code est constitu des lments XML initiaux pour un chier WSF. Ils dnissent les paramtres accepts, dcrivent le script, donnent des exemples de fonctionnement du script et prcisent le langage employ :
<?xml version="1.0" encoding="ISO-8859-1"?> <package> <job id="MonitorMSVS"> <runtime> <description> ************************************************************ Ce script permet de surveiller Microsoft Virtual Server 2005. ************************************************************ </description> <named name=servername helpstring=Nom de lhte MSVS surveiller." type="string" required="1" /> <example> Exemple : cscript MonitorMSVS.wsf /servername:"vms01.companyabc.com" </example> </runtime> <script language="VBScript"> <![CDATA[
Le script vrie ensuite si un argument a t dni pour le paramtre obligatoire servername. Si ce nest pas le cas, il afche les informations dutilisation (dnies dans le code prcdent)
218
Partie 2
sur la console et se termine. Lorsque largument est prcis, le script congure son environnement en dnissant les variables utilises par la suite :
On Error Resume Next =================================================================== Vrier les arguments obligatoires. =================================================================== If WScript.Arguments.Named.Exists("servername") = FALSE Then WScript.Arguments.ShowUsage() WScript.Quit End If =================================================================== Dnir lenvironnement de travail. =================================================================== Dim StdOut Dim strServerName Set StdOut = WScript.StdOut strServerName = WScript.Arguments.Named("servername")
Le prochain extrait montre le dbut du code dautomation. Tout dabord, le script afche son en-tte sur la console, puis vrie que lhte MSVS indiqu par servername est oprationnel. Pour cela, il tente de le contacter laide de la fonction Ping. Si lhte MSVS fonctionne parfaitement, le script se poursuit. Sinon, il sarrte et le message dtat adquat est afch loprateur :
=================================================================== Commencer le travail. =================================================================== Mess "########################################" Mess "# MonitorMSVS #" Mess ######################################## Mess vbNullString StatStart Vrication du fonctionnement du MSVS"
Chapitre 8
PowerShell et WMI
219
If Ping(strServerName) = 0 Then StdOut.Write(vbTab & vbTab) StdOut.WriteLine("[HORS LIGNE]") WScript.Quit() Else StdOut.Write(vbTab & vbTab) StdOut.WriteLine([EN LIGNE]) End If
Ltape suivante consiste tablir une connexion avec lhte MSVS en utilisant WMI et obtenir des informations de performance sur ses machines virtuelles. Une fois cela fait, les informations doivent tre converties en un format lisible avant dtre afches sur la console :
------------------- Obtenir les donnes concernant les machines virtuelles. -------------------StatStart "Obtention des donnes des machines virtuelles" Set objWMIService = GetObject("winmgmts:\\" & strServerName _ & "\root\vm\virtualserver") Set colItems = objWMIService.ExecQuery("SELECT * FROM VirtualMachine") Xerror StatDone StdOut.WriteLine(vbNullString) Afchage de len-tte. StdOut.WriteLine("[Name] [Uptime] [CPU] [Memory] [Disk]") For Each objItem In colItems StdOut.Write(objItem.Name & vbTab) StdOut.Write(FormatNumber(objItem.Uptime / 60, 0, 0, 0, -1) & vbTab) StdOut.Write(FormatNumber(objItem.CpuUtilization, 0) & vbTab) StdOut.Write(FormatNumber((objItem.PhysicalMemoryAllocated _ / 1024) / 1000, 0, 0, 0, -1) & vbTab) StdOut.Write(FormatNumber((objItem.DiskSpaceUsed / 1024) _ / 1000, 0, 0, 0, -1)) StdOut.WriteLine(vbNullString) Next
220
Partie 2
Pour que les valeurs donnes par les proprits Uptime, CpuUtilization, PhysicalMemoryAllocated et DiskSpaceUsed soient plus lisibles, le script invoque la fonction FormatNumber. Elle dtermine la mise en forme dune valeur numrique et permet de prciser les paramtres suivants :
n n n n
nombre de chiffres afchs aprs la virgule ; afcher ou non un 0 initial pour les valeurs fractionnaires ; entourer ou non les valeurs ngatives par des parenthses ; regrouper ou non les nombres en utilisant le sparateur des milliers dni dans le Panneau de conguration.
utilise la fonction FormatNumber de manire formater les valeurs numriques sans chiffres aprs la virgule et avec le sparateur des milliers qui correspond aux paramtres rgionaux de la machine. Enn, ces valeurs sont converties en units plus reprsentatives :
MonitorMSVS.wsf n Uptime,
initialement en secondes, est afch en minutes. nest plus en octets mais en mgaoctets.
n PhysicalMemoryAllocated n DiskSpaceUsed
Lextrait de code suivant est constitu des procdures utilises tout au long du script :
=================================================================== Procdures. =================================================================== ------------------- Procdure gnrale pour les messages. -------------------Sub Mess(Message) crire sur la console. StdOut.WriteLine(Message) End Sub ------------------- Procdure gnrale pour le dbut dun message. -------------------Sub StatStart(Message) crire sur la console. StdOut.Write(Message) End Sub
Chapitre 8
PowerShell et WMI
221
------------------- Procdure gnrale pour la n dun message. -------------------Sub StatDone crire sur la console. StdOut.Write(vbTab & vbTab) StdOut.WriteLine("[OK]") End Sub ------------------- Procdure gnrale pour Xerror. -------------------Sub Xerror If Err.Number <> 0 Then crire sur la console. StdOut.WriteLine(" Erreur fatale : " & CStr(Err.Number) _ & " " & Err.Description) WScript.Quit() End If End Sub
Le script MonitorMSVS.wsf doit sassurer que lhte MSVS est oprationnel avant de pouvoir continuer. Ce contrle est effectu laide dun ping ICMP :
=================================================================== Fonctions. =================================================================== ------------------- Envoyer un ping une machine. ------------------- Cette fonction teste si une machine est connecte au rseau. Function Ping(Machine) On Error Resume Next Set colItems = GetObject("winmgmts:{impersonationLevel=impersonate}")._ ExecQuery("select * from Win32_PingStatus where address = "_ & Machine & "") For Each colItem in colItems If IsNull(colItem.StatusCode) or colItem.StatusCode <> 0 Then
222
Partie 2
Pour mettre en uvre le ping ICMP, le script utilise une fonction nomme, fort propos, Ping. Elle ralise la squence doprations suivante : 1. La fonction Ping appelle la mthode ExecQuery() de lobjet de service WMI. 2. Elle passe ExecQuery() une requte WQL qui demande toutes les proprits de linstance de la classe Win32_PingStatus. Ladresse indique est celle de lhte que nous tentons de contacter. 3. La collection dinstances obtenue (dans ce cas, une seule instance, qui nest quun objet) est affecte la variable colItems. 4. Le rsultat du ping est pris dans colItems et retourn au script an que celui-ci dtermine sil peut ou non poursuivre son excution. Grce au ping ICMP, nous diminuons le temps demand par le script pour chouer si le serveur interrog ntait pas capable de rpondre. Cette gestion labore des erreurs permet de prvoir lchec du script et inclut une logique qui empche cet chec. De plus, nous utilisons une mthode WMI la place de ping.exe car les rsultats retourns par WMI sont plus faciles manipuler que ceux de cette commande. Le dernier exemple de code est constitu des lments XML qui terminent le script :
]]> </script> </job> </package>
Le script MonitorMSVS.ps1
MonitorMSVS.ps1 est la version PowerShell du script MonitorMSVS.wsf. Vous le trouverez dans
le dossier Scripts\Chapitre 8\MonitorMSVS et en tlchargement sur le site www.pearsoneducation.fr. Pour lexcuter, il faut dnir le paramtre ServerName, dont largument doit tre le nom du systme Virtual Server qui hberge les machines virtuelles surveiller.
Chapitre 8
PowerShell et WMI
223
Voici la commande qui permet de lancer MonitorMSVS.ps1, ainsi quun exemple de sortie la Figure 8.2 :
PS D:\Scripts> .\MonitorMSVS.ps1 -ServerName Jupiter
Figure 8.2
Excution du script MonitorMSVS.ps1.
INFO Dans la commande dexcution du script MonitorMSVS.ps1, le nom du paramtre ServerName est indiqu dans la chane de commande, contrairement lexemple du Chapitre 6, "PowerShell et le systme de chiers". Dans PowerShell, vous pouvez passer le nom complet ou partiel des paramtres :
\MonitorMSVS.ps1 -S Jupiter
Si les arguments sont dnis dans lordre exact des paramtres du script, il nest pas ncessaire de les indiquer sur la ligne dexcution du script :
\MonitorMSVS.ps1 Jupiter
224
Partie 2
Voici les oprations effectues par le script MonitorMSVS.ps1 : 1. Le script envoie un ping vers le MSVS (Microsoft Virtual Server) indiqu an de vrier que le serveur est oprationnel. 2. Puis, il se connecte au site Web dadministration de MSVS an dobtenir une liste des machines virtuelles hberges par cet hte. Cette liste est place dans la variable $Servers. 3. Il utilise lapplet de commande Get-WmiObject pour obtenir une collection dinstances de la classe VirtualMachine, quil place dans la variable $VirtualMachines. 4. Pour chaque objet de machine virtuelle prsent dans la variable $Servers, il ajoute ltat actuel de la machine virtuelle comme membre de cet objet. Si la machine virtuelle est active (prsente dans la collection $VirtualMachines), le script ajoute galement les valeurs des proprits Uptime, CpuUtilization, PhysicalMemoryAllocated et DiskSpaceUsed comme membres de lobjet de machine virtuelle. 5. Enn, il afche les informations sur la console de PowerShell en utilisant lapplet de commande Format-Table. Le premier extrait de code contient len-tte du script MonitorMSVS.ps1. Il fournit des informations sur le rle du script, sa date de dernire mise jour et son auteur. Juste aprs lentte, nous trouvons lunique paramtre du script ($ServerName) :
################################################## # MonitorMSVS.ps1 # Ce script surveille Microsoft Virtual Server 2005. # # Cr le : 01/12/2006 # Auteur : Tyson Kopczynski ################################################## param([string] $ServerName = $(throw write-host ` Veuillez indiquer le nom de lhte MSVS surveiller !" ` -Foregroundcolor Red))
Le code suivant contient le dbut de la partie automation du script. Tout dabord, la variable $URL se voit affecter lURL du site Web dadministration de Virtual Server pour lhte MSVS. Ensuite, comme le script MonitorMSVS.wsf, MonitorMSVS.ps1 se sert dun ping ICMP pour vrier que lhte MSVS est oprationnel. Cependant, il utilise pour cela la classe .NET Net. NetworkInformation.Ping la place de WMI. Dautres mthodes, y compris ping.exe,
Chapitre 8
PowerShell et WMI
225
auraient pu tre choisies, mais la classe Net.NetworkInformation.Ping demande moins de travail et de code. Quelle que soit la mthode retenue, limportant est de prvoir les possibilits dchec du script et de grer correctement les erreurs :
################################################## # Code principal. ################################################## $URL = "http://$($ServerName):1024/VirtualServer/VSWebApp.exe?view=1" #-------------------# Dbut du script. #-------------------write-host "----------------------------------------" write-host "MonitorMSVS -" write-host "----------------------------------------" write-host write-host Vrication du fonctionnement du MSVS" -NoNewLine .{ trap{write-host `t "[ERREUR]" -Foregroundcolor Red; throw write-host $_ -Foregroundcolor Red; Break} $Ping = new-object Net.NetworkInformation.Ping $Result = $Ping.Send($ServerName) if ($Result.Status -eq "Success"){ write-host `t "[EN LIGNE]" -Foregroundcolor Green } else{ write-host `t "[HORS LIGNE]" -Foregroundcolor Red write-host Break } }
Si lhte MSVS fonctionne parfaitement, le script afche "[EN LIGNE]" sur la console et poursuit son excution. En revanche, sil nest pas oprationnel, il afche "[HORS LIGNE]" et se termine.
226
Partie 2
Aprs la vrication du fonctionnement de lhte MSVS, ltape suivante consiste sy connecter et obtenir une liste des machines virtuelles quil hberge. Lextrait de code suivant ralise cette tche en amliorant la logique du script MonitorMSVS.wsf originel et en illustrant lune des possibilits les plus impressionnantes de PowerShell :
#-------------------# Obtenir la liste des machines virtuelles. #-------------------$Webclient = new-object Net.WebClient $Webclient.UseDefaultCredentials = $True write-host "Obtention des noms des machines virtuelles" -NoNewLine .{ trap{write-host `t "[ERREUR]" -Foregroundcolor Red; throw write-host $_ -Foregroundcolor Red; Break} $Data = $Webclient.DownloadString("$URL") write-host `t "[OK]" -Foregroundcolor Green } # Cette expression rgulire obtient une liste des entres de serveur # partir de donnes reues. $Servers = [Regex]::Matches($Data, (?<=&vm=)[^"\r\n]*(?=" )) # Les doublons sont nombreux et doivent donc tre regroups. # Par ailleurs, cela donne un meilleur nom la proprit. $Servers = $Servers | group Value | select Name
Le script MonitorMSVS.wsf prsente un inconvnient majeur : la requte WMI retourne des informations uniquement sur les machines virtuelles qui sont actives au moment de la demande. Si une machine virtuelle est arrte ce moment-l, il est impossible dafcher cet tat aux utilisateurs. Pourtant, disposer de la liste complte des machines virtuelles et de leur tat courant est une information utile pour un outil de surveillance. Pour accder ces informations, le script doit crer une liste de toutes les machines virtuelles prsentes sur lhte MSVS. Cette liste existe sur le site Web dadministration de Microsoft Virtual Server. Pour lobtenir, le script utilise la classe .NET Net.WebClient, grce laquelle il se connecte au site dadministration et tlcharge le contenu HTML depuis la page dtat principale.
Chapitre 8
PowerShell et WMI
227
INFO Puisque PowerShell est compatible avec .NET Framework, il peut accder aux services Web et sen servir comme source de donnes externe ou comme applications. Par exemple, PowerShell peut tre employ pour poster des billets sur des blogs ou lire leur contenu, pour vrier la disponibilit des consoles Wii sur amazon.fr ou pour effectuer dautres tches dautomation sappuyant sur des donnes ou des applications fournies par les services Web de votre entreprise. Les possibilits sont innies.
Dans le contenu HTML tlcharg, le nom de chaque machine virtuelle est rpt plusieurs fois. Pour construire la liste, le script se sert du type abrg des expressions rgulires, [Regex], an dextraire ces noms et de les placer dans la variable $Servers. La liste contient donc le nom de chaque machine virtuelle, mais rpt plusieurs fois. Pour ne garder quun exemplaire de chaque nom, le script invoque lapplet de commande Group-Object. La liste nale, qui contient les noms de toutes les machines virtuelles hberges par lhte MSVS indiqu, est raffecte la variable $Servers. Ensuite, le script rcupre les informations de performances des machines virtuelles partir dinstances de la classe WMI VirtualMachine obtenues laide de lapplet de commande Get-WmiOjbect. Dans ltape suivante, les deux jeux de donnes sont fusionns : les informations concernant les machines virtuelles ($VirtualMachines) et la liste des machines virtuelles ($Servers). Pour cela, le script prend chaque objet de machine virtuelle contenu dans la variable $Servers. Si le nom de la machine virtuelle se trouve dans les deux collections dobjets, lapplet de commande Add-Member est invoque an de complter lobjet de machine virtuelle courant avec les informations de performances donnes par la variable $VirtualMachines. Cette extension de lobjet inclut un indicateur dtat dactivit et les informations de proprits associes. Si la machine virtuelle est hors ligne (absente des deux collections), le script insre uniquement lindicateur dtat dinactivit. Le concept de modication dynamique dun objet a t prsent au Chapitre 3, "Prsentation avance de PowerShell", mais cet exemple illustre la puissance de cette caractristique dans un script dautomation.
228
Partie 2
Chapitre 8
PowerShell et WMI
229
La dernire tape consiste afcher les informations prsentes dans la variable $Servers sur la console PowerShell laide de lapplet de commande Format-Table. Cette applet permet dajouter des proprits calcules. Dans notre exemple, elle modie les tiquettes des proprits provenant de $Servers. Loprateur de format (-f) xe la mise en forme de ces proprits, comme le montre lextrait de code suivant :
INFO Pour plus dinformations sur loprateur -f, consultez la documentation de la mthode Format de la classe .NET System.String sur la page http://msdn2.microsoft.com/fr-fr/library/ system.string.format(VS.80).aspx.
$Servers | format-table Name, Status ` ,@{label=Uptime Mins; expression={{0:N0} -f $_.Uptime}} ` ,@{label="CPU %"; expression={$_.CPU}} ` ,@{label="Memory MB"; expression={"{0:N0}" -f $_.Memory}} ` ,@{label="Disk MB"; expression={"{0:N0}" -f $_.Disk}} ` -wrap
En rsum
Ce chapitre sest attach montrer lutilisation de WMI conjointement WSH et PowerShell pour raliser des tches dautomation. Les exemples et les scripts prsents ne sont en aucun cas les seules tches pouvant tre menes avec WMI. Par ailleurs, vous avez galement dcouvert la simplicit dutilisation de WMI avec PowerShell. Arm de ces connaissances, il vous sera assez difcile datteindre les limites des possibilits offertes par ces deux technologies. Lors de la prsentation des scripts dautomation oprationnels, une caractristique trs puissante de PowerShell a t dvoile. Comme nous lavons expliqu, la compatibilit de PowerShell avec .NET Framework lui permet dinteragir avec des services Web et den obtenir des donnes. Cette caractristique a t utilise dans MonitorMSVS.ps1 pour accder aux informations disponibles dans Microsoft Virtual Server, que la solution VBScript ne permettait dobtenir quavec grandes difcults. Nous ne rpterons jamais assez que lexemple de ce chapitre ne fait quaborder lensemble des possibilits offertes par cette caractristique.
9
PowerShell et Active Directory
Dans ce chapitre
m m m
Introduction Comparer l'utilisation dADSI dans WSH et dans PowerShell De VBScript PowerShell
Introduction
Ce chapitre prsente les interfaces des services Active Directory (ADSI, Active Directory Services Interfaces) et dcrit les mthodes WSH (Windows Script Host) et PowerShell pour les tches de gestion dActive Directory. Pour comprendre ces concepts, nous comparons des exemples fonds sur WSH et sur PowerShell. Enn, nous verrons la conversion VBScript vers PowerShell dun script qui utilise ADSI pour raliser une tche dautomation Active Directory. Lobjectif est de donner au lecteur la possibilit dappliquer les techniques de scripts PowerShell des besoins dautomation rels.
232
Partie 2
Pour utiliser ADSI dans vos scripts, vous devez comprendre quelques concepts essentiels. Premirement, ADSI est constitu dun ensemble de fournisseurs : LDAP (Lightweight Directory Access Protocol), NDS (Novell Directory Services), NWCOMPAT (Novell NetWare 3.x) et WinNT (Windows NT). Ces fournisseurs permettent aux programmes externes et aux scripts de grer diffrents annuaires rseau et rfrentiels de donnes, comme Active Directory, Novell NetWare 4.x NDS et NetWare 3.x Bindery, ainsi que toute infrastructure de service dannuaire compatible LDAP (LDAP V2 et ultrieure). Cependant, il est possible de dvelopper des fournisseurs ADSI supplmentaires an de prendre en charge dautres types de rfrentiels de donnes. Par exemple, Microsoft propose un fournisseur ADSI pour la gestion dIIS (Internet Information Services). Deuximement, un fournisseur ADSI implmente un groupe dobjets COM pour la gestion des annuaires rseau et des dpts de donnes. Par exemple, un administrateur peut se servir du fournisseur ADSI WinNT pour se lier aux ressources dun domaine Windows et les grer car il fournit des objets pour, entre autres, les utilisateurs, les ordinateurs, les groupes et les domaines. Les objets mis disposition par un fournisseur ADSI rsident gnralement dans la ressource grer. En accdant au fournisseur ADSI concern, un programme ou un script peut se lier un objet et ladministrer grce aux mthodes et proprits dnies pour cet objet. Troisimement, ADSI fournit une couche dabstraction pour que la gestion des objets puisse se faire au travers de diffrents services dannuaire et rfrentiels de donnes. Cette couche dattraction, appele interface IADs, dnit des proprits et des mthodes communes tous les objets ADSI. Par exemple, un objet ADSI auquel on a accd au travers de linterface IADs prsente les caractristiques suivantes :
n n n n
Un objet peut tre identi par un nom, une classe ou un ADsPath. Le conteneur d'un objet peut grer la cration et la suppression de cet objet. La dnition du schma dun objet peut tre obtenue. Les attributs d'un objet peuvent tre chargs dans le cache de proprits ADSI et les modications peuvent tre transmises la source de donnes originelles. Les attributs d'un objet chargs dans le cache de proprits ADSI peuvent tre modis.
Quatrimement, ADSI offre une interface supplmentaire (IADsContainer) pour les objets qui sont des conteneurs (comme les units dorganisation, ou UO). Lorsquelle est lie un objet conteneur, cette interface propose des mthodes communes pour crer, supprimer, dplacer, numrer et grer des objets enfants. Cinquimement, ADSI conserve un cache ct client des proprits pour chaque objet ADSI li ou cr. Ce cache local des informations dun objet amliore les performances de lecture et dcriture dans une source de donnes car un programme ou un script accde moins souvent
Chapitre 9
233
la source de donnes. Il est important de comprendre que les informations dobjet contenues dans le cache des proprits doivent tre transmises la source de donnes originelles. Si les modications dun objet ne sont pas valides, elles ne sont pas rpercutes dans la source de donnes dorigine. Aprs cette prsentation de linteraction entre ADSI et les objets dActive Directory, nous pouvons comparer son utilisation dans WSH et PowerShell.
La seconde mthode passe par ADO (ActiveX Data Objects). ADO permet aux applications et aux scripts daccder des donnes provenant de diffrentes sources en utilisant des fournisseurs OLE DB (Object Linking and Embedding Database). Lun deux est un fournisseur ADODB (ADSI OLE DB), qui permet dutiliser ADO et sa prise en charge de SQL (Structured Query Language) ou de LDAP pour effectuer des recherches rapides dans Active Directory. Lexemple suivant montre comment rechercher un compte dutilisateur dans Active Directory en utilisant LDAP :
Set objConnection = CreateObject("ADODB.Connection") Set objCommand = CreateObject("ADODB.Command") objConnection.Provider = "ADsDSOObject" objConnection.Open("Active Directory Provider") objCommand.ActiveConnection = objConnection objCommand.Properties("Page Size") = 1000 objCommand.CommandText = _ "<LDAP://companyabc.com>;(&(objectCategory=user)" _ & "(sAMAccountName=tyson));sAMAccountName,distinguishedName;subtree" Set objRecordSet = objCommand.Execute
234
Partie 2
Si lutilisateur existe, le jeu denregistrements ADO obtenu est constitu de son sAMAccountName et de son distinguishedName. Cependant, cet exemple ne montre que la partie visible de liceberg. En utilisant SQL ou LDAP, nous pouvons crire des recherches plus labores et retrouver des informations complexes ltres concernant des objets Active Directory. Grce ADO, nos scripts Active Directory vont tre plus puissants. Cependant, cette puissance a un prix. Le fournisseur ADSI OLE DB nautorise quun accs en lecture seule Active Directory et, pour interagir avec des objets, nous devons passer par ADSI.
Cet exemple utilise un chemin ADSI LDAP, mais dautres fournisseurs ADSI sont disponibles avec le type abrg [ADSI]. Comme nous lavons expliqu au Chapitre 8, "PowerShell et WMI", le type abrg [ADSI] de PowerShell est un alias de la classe .NET System .DirectoryServices.DirectoryEntry, qui peut sinterfacer avec diffrents fournisseurs ADSI : IIS, LDAP, NDS et WinNT. Par exemple, pour accder au mme compte dutilisateur, mais au travers du fournisseur ADSI WinNT, nous utilisons la commande suivante :
PS C:\> $Utilisateur = [ADSI]"WinNT://companyabc.com/garett"
La deuxime mthode consiste utiliser lespace de noms .NET System.DirectoryServices par le biais de lapplet de commande New-Object. Dans ce cas, deux classes de composants nous permettent de grer Active Directory. La premire, System.DirectoryServices.DirectoryEntry, est la mme classe que celle employe par le type abrg [ADSI]. En voici un exemple :
PS C:\> $Utilisateur = new-object DirectoryServices.DirectoryEntry ("LDAP:// CN=Garett Kopczynski,OU=Accounts,OU=Managed Objects,DC=companyabc,DC=com")
Chapitre 9
235
La seconde, System.DirectoryServices.DirectorySearcher, est une classe qui permet deffectuer des recherches LDAP :
PS C:\> $Chercheur = new-object DirectoryServices.DirectorySearcher PS C:\> $Chercheur.Filter = "(&(objectCategory=person)(objectClass=user) (samAccountName=garett))" PS C:\> $Utilisateur = $Chercheur.FindOne().GetDirectoryEntry()
Les mthodes dutilisation dADSI dans PowerShell sont comparables celles dans WSH. Comme WSH, PowerShell dispose dune mthode directe impliquant la classe System. DirectoryServices.DirectoryEntry ou le type abrg [ADSI] pour se connecter des objets Active Directory et les grer. Par ailleurs, comme WSH, PowerShell propose une deuxime mthode qui sappuie sur la classe System.DirectoryServices.DirectorySearcher pour effectuer des recherches dans Active Directory et obtenir des informations en lecture seule propos des objets. Par consquent, la gestion dActive Directory est pratiquement identique dans PowerShell et dans WSH. Mme si PowerShell utilise pour cela .NET Framework, les classes System. DirectoryServices.DirectoryEntry et System.DirectoryServices.DirectorySearcher ne sont que des interfaces .NET pour ADSI. Les diffrences entre WSH et PowerShell se situent uniquement dans les fonctions et les mthodes de gestion dActive Directory, ainsi que dans leur syntaxe. Les deux sections suivantes examinent ces similitudes en expliquant comment retrouver des informations sur un objet et comment crer un objet en utilisant VBScript et PowerShell.
236
Partie 2
Lenregistrement de ce script dans le chier getuserinfo.vbs et son excution avec cscript produisent les rsultats suivants :
C:\>cscript getuserinfo.vbs Microsoft (R) Windows Script Host Version 5.6 Copyright (C) Microsoft Corporation 1996-2001. Tous droits rservs. CN=Garett Kopczynski Garett@companyabc.com Marketing Manager Dallas C:\>
Pour effectuer la mme tche dans PowerShell, nous utilisons le type abrg [ADSI] pour tablir une liaison avec lobjet dutilisateur indiqu. La mthode ADSI Get() retrouve ses attributs :
PS C:\> $Utilisateur = [ADSI]"LDAP://CN=Garett Kopczynski,OU=Accounts,OU=Man aged Objects,DC=companyabc,DC=com" PS C:\> $Utilisateur.Get("Name") Garett Kopczynski PS C:\>
Une fois que nous sommes lis lobjet dutilisateur, nous pouvons accder directement ses attributs depuis PowerShell en utilisant nimporte quelle applet de mise en forme ou de manipulation de lobjet. Par exemple, pour accder aux mmes attributs que dans lexemple VBScript et les afcher, nous invoquons lapplet de commande Format-List :
PS C:\> $Utilisateur | format-list Name, userPrincipalName, description, physicalDeliveryOfceName
: : : :
PS C:\>
Chapitre 9
237
Crer un objet
Lexemple VBScript suivant se lie lUO Accounts en utilisant la mthode VBScript avec un fournisseur ADSI LDAP. Ensuite, le script invoque la mthode ADSI Create() pour crer un objet nomm David Lightman dans lUO Accounts, puis il dnit les attributs du nouvel objet dutilisateur laide de la mthode ADSI Put(). Enn, ce nouvel objet est enregistr dans Active Directory laide de la mthode ADSI SetInfo(). Un message dtat concernant la cration de lobjet est afch dans une bote de message ou sur la console :
GetObject() Set objOU = GetObject("LDAP://OU=Accounts,OU=Managed Objects,DC=companyabc,DC=com") Set objUser = objOU.Create("user", "CN=David Lightman") objUser.Put "sAMAccountName", "dlightman" objUser.Put "sn", "Lightman" objUser.Put "givenName", "David" objUser.Put "userPrincipalName", "dlightman@norad.gov" objUser.SetInfo Wscript.Echo Le compte dutilisateur & objUser.Get(sAMAccountName) & a t cr."
createuserinfo.vbs
C:\>cscript createuserinfo.vbs Microsoft (R) Windows Script Host Version 5.6 Copyright (C) Microsoft Corporation 1996-2001. Tous droits rservs. Le compte dutilisateur dlightman a t cr. C:\>
Pour raliser la mme tche dans PowerShell, nous utilisons le type abrg [ADSI]. Les commandes rsultantes ont une logique et une syntaxe analogues celles de lexemple VBScript. Par exemple, pour crer lobjet dutilisateur, nous tablissons une liaison avec lUO Accounts, puis nous crons un nouvel objet nomm David Lightman en invoquant la mthode ADSI Create(). Ensuite, la mthode ADSI Put() nous permet de dnir les attributs de lobjet dutilisateur, puis celui-ci est enregistr dans Active Directory grce la mthode ADSI SetInfo(). Enn, pour vrier la cration du compte, nous nous lions lobjet dutilisateur via le type abrg [ADSI].
238
Partie 2
PS C:\
INFO Si vous essayez cet exemple dans votre environnement, vous remarquerez que lobjet dutilisateur rsultant est initialement dsactiv, car la valeur par dfaut de userAccountControl est 514, autrement dit le compte est dsactiv. Pour que cet exemple fonctionne, nous devons dnir des paramtres supplmentaires, comme le mot de passe de lutilisateur, ltat de son compte, son groupe, etc.
De VBScript PowerShell
Cette section prsente la conversion VBScript vers PowerShell dun script qui dtermine si des utilisateurs sont membres dun groupe prcis. Au moment du dveloppement de ce script, companyabc.com tait en pleine migration des utilisateurs de lancienne application de gestion vers la nouvelle. Pour rationaliser le processus et limiter les interruptions dans le travail des employs, la migration se faisait en plusieurs tapes. Lune delles consistait produire la liste des utilisateurs passer de lancienne application la nouvelle. Chaque utilisateur de la liste devait arriver dans la nouvelle application avec une conguration tablie sur une appartenance un groupe Active Directory.
Chapitre 9
239
Cependant, face aux milliers dutilisateurs et de groupes, la vrication manuelle des groupes de chaque utilisateur inscrit sur la liste de migration demandait beaucoup de temps et la gnration des rapports beaucoup defforts. companyabc.com avait donc besoin dautomatiser le processus de vrication des groupes pour que la migration puisse se faire sans interruption. Pour cela, cette entreprise a demand un script qui prenne la liste des utilisateurs faire migrer et produise un rapport prcisant les appartenances aux groupes de ces utilisateurs.
Le script IsGroupMember.wsf
est un chier VBScript dvelopp pour soccuper du processus de vrication des groupes de la socit companyabc.com. Vous en trouverez une copie dans le dossier Scripts\Chapitre 9\IsGroupMember et en tlchargement depuis le site www.pearsoneducation.fr. Pour excuter ce script, il est ncessaire de dnir deux paramtres. Largument de groupname doit indiquer le sAMAccountName du groupe pour lequel nous devons vrier lappartenance de lutilisateur. Largument dimportle doit dsigner le nom du chier CSV import qui contient les utilisateurs devant tre vris. Le paramtre facultatif exportle doit prciser le nom du chier dexportation dans lequel le script placera son rapport.
IsGroupMember.wsf
INFO Le chier CSV import doit contenir une seule colonne (sAMAccountName). Le chier users. csv, qui se trouve dans le dossier Scripts\Chapitre 9\IsGroupMember et que vous pouvez tlcharger depuis le site www.pearsoneducation.fr, en est un exemple.
Voici la commande qui permet dexcuter le script IsGroupMember.wsf et dont le rsultat est prsent la Figure 9.1 :
D:\Scripts>cscript IsGroupMember.wsf /groupname: "TAO-D-RA-LS-LocalWorkstation PowerUsers" /importle:".\users.csv" /exportle:"export.csv"
Voici la suite des oprations ralises par IsGroupMember.wsf : 1. Le script teste la connexion avec le domaine actuel en obtenant son DefaultNamingContext, qui sera utilis ensuite pour interroger Active Directory. Si la connexion choue, le script sarrte. 2. Il cre un objet de connexion ADO, utilis ensuite pour effectuer une recherche Active Directory laide du fournisseur ADSI OLE DB.
240
Partie 2
Figure 9.1
Excution du script IsGroupMember.wsf.
3. Ensuite, la fonction ParseFile ouvre le chier CSV et lit les informations dutilisateurs dans le tableau indiqu (arrUsers). Si le chier prcis est invalide, la fonction choue et le script sarrte. 4. Le script interroge Active Directory propos du groupe indiqu en passant par lobjet ADO. Si le groupe nest pas valide, le script sarrte. Dans le cas contraire, il se connecte au groupe en utilisant ADSI, rcupre ses membres et les ajoute lobjet Dictionary du groupe (dictGroup). 5. Puis, le script parcourt chaque utilisateur du tableau arrUsers, se connecte chaque objet dutilisateur avec ADSI et rcupre son distinguishedName. Les utilisateurs invalides sont ajouts lobjet Dictionary dutilisateur (dictUsers) avec la valeur "Inexistant". Si lutilisateur est valide, le script vrie lexistence de son distinguishedName dans lobjet dictGroup. Les utilisateurs membres du groupe sont ajouts lobjet dictUsers avec la valeur "Oui". Ceux qui ne font pas partie du groupe sont ajouts dictUsers avec la valeur "Non".
Chapitre 9
241
6. Enn, le script afche les informations de lobjet dictUsers sur la console. Si un chier dexportation a t prcis, ces mmes informations y sont crites. Le premier extrait de code donne des lments XML initiaux dun chier WSF. Ils dnissent les paramtres accepts, dcrivent le script, donnent des exemples dutilisation et prcisent le langage employ :
<?xml version="1.0" encoding="ISO-8859-1"?> <package> <job id="IsGroupMember"> <runtime> <description> ************************************************************ Ce script vrie si des utilisateurs sont membres du groupe indiqu. ************************************************************ </description> <named name="groupname" helpstring="Nom du groupe vrier. type=string required=1 /> <named name=importle helpstring=Fichier CSV importer. type=string required=1 /> <named name=exportle helpstring=Fichier CSV exporter. type=string required=0 /> <example> Exemple : cscript ISGroupMember.wsf /groupname:"monGroupe" /importle:"users.csv" </example> </runtime> <script language="VBScript"> <![CDATA[
Le script vrie ensuite si des arguments ont t dnis pour les paramtres obligatoires groupname et importle. Si ce nest pas le cas, il afche les informations dutilisation (dnies dans le code prcdent) sur la console et se termine. Lorsque les arguments sont prciss, le script congure son environnement en dnissant les variables utilises par la suite. Puisque les tableaux VBScript ne simplient pas lenregistrement et laccs aux donnes, ce script utilise lobjet Dictionary de la bibliothque Windows Scripting Runtime Library (dictGroup et dictUsers). Contrairement aux tableaux habituels, lobjet Dictionary enregistre les donnes sous forme de paires cl/valeur. Grce cette mthode, nous pouvons accder aux donnes du tableau en prcisant la cl, utiliser les mthodes et les proprits de lobjet
242
Partie 2
sur les donnes du tableau et ajouter ou retirer des donnes dynamiquement du tableau sans devoir le redimensionner :
Dictionary On Error Resume Next =================================================================== Vrier les arguments obligatoires. =================================================================== If WScript.Arguments.Named.Exists("groupname") = FALSE Then WScript.Arguments.ShowUsage() WScript.Quit End If If WScript.Arguments.Named.Exists("importle") = FALSE Then WScript.Arguments.ShowUsage() WScript.Quit End If =================================================================== Dnir lenvironnement de travail. =================================================================== Const ForReading = 1 Const ForWriting = 2 ReDim arrUsers(0) Dim arrMemberOf Dim StdOut Dim FSO Dim strGroupName, strImportFile, strExportFile Dim strDNSDomain, dictGroup, dictUsers Set Set Set Set StdOut = WScript.StdOut FSO = CreateObject("Scripting.FileSystemObject") dictGroup = CreateObject("Scripting.Dictionary") dictUsers = CreateObject("Scripting.Dictionary")
Le prochain extrait commence le code dautomation. Tout dabord, le script afche son en-tte sur la console, se lie lobjet RootDSE et rcupre le DefaultNamingContext. Nous procdons ainsi pour deux raisons. Dune part, le script vrie la validit dune connexion au domaine Active Directory. Ce test est ralis car si le script ne peut se connecter au domaine Active
Chapitre 9
243
Directory ce stade de son excution, il chouera ensuite lorsquil tentera dextraire des informations dActive Directory. Comme au Chapitre 8, il sagit dune forme labore de gestion des erreurs, qui dtermine les risques dchec dun script inclut une mthode qui les vite. Dautre part, le script doit obtenir le nom de domaine douverture de session courant pour plus tard. Sans cette information, il devrait tre modi an de demander aux utilisateurs quel domaine doivent tre rclames les informations dappartenance au groupe. Dans les environnements constitus de multiples domaines, cette fonctionnalit pourrait tre ajoute au script. Cependant, dans notre exemple, elle est inutile et le script obtient le nom de domaine depuis lobjet RootDSE et le place dans la variable strDNSDomain :
=================================================================== Commencer le travail. =================================================================== Mess "########################################" Mess "# IsGroupMember #" Mess "########################################" Mess vbNullString ------------------- Tester la connexion au domaine. -------------------StatStart Vrication de la connexion au domaine" Set objRootDSE = GetObject("LDAP://RootDSE") strDNSDomain = objRootDSE.Get("DefaultNamingContext") Xerror StatDone
Le code suivant cre un objet ADO (objConnection), qui sera utilis par la suite. La fonction ParseFile importe les informations dutilisateur depuis le chier CSV et les place dans le tableau arrUsers :
------------------- tablir une connexion ADODB. -------------------StatStart "tablissement de la connexion ADODB" Dim objConnection Dim objCommand Dim objRecordSet
244
Partie 2
Set objConnection = CreateObject("ADODB.Connection") Set objCommand = CreateObject("ADODB.Command") objConnection.Provider = "ADsDSOObject" objConnection.Open("Active Directory Provider") objCommand.ActiveConnection = objConnection objCommand.Properties(Page Size) = 1000 Xerror StatDone ------------------- Importer le chier CSV. -------------------StatStart importation du chier CSV ParseFile strImportFile, arrUsers StatDon
Ensuite, le script utilise lobjet ADO cr pour effectuer une recherche LDAP sur le groupe indiqu dans le domaine Active Directory courant. En fonction des informations obtenues, il dtermine si le groupe existe et son distinguishedName. Puis, grce ce distinguishedName, il se lie directement lobjet de groupe dans Active Directory et obtient les membres du groupe, lesquels sont placs dans le tableau arrMemberOf. Une boucle For parcourt ce tableau et ajoute chaque membre du groupe lobjet dictGroup avec la valeur temporaire "A xer" (qui peut tre quelconque, tant que la paire cl/valeur est complte) :
------------------- Obtenir les informations dappartenance un groupe. -------------------StatStart "Obtention des informations dappartenance un groupe" objCommand.CommandText = _ "<LDAP://" & strDNSDomain & ">;(&(objectCategory=group)" _ & "(sAMAccountName=" & strGroupName & "));distinguishedName;subtree" Set objRecordSet = objCommand.Execute If objRecordset.RecordCount = 0 Then StdOut.Write(vbTab) StdOut.WriteLine(Groupe invalide !") WScript.Quit() Else
Chapitre 9
245
Set objGroup = GetObject _ ("LDAP://" & objRecordSet.Fields("distinguishedName")) objGroup.getInfo arrMemberOf = objGroup.GetEx("member") For Each Member in arrMemberOf dictGroup.Add Member, "A xer" Next End If Set objGroup = Nothing StdOut.Write(vbTab) StdOut.WriteLine([OK])
246
Partie 2
Pour chaque utilisateur, le script lance une recherche LDAP dans le domaine douverture de session courant en utilisant lobjet ADO. Les utilisateurs qui nexistent pas sont ajouts lobjet dictUsers avec la valeur "Inexistant". En revanche, lorsquun utilisateur existe, le script prend son distinguishedName dans le jeu denregistrements retourn par la recherche LDAP et, par une comparaison, dtermine si cet utilisateur existe dans lobjet dictGroup. Pour effectuer cette comparaison, le script utilise la mthode Exists() de lobjet Dictionary. Elle permet de vrier lexistence dune cl dans lobjet Dictionary. Cette possibilit est la principale raison dutiliser lobjet Dictionary la place dun tableau VBScript. Ensuite, en fonction de la valeur retourne par la mthode Exists(), le script ajoute lutilisateur lobjet dictUsers avec la valeur "Oui", pour indiquer quil appartient au groupe, ou avec la valeur "Non", sil nest pas membre du groupe. Nous obtenons une collection dinformations dutilisateur dans lobjet dictUsers. Le script prend ensuite chaque utilisateur prsent dans lobjet dictUsers et afche ses informations sur la console :
Mess vbNullString Mess "[Nom],[Est membre]" For Each User In dictUsers StdOut.Write User & "," StdOut.WriteLine dictUsers.Item(User) Next
Si la variable exportle a t dnie lors de lexcution du script, le chier dexportation est cr laide de lobjet FSO. Puis, le script parcourt nouveau lobjet dictUsers et crit les informations des utilisateurs dans ce chier.
Chapitre 9
247
Le dernier extrait de code est constitu des procdures et fonctions utilises par le script, ainsi que des lments XML qui le terminent. Il est inutile de revenir sur cette partie du script car ces procdures et fonctions sont sufsamment explicites ou ont dj t prsentes :
=================================================================== Procdures. =================================================================== ------------------- Procdure gnrale pour les messages. -------------------Sub Mess(Message) crire sur la console. StdOut.WriteLine(Message) End Sub ------------------- Procdure gnrale pour le dbut dun message. -------------------Sub StatStart(Message) crire sur la console. StdOut.Write(Message)
248
Partie 2
End Sub ------------------- Procdure gnrale pour la n dun message. -------------------Sub StatDone crire sur la console. StdOut.Write(vbTab & vbTab) StdOut.WriteLine("[OK]") End Sub ------------------- Procdure gnrale pour Xerror. -------------------Sub Xerror If Err.Number <> 0 Then crire sur la console. StdOut.WriteLine(" Erreur fatale : " & CStr(Err.Number) _ & " " & Err.Description) WScript.Quit() End If End Sub =================================================================== Fonctions. =================================================================== Function ParseFile(le, arrname) Analyser un chier et retourner son contenu dans un tableau (la premire ligne est saute !!!) On Error Resume Next count = -1 Ouvrir le chier en lecture. Set objFile = FSO.OpenTextFile(le, ForReading) objFile.SkipLine Note : cette ligne contient les en-ttes de colonnes. Xerror Lire chaque ligne du chier et la placer dans un tableau. Do While objFile.AtEndOfStream <> True count = count + 1 If count > UBound(arrname) Then ReDim Preserve arrname(count) arrname(count) = objFile.Readline
Chapitre 9
249
Loop Xerror Fermer le chier. objFile.Close() Set objFile = Nothing count = 0 End Function ]]> </script> </job> </package>
Le script IsGroupMember.ps1
est une version PowerShell du script IsGroupMember.wsf. Vous en trouverez une copie dans le dossier Scripts\Chapitre 9\IsGroupMember et en tlchargement depuis le site www.pearsoneducation.fr. Pour excuter ce script, il est ncessaire de dnir deux paramtres. Largument de GroupName doit indiquer le sAMAccountName du groupe pour lequel nous devons vrier lappartenance de lutilisateur. Largument dImportFile doit dsigner le nom du chier CSV import qui contient les utilisateurs vrier. Le paramtre facultatif ExportFile doit prciser le nom du chier dexportation dans lequel le script pourra crire son rapport. Voici la commande dexcution du script IsGroupMember.ps1 :
IsGroupMember.ps1 PS D:\Scripts> .\IsGroupMember.ps1 "TAO-D-RA-LS-LocalWorkstationPowerUsers" ".\ users.csv" "export.csv"
La Figure 9.2 montre lexcution du script IsGroupMember.ps1 sans quun chier dexportation soit prcis et la Figure 9.3 montre son excution avec un chier dexportation. Voici la suite des oprations ralises par le script IsGroupMember.ps1 : 1. Il se connecte au domaine douverture de session actuel en utilisant la classe .NET System.DirectoryServices.ActiveDirectory.Domain, puis il obtient le nom du domaine et lafche sur la console PowerShell. Si la connexion choue, le script sarrte. 2. Il vrie que le groupe indiqu existe dans le domaine actuel en utilisant la fonction GetADObject. Si cest le cas, la fonction retourne un objet li lobjet de groupe dans Active Directory ($Group). Sinon, le script se termine. 3. Il utilise lapplet de commande Test-Path pour vrier que le chier CSV importer est valide. Si ce nest pas le cas, le script se termine.
250
Partie 2
Figure 9.2
Excution du script IsGroupMember.ps1 sans chier dexportation.
Figure 9.3
Excution du script IsGroupMember.ps1 avec chier dexportation.
Chapitre 9
251
4. Il invoque lapplet de commande Import-Csv pour placer le contenu du chier CSV dans la variable $Users. 5. Il appelle la fonction Get-ADObject pour vrier que chaque utilisateur de la collection $Users existe dans le domaine actuel et pour se lier lobjet dutilisateur correspondant dans Active Directory. 6. Si lutilisateur existe, le script compare son distinguishedName aux noms distinctifs dans lattribut de membre du groupe indiqu ($Group). Lorsquune correspondance est trouve, lobjet dutilisateur est tendu laide de lapplet de commande Add-Member pour indiquer que lutilisateur est membre du groupe ("Oui"). Dans le cas contraire, il est tendu de manire indiquer que lutilisateur nest pas membre du groupe ("Non"). Si lutilisateur nexiste pas dans le domaine actuel, lobjet dutilisateur est tendu pour indiquer ce fait ("Inexistant"). 7. Si un chier dexportation a t prcis, le script utilise lapplet de commande Export-Csv pour crer un chier CSV partir du contenu de la variable $Users. Si ce chier nest pas demand, il afche ce contenu sur la console de PowerShell. Le premier extrait de code contient len-tte du script IsGroupMember.ps1. Il fournit des informations sur le rle du script, sa date de dernire mise jour et son auteur. Juste aprs len-tte, nous trouvons les paramtres du script :
################################################## # IsGroupMember.ps1 # Ce script vrie si des utilisateurs sont membres du groupe indiqu. # # Cr le: 21/10/2006 # Auteur : Tyson Kopczynski ################################################## param([string] $GroupName, [string] $ImportFile, [string] $ExportFile)
252
Partie 2
# $Name : # $Usage :
function Get-ScriptHeader{ param ($Name, $Usage) $Date = Date $Text $Text $Text $Text $Text $Text $Text } #------------------------------------------------# Show-ScriptUsage #------------------------------------------------# Usage : Afcher les informations dutilisation de script. function Show-ScriptUsage{ write-host write-host "Usage : ISGroupMember -GroupName valeur ` -ImportFile valeur -ExportFile valeur write-host write-host "Options : write-host write-host GroupName `t : nom du groupe vrier." write-host "ImportFile `t : chier CSV importer." write-host "ExportFile `t : [facultatif] chier CSV exporter." write-host write-host "Format CSV : write-host sAMAccountName write-host write-host Exemple : write-host ISGroupMember.ps1 monGroupe ` utilisateurs.csv resultats.csv write-host } = ###################################### `n += # Script $Name `n += # Usage : $Usage `n" += "# Utilisateur : $Env:username `n" += "# Date : $Date `n += ######################################
Chapitre 9
253
Ces fonctions sont utilises pour afcher les informations dutilisation du script, de manire analogue celles afches par un script WSF :
PS D:\Scripts> .\IsGroupMember.ps1 Veuillez prciser le nom du groupe ! ###################################### # Script IsGroupMember # Usage : Ce script vrie si des utilisateurs sont membres du groupe indiqu. # Utilisateur : tyson # Date : Mon Oct 22 17:37:19 2007 ###################################### Usage : ISGroupMember -GroupName valeur -ImportFile valeur -ExportFile valeur Options : GroupName ImportFile ExportFile Format CSV : sAMAccountName Exemple : ISGroupMember.ps1 "monGroupe" "utilisateurs.csv" "resultats.csv" PS D:\Scripts> : nom du groupe vrier. : chier CSV importer. : [facultatif] chier CSV exporter.
Un chier WSF a cela dintressant quil peut fournir aux utilisateurs des informations sur lobjectif du script, ses paramtres et des exemples dutilisation. Ils nont donc pas besoin de lire les commentaires ou de se rfrer une documentation externe pour comprendre le rle du script et son usage. Cette caractristique amliore lexprience de lutilisateur avec un script dautomation et augmente donc les chances quil soit considr comme indispensable. Malheureusement, cette fonctionnalit nexiste pas dans PowerShell. Au mieux, nous pouvons dnir les paramtres requis et afcher des informations sur leur utilisation au moyen du mot cl throw. Ce mot cl a t employ dans les scripts prcdents, mais il nafchait aucune information dans un format aussi convivial que celui des scripts WSF. Pour obtenir le mme niveau dinterface, nous avons dvelopp les fonctions Show-ScriptUsage et Get-ScriptHeader. La premire, Show-ScriptUsage, dnit le rle du script, ses paramtres et son utilisation.
254
Partie 2
Mme si nous pouvons remployer la structure de cette fonction dans dautres scripts, son contenu est statique et doit tre modi chaque fois. La seconde, Get-ScriptHeader, afche simplement le titre du script. Elle peut servir dans dautres scripts sans grandes modications, car les paramtres $Name et $Usage dnissent les informations afches. Au nal, les informations dutilisation du script afches dans lexemple prcdent grce ces fonctions sont comparables ce que peut produire un script WSF. Bien que la modication de Show-ScriptUsage dans chaque nouveau script soit un peu pnible, ces fonctions gnriques simples ont lavantage de montrer quun script a t crit pour ses utilisateurs et non pour des dveloppeurs. Nous utiliserons ces fonctions dans la suite de cet ouvrage.
INFO Nous pouvons amliorer la fonction Show-ScriptUsage en la rendant plus gnrique et viter ainsi sa modication dans les autres scripts. Par exemple, les informations retournes par cette fonction peuvent sappuyer sur une chane XML dont la structure ressemble celle dun chier WSF.
Aprs ces fonctions outils, les deux suivantes mettent en uvre les interactions avec Active Directory :
#------------------------------------------------# Get-CurrentDomain #------------------------------------------------# Usage : Obtenir le domaine actuel. function Get-CurrentDomain{ [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain() } #------------------------------------------------# Get-ADObject #------------------------------------------------# Usage : Retrouver un objet depuis Active Directory. # $Item : lment de lobjet (sAMAccountName ou distinguishedName). # $Name : Nom de lobjet (sAMAccountName ou distinguishedName). # $Cat : Catgorie de lobjet. function Get-ADObject{ param ($Item, $Name, $Cat)
Chapitre 9
255
trap{Continue} $Searcher = new-object DirectoryServices.DirectorySearcher $SearchItem = "$Item" $SearchValue = "$Name" $SearchCat = "$Cat" $Searcher.Filter = ` "(&($($SearchItem)=$($SearchValue))(objectCategory=$($SearchCat)))" $Searcher.FindOne().GetDirectoryEntry() }
La premire fonction, Get-CurrentDomain, est simple et se contente dtablir une liaison avec lobjet du domaine douverture de session courant. Pour cela, elle sappuie sur une rfrence .NET Framework la classe System.DirectoryServices.ActiveDirectory.Domain (voir le Chapitre 3, "Prsentation avance de PowerShell") avec la mthode GetCurrentDomain(). Ensuite, elle retourne lobjet de domaine rsultant, qui vrie la connexion au domaine et fournit une mthode permettant dafcher le nom DNS du domaine aux utilisateurs de script (un rappel visuel indiquant que les informations du domaine sont en cours de consultation). La deuxime fonction, Get-ADObject, vrie lexistence dun objet dans Active Directory en fonction dun identiant unique, comme lattribut sAMAccountName ou distinguishedName. Ensuite, elle se connecte cet objet laide de la classe System.DirectoryServices. DirectorySearcher, qui est une mthode .NET pour effectuer des recherches Active Directory. Lors de lappel Get-ADObject, nous devons fournir lidentiant unique de lobjet ($Name), le type ($Item) de cet identiant unique (sAMAccountName ou distinguishedName) et le type (Utilisateur, Ordinateur ou Groupe) de la catgorie ($Cat) de lobjet. partir de ces valeurs, Get-ADObject cre un objet $Searcher, dont il xe la proprit Filter une chane de recherche LDAP fonde sur les valeurs fournies. Ensuite cette fonction utilise la mthode FindOne() de lobjet $Searcher pour effectuer la recherche et obtenir uniquement la premire entre trouve. Enn, la mthode GetDirectoryEntry() est invoque sur lentre obtenue an dtablir une liaison avec lobjet Active Directory rfrenc. ce stade, soit nous avons vri quun objet existe, soit nous pouvons interroger lobjet retourn par la fonction pour plus dinformations.
256
Partie 2
Dans lextrait de code suivant, les variables $ScriptName et $ScriptUsage sont dnies. Elles seront employes plus loin pour afcher les informations dutilisation du script :
################################################## # Code principal. ################################################## #-------------------# Dnir les variables de conguration. #-------------------$ScriptName = "IsGroupMember" $ScriptUsage = "Ce script vrie si des utilisateurs sont membres du groupe indiqu."
Outre lafchage des informations sur lutilisation du script, les fonctions Get-ScriptHeader et Show-ScriptUsage prsentent galement une aide lorsque les utilisateurs indiquent en premier argument lune des chanes suivantes : -?, -h et -help. Pour cela, le script se sert de loprateur de comparaison de correspondance : $args[0] -match -(\?|(h|(help))) :
#-------------------# Vrier les paramtres obligatoires. #-------------------if ($args[0] -match -(\?|(h|(help)))){ write-host Get-ScriptHeader $ScriptName $ScriptUsage Show-ScriptUsage Return }
Les deux portions de code suivantes sont des mthodes de vrication des paramtres obligatoires du script. Les exemples prcdents sappuyaient sur le mot cl throw lors de la dnition dun paramtre (avec le mot cl param) et indiquaient ainsi les paramtres requis. Dans ce script, la place du mot cl throw, nous vrions la prsence du paramtre obligatoire et, sil est absent, nous afchons aux utilisateurs un message daide leur indiquant quils ont oubli de prciser un argument. Nous pouvons galement leur afcher des informations propos des paramtres, de leur utilisation et des exemples darguments. Enn, Get-ScriptHeader afche len-tte du script. Les utilisateurs ont ainsi la conrmation quils excutent le bon script. Par ailleurs, si le script demande plusieurs heures avant de se terminer, len-tte contient la date et lheure de lancement.
Chapitre 9
257
Lobjectif de cette fonction est damliorer la convivialit du script, une qualit souvent nglige dans les scripts et les interfaces en ligne de commande. Labsence de facilit dutilisation fait partie des raisons qui ont maintenu les administrateurs de systmes Windows lcart des scripts et des CLI pour la gestion de leurs environnements Windows. Lquipe de dveloppement de PowerShell a reconnu les problmes de convivialit des langages de scripts prcdents et a fait un effort particulier pour crer un shell et un langage pas seulement destin aux dveloppeurs, mais galement aux utilisateurs. Lorsque vous dveloppez des scripts, gardez les utilisateurs en perspective. Comme nous lavons expliqu au Chapitre 5, "Suivre les bonnes pratiques", lautomation nest quune partie du dveloppement dun script.
if (!$GroupName){ write-host write-host Veuillez prciser le nom du groupe !" -Foregroundcolor Red write-host Get-ScriptHeader $ScriptName $ScriptUsage Show-ScriptUsage Return } if (!$ImportFile){ write-host write-host Veuillez prciser le nom du chier CSV importer !" ` -Foregroundcolor Red write-host Get-ScriptHeader $ScriptName $ScriptUsage Show-ScriptUsage Return
Dans le code suivant, la fonction Get-ScriptHeader indique lutilisateur du script que la partie automation vient de dmarrer :
#-------------------# Dbut du script. #-------------------write-host Get-ScriptHeader $ScriptName $ScriptUsage write-host
258
Partie 2
Le script doit ensuite vrier quil existe une connexion valide au domaine. Pour cela, il invoque Get-CurrentDomain. Sil nexiste aucune connexion valide, le script se termine et retourne son code dtat. Dans le cas contraire, il poursuit son excution et afche le nom de domaine sur la console :
.{ trap{write-host `t "[ERREUR]" -Foregroundcolor Red; throw write-host $_ -Foregroundcolor Red; Break} write-host Vrication de la connexion au domaine" -NoNewLine # Tester la connexion au domaine. $Domain = Get-CurrentDomain # Afcher le nom du domaine. write-host `t $Domain.Name -Foregroundcolor Green }
Nous vrions ensuite le nom du groupe dans la variable $GroupName. Pour cela, le script se sert de la fonction Get-ADObject. Elle se connecte Active Directory et recherche le groupe par son nom. Si la fonction retourne un objet, le nom du groupe est valide. Sinon, le nom du groupe est considr comme invalide et le script se termine :
write-host "Vrication du nom du groupe" -NoNewLine # Obtenir le groupe. $Group = Get-ADObject "sAMAccountName" $GroupName "Group" if (!$Group){ write-host `t "Invalide ! -Foregroundcolor Red write-host Break } else{ write-host `t [OK] -Foregroundcolor Green }
Chapitre 9
259
La dernire vrication concerne la validit du nom du chier importer. Pour cela, nous utilisons lapplet de commande Test-Path avec la variable $ImportFile :
write-host "Vrication du chier importer" -NoNewLine if (!(test-path $ImportFile -pathType leaf)){ write-host `t "Fichier invalide ! -Foregroundcolor Red write-host Break } else{ write-host `t [OK] -Foregroundcolor Green }
Dans le code suivant, le script termine la vrication dappartenance de lutilisateur un groupe. Comme nous lavons expliqu prcdemment, en fonction de la validit de lutilisateur dans Active Directory et de son appartenance au groupe indiqu ($GroupName), le script complte lobjet dutilisateur dans la collection $Users :
#-------------------# Vrier lappartenance de chaque utilisateur au groupe. #-------------------$Users = import-csv $ImportFile foreach ($User in $Users){ &{ $sAMAccountName = $User.sAMAccountName $ADUser = Get-ADObject sAMAccountName $sAMAccountName User if ($ADUser){ [string]$DN = $ADUser.distinguishedName $IsMember = $Group.Member | ` where {$_ -eq $DN} if ($IsMember){ add-member -inputObject $User -membertype noteProperty ` -name IsMember -value Oui }
260
Partie 2
else{ add-member -inputObject $User -membertype noteProperty ` -name IsMember -value Non } } else{ # Et si utilisateur nexiste pas ? add-member -inputObject $User -membertype noteProperty ` -name "IsMember" -value "Inexistant" } } }
Au cours des chapitres prcdents, nous avons expliqu que loprateur dappel & excute un bloc de code du script dans sa propre porte. Lorsquil se termine, sa porte est dtruite avec tout ce quelle contient. Dans lexemple de code prcdent, loprateur & nous permet de rutiliser les noms de variables sans nous proccuper des anciennes donnes. Par exemple, lorsque nous sortons de la boucle For, les noms de variables $sAMAccountName et $ADUser restent des objets valides. Pour ne pas nous servir par mgarde ces anciens objets, nous utilisons loprateur dappel & an de dtruire lobjet aprs lexcution du bloc de code. Lextrait de code suivant afche le contenu de la collection $Users sur la console. Si un chier dexportation a t prcis, le contenu y est alors crit au format CSV en utilisant lapplet de commande Export-CSV.
if (!$ExportFile){ $Users } else{ write-host write-host Exportation des donnes dans : " -NoNewLine $Users | export-csv $ExportFile write-host "$ExportFile" -Foregroundcolor Green write-host }
Chapitre 9
261
En rsum
Au long de ce chapitre, nous avons examin linteraction entre PowerShell et ADSI, ainsi que laccs des objets Active Directory. Nous avons vu que PowerShell offre les mmes interfaces de gestion dActive Directory que WSH, si ce nest plus, grce sa compatibilit .NET Framework. Par ailleurs, nous avons tudi un script oprationnel qui dtermine si des utilisateurs sont membres dun groupe. Comme avec WSH, il sagit seulement de lun des nombreux types de scripts de gestion dActive Directory que nous pouvons dvelopper avec PowerShell.
III
Utiliser PowerShell pour les besoins dautomation
10
Utiliser PowerShell en situation relle
Dans ce chapitre
m m
Ce chapitre illustre la puissance de PowerShell dans la gestion des environnements Windows. Nous passons en revue deux scripts PowerShell utiliss pour la gestion des systmes. Le premier, PSShell.ps1, se charge des interactions entre lutilisateur et le bureau de Windows en crant un remplaant contrl, scuris et sduisant du bureau. Le second, ChangeLocalAdminPassword.ps1, gre les mots de passe de ladministrateur local sur des serveurs dun domaine Active Directory. Ces scripts montrent comment satisfaire les besoins de gestion des systmes dans une entreprise. Lors de ltude de chaque script, vous apprendrez de nouveaux concepts PowerShell et verrez comment les appliquer vos propres besoins.
Le script PSShell.ps1
PSShell.ps1
peut tre employ comme un shell scuris pour les kiosques informatiques. Vous en trouverez une copie dans le dossier Scripts\Chapitre 10\PSShell et en tlchargement sur le site www.pearsoneducation.fr. Ce script exige que vous compreniez comment se passe le remplacement du shell de Windows. Lisez bien les sections suivantes propos des composants du script an que vous sachiez comment le dployer et lutiliser efcacement. Cependant, nous devons commencer par prsenter les raisons de ce script.
266
Partie 3
companyabc.com fabrique des processeurs pour le grand public et le gouvernement amricain. Le personnel qui travaille sur les processeurs destins au gouvernement doit possder certaines autorisations de scurit, et toutes les donnes associes la fabrication de ces processeurs doivent tre scurises an dviter leur diffusion auprs dentits non autorises, tant internes quexternes la socit. Ces contraintes scuritaires posent un problme companyabc.com. Son service informatique doit mettre en uvre des procdures mtier diffrentes pour les contrats grand public et ceux gouvernementaux. Par ailleurs, le directeur de companyabc.com a souhait un systme centralis, autrement dit que tous les utilisateurs aient accs aux donnes et aux applications depuis nimporte quel ordinateur. Ce fonctionnement complexie dautant les mesures de scurit. Pour satisfaire ces contraintes, le service informatique a dploy des fermes de serveurs WTS (Windows Terminal Services). Les utilisateurs qui travaillent pour le grand public accdent des serveurs ayant un niveau de scurit faible, tandis que ceux qui travaillent sur les contrats gouvernementaux accdent des serveurs WTS isols des autres utilisateurs et avec un niveau de scurit trs lev. Il a galement t dcid que les connexions aux fermes WTS se feraient via des clients lgers, an dacclrer le dploiement et de matriser totalement la scurit des accs et des donnes. Cependant, mme si companyabc.com disposait du budget pour mettre en place les fermes WTS, les fonds permettant dacheter les clients lgers et les logiciels adquats pour tous les utilisateurs ntaient pas disponibles. Pour compliquer les choses, la socit tait rcemment passe des systmes Windows XP. Par ailleurs, le matriel bureautique venait dtre achet et devrait donc tre utilis encore quelques annes avant dtre remplac. Pour ne pas dpasser le budget allou, le service informatique a recherch une solution bon march permettant de convertir les systmes Windows XP existants en clients lgers. Lun des administrateurs systme a lu un article technique concernant le remplacement du shell de Windows an de convertir un bureau Windows XP en un kiosque scuris, mais cela impliquait le remplacement de lExplorateur Windows par Internet Explorer pour crer linterface du kiosque. Si cette mthode convient parfaitement un simple kiosque de navigation sur le Web, le service informatique avait quant lui besoin dun contrle total sur le shell dinterface. Pour rsoudre ce problme, le service informatique a dcid dutiliser PowerShell et sa compatibilit avec .NET Windows Forms pour offrir un remplacement personnalisable du shell pour lExplorateur Windows. Aprs quelques dveloppements et tests, la solution aux besoins de clients lgers de companyabc.com a t un hybride entre plusieurs composants diffrents. Ces composants incluent un shell de remplacement de Windows, qui utilise cmd.exe
Chapitre 10
267
comme shell de base, et un script PowerShell, qui sappuie sur Windows Forms pour prsenter un bureau scuris de type Explorateur Windows aux utilisateurs. Les sections suivantes dtaillent les composants de PSShell.ps1 (nomm Kiosque PSShell).
268
Partie 3
Pour crer le GPO de conguration du shell de remplacement de Windows, procdez comme suit : 1. laide de la console de gestion des stratgies de groupe (GPMC, Group Policy Management Console), crez un GPO nomm GPO Bureau Kiosque PSShell. 2. Ensuite, dsactivez les paramtres de conguration ordinateur. 3. Retirez les utilisateurs authentis des paramtres de Filtrage de scurit. 4. Dans la console Utilisateurs et ordinateurs Active Directory, crez un groupe de domaine local nomm GPO Bureau Kiosque PSShell - Appliquer et ajoutez un utilisateur de test au groupe. 5. Ajoutez le groupe GPO Bureau Kiosque PSShell - Appliquer aux paramtres de ltrage de scurit du GPO Bureau Kiosque PSShell. 6. Enn, liez le GPO Bureau Kiosque PSShell lunit dorganisation (UO) de premier niveau qui contient tous vos comptes dutilisateurs et vriez que lordre des liaisons des autres GPO ncrase pas le GPO Bureau Kiosque PSShell.
INFO La liaison du GPO Bureau Kiosque PSShell lUO de premier niveau qui contient les comptes dutilisateurs suppose quil nexiste aucun autre GPO li aux UO enfants qui pourraient craser celui-ci. Par ailleurs, le GPO est appliqu un groupe dutilisateurs et non un groupe de machines an dempcher que les utilisateurs ayant des autorisations de scurit leves aient un bureau non scuris.
Ensuite, congurez les paramtres de remplacement du shell de Windows en procdant comme suit : 1. Dans la console gestion des stratgies de groupe, ouvrez le GPO Bureau Kiosque PSShell. 2. Dveloppez Conguration utilisateur, Modles dadministration et Systme. Ensuite, slectionnez le paramtre Interface utilisateur personnalise. 3. Cliquez du bouton droit sur Interface utilisateur personnalise et choisissez Proprits. 4. Dans la bote de dialogue Proprits dInterface utilisateur personnalise, cochez la case Activ, saisissez cmd /c "C:\PSShell\Launch.bat" dans le champ de texte Nom du chier dinterface (voir Figure 10.1) puis cliquez sur OK.
Chapitre 10
269
Figure 10.1
Bote de dialogue Proprits dInterface utilisateur personnalise.
En xant le nom du chier dinterface cmd, nous obligeons Windows utiliser cmd.exe comme shell de remplacement. Loption /c demande cmd dexcuter le chier de commandes C:\PSShell\Launch.bat et de sarrter, ce qui ferme la fentre de cmd aprs la n de lexcution de Launch.bat.
INFO En utilisant le chemin C:\PSShell, nous supposons que les chiers de Kiosque PSShell ont t copis dans ce dossier sur la machine du client. Cependant, ce choix nest en rien g et ils peuvent tre placs ailleurs, par exemple sur un partage rseau Windows.
Composant 2 : PSShell.exe
Vous vous demandez peut-tre pourquoi nous avons utilis cmd comme shell de remplacement la place de PowerShell. Lorsque nous excutons un script PowerShell, il est impossible de le faire sans afcher la console PowerShell. Si explorer.exe est remplac par PowerShell, le bureau rsultant contient cette console. Cependant, companyabc.com souhaite que les utilisateurs disposent dun bureau analogue celui de explorer.exe et non dun bureau qui propose la console PowerShell. La solution implique le deuxime composant, nomm PSShell.exe. PSShell.exe est une application Windows crite en C# qui masque la console PowerShell lors de lexcution de PSShell.ps1.
270
Partie 3
Pour masquer la console PowerShell, PSShell.exe se sert de la classe .NET System.Diagnostics.Process. En utilisant cette classe avec lnumration .NET ProcessWindowStyle, nous pouvons prciser comment la fentre dun processus apparat au moment de son dmarrage. Le style (apparence) peut tre Hidden, Normal, Minimized ou Maximized. Dans notre exemple, nous voulons que le style de la fentre de PowerShell soit x Hidden. Une fois lanc le processus PowerShell laide de la mthode Start() et des arguments adquats, Windows nafche pas la console PowerShell.
INFO Une fois encore, le chemin C:\PSShell dans le code source de PSShell.exe nest quune suggestion. Si vous modiez le chemin de dploiement de Kiosque PSShell, vous devez actualiser le code et compiler un nouvel excutable. Cependant, si le langage C# vous est familier, une meilleure solution consiste modier PSShell.exe an quil prenne des arguments pour dnir le chemin du script PSShell.ps1.
Pour bien comprendre pourquoi cmd est utilis comme shell de remplacement, noubliez pas que PSShell.exe nest pas un shell, mais une application dont le seul objectif est de supprimer la console PowerShell lors de lexcution dun script. Cet excutable est
Chapitre 10
271
galement ncessaire pour lancer PowerShell et excuter PSShell.ps1 avec la console masque. Cependant, pour dmarrer PSShell.exe, nous devons lappeler depuis un autre shell, comme cmd. Le nom du chier dinterface saisi dans le paramtre Interface utilisateur personnalise prcise le chier de commandes nomm Launch.bat. Il est utilis pour lancer PSShell.exe. En rsum, cmd excute Launch.bat, qui dmarre PSShell.exe. son tour, PSShell.exe lance PowerShell, qui excute nalement le script PSShell.ps1. Tout cela est un peu compliqu mais indispensable pour rpondre une dcience de fonctionnalits dans PowerShell. Grce cette solution, nous pouvons gnrer un bureau scuris avec PowerShell.
Composant 3 : PSShell.ps1
Le dernier composant de Kiosque PSShell est le script PSShell.ps1. Il cre le bureau du kiosque pour les utilisateurs connects. Pour cela, il utilise un formulaire, grce la compatibilit entre PowerShell et .NET Windows Forms. Le seul objectif de ce script est de donner aux utilisateurs lillusion dtre devant le bureau par dfaut de Windows, alors quils sont en ralit dans un bureau personnalis aux fonctionnalits limites. Kiosque PSShell dtermine ce qui est prsent aux utilisateurs et les programmes quils peuvent lancer depuis le bureau. companyabc.com souhaite que les utilisateurs puissent effectuer des tches suivantes dans un bureau scuris :
n
lancer le client Bureau distance (RDP, Microsoft Remote Desktop), qui est congur pour se connecter une ferme WTS scurise ; dmarrer une version limite (par GPO) dInternet Explorer qui va sur le site de courrier Web de la socit ; se dconnecter de Kiosque PSShell lorsque leur travail est termin.
Le premier extrait de code contient len-tte du script PSShell.ps1. Il fournit des informations sur le rle du script, sa date de dernire mise jour et son auteur :
################################################## # PSShell.ps1 # Ce script est un shell de remplacement pour explorer.exe. # # Cr le : 17/10/2006 # Auteur : Tyson Kopczynski ##################################################
272
Partie 3
Le code suivant contient deux longues instructions complexes qui font intervenir la classe .NET System.Reection.Assembly :
$Null=[System.Reection.Assembly]::LoadWithPartialName("System.Windows.Forms") $Null=[System.Reection.Assembly]::LoadWithPartialName("System.Drawing")
Ces deux instructions sont indispensables car PowerShell charge uniquement quelques assemblages (assembly) dans son AppDomain. Par exemple, si nous essayons de crer un objet Windows Forms avec lapplet de commande New-Object, nous obtenons lerreur suivante :
PS C:\> $Form = new-object System.Windows.Forms.Form New-Object : Le type [System.Windows.Forms.Form] est introuvable : vriez que lassembly dans lequel il se trouve est charg. Au niveau de ligne : 1 Caractre : 19 + $Form = new-object <<<< System.Windows.Forms.Form PS C:\>
Pour pouvoir utiliser la classe System.Windows.Forms.Form, nous devons tout dabord charger lassemblage dans PowerShell laide de la mthode LoadWithPartialName(). Les assemblages des DLL de type .NET incluses avec les SDK Microsoft, celles des fournisseurs tiers ou nos propres DLL doivent galement tre chargs dans PowerShell. Par exemple, supposons que nous ayons dvelopp une DLL .NET pour grer lapplication xyz. Pour utiliser cette DLL dans PowerShell, nous utilisons la mthode LoadFrom() ou LoadFile() de la classe System.Reection.Assembly :
PS C:\> [System.Reection.Assembly]::LoadFrom("C:\Outils\maPremiere.dll") 0 PS C:\>
INFO Microsoft a dclar la mthode LoadWithPartialName() obsolte. Elle est remplace par la mthode Load(), qui est conue pour viter des liaisons partielles lors du chargement dassemblages .NET. Lutilisation de la mthode Load() demande un travail plus important. Cependant, si les implications dune liaison partielle (comme lchec de votre script) ne vous proccupent pas, vous pouvez toujours utiliser LoadWithPartialName() jusqu ce quelle soit retire de .NET Framework.
Chapitre 10
273
prsent que les assemblages ncessaires aux objets Windows Forms ont t chargs, ltape suivante consiste terminer la conguration de lenvironnement dexcution du script. Pour cela, nous dnissons un ensemble de chanes de commandes qui dnissent les applications que les utilisateurs sont autoriss lancer depuis le bureau de Kiosque PSShell. Nous reviendrons sur ces chanes de commandes plus loin :
# Chanes des commandes autorises. $LaunchIE = {$IE = new-object -com InternetExplorer.Application; ` $IE.navigate("webmail.companyabc.com"); $IE.visible = $True; $IE} $LaunchRemoteDesktop = {mstsc /v:earth.companyabc.com /f}
Ensuite, nous crons un espace dexcution (Runspace) de PowerShell, comme le montre le code suivant :
#-------------------# Crer un espace dexcution. #-------------------# Pour plus dinformations sur les espaces dexcution, voir # http://msdn2.microsoft.com/en-us/library/ms714459.aspx $Runspace = [System.Management.Automation.Runspaces.RunspaceFactory]:: CreateRunspace() $RunspaceInvoke = new-object System.Management.Automation.RunspaceInvoke($Runspace) $Runspace.Open()
Ce code montre un espace dexcution PowerShell, qui est reprsent par lespace de noms System.Management.Automation.Runspaces. Un espace dexcution est une abstraction de lenvironnement dexcution de PowerShell qui permet une application hte dexcuter des commandes PowerShell. Mme si powershell.exe est une application hte qui utilise son propre espace dexcution pour traiter les commandes, les espaces dexcution sont dautant plus intressants lorsquils sont employs dans des applications en dehors de PowerShell. Les espaces dexcution sont indispensables PowerShell, mais ils ont t dvelopps principalement pour donner aux autres applications un moyen simple dappeler lenvironnement dexcution PowerShell et dexcuter des commandes. En un sens, lobjet Windows Form cr par PSShell.ps1 est une application, et son interaction avec un espace dexcution PowerShell
274
Partie 3
pour effectuer des tches est donc sense. En exploitant les espaces dexcution de PowerShell, nous navons pas besoin dajouter une logique lobjet Windows Form pour quil ralise des tches pour le compte des utilisateurs. La cration dun espace dexcution ($Runspace) pour lobjet Windows Form consiste simplement invoquer la mthode CreateRunspace() de la classe PowerShell System.Management.Automation.Runspaces.RunspaceFactory. Ensuite, nous crons un objet RunspaceInvoke qui permet au Windows Form dexcuter des commandes par le biais de lespace dexcution. Enn, nous ouvrons cet espace laide de la mthode Open() an quil puisse tre utilis par lobjet Windows Form. Une fois lespace dexcution dni, nous devons construire le formulaire (fentre) lui-mme, comme le montre lextrait de code suivant. La section "Dnir les images" cre un ensemble dobjets Drawing.Image. Ils seront utiliss par la suite dans le formulaire pour reprsenter des lments comme le menu Dmarrer du Kiosque PSShell et les icnes des applications. Ensuite, la section "Crer la fentre", lobjet formulaire est cr avec un ensemble de proprits prdnies qui le font ressembler au bureau par dfaut de Windows.
#-------------------# Dnir les images. #-------------------$ImagePath = Split-Path -Parent $MyInvocation.MyCommand.Path $ImgStart = [Drawing.Image]::FromFile("$Imagepath\Images\Start.png") $ImgRDP = [Drawing.Image]::FromFile("$Imagepath\Images\RDP.png") $ImgIE = [Drawing.Image]::FromFile("$Imagepath\Images\IE.png") #-------------------# Crer la fentre. #-------------------$Form = new-object System.Windows.Forms.Form $Form.Size = new-object System.Drawing.Size @(1,1) $Form.DesktopLocation = new-object System.Drawing.Point @(0,0) $Form.WindowState = "Maximized" $Form.StartPosition = "CenterScreen" $Form.ControlBox = $False $Form.FormBorderStyle = "FixedSingle" $Form.BackColor = #647258
Chapitre 10
275
La fentre est cre, mais avant de lactiver et de lafcher lutilisateur, nous devons ajouter les lments du menu. Le code suivant ajoute plusieurs MenuItems au ToolStripMenu qui joue le rle du menu Dmarrer pour le bureau de Kiosque PSShell :
#-------------------# Construire le menu. #-------------------$MenuStrip = new-object System.Windows.Forms.MenuStrip $MenuStrip.Dock = "Bottom" $MenuStrip.BackColor = #292929 # Menu Dmarrer. $StartMenuItem = new-object System.Windows.Forms.ToolStripMenuItem("") $StartMenuItem.Padding = 0 $StartMenuItem.Image = $ImgStart $StartMenuItem.ImageScaling = "None" # lment de menu 1. $MenuItem1 = new-object System.Windows.Forms.ToolStripMenuItem("&Webmail") $MenuItem1.Image = $ImgIE $MenuItem1.ImageScaling = "None" $MenuItem1.add_Click({$RunspaceInvoke.Invoke($LaunchIE)}) $StartMenuItem.DropDownItems.Add($MenuItem1) # lment de menu 2 $MenuItem2 = new-object System.Windows.Forms.ToolStripMenuItem(` "&Bureau distance) $MenuItem2.Image = $ImgRDP $MenuItem2.ImageScaling = None $MenuItem2.add_Click({$RunspaceInvoke.invoke($LaunchRemoteDesktop)}) $StartMenuItem.DropDownItems.Add($MenuItem2) # lment de menu 3. $MenuItem3 = new-object System.Windows.Forms.ToolStripMenuItem(` "&Fermer la session") $MenuItem3.add_Click({` $RunspaceInvoke.invoke({Get-WmiObject Win32_OperatingSystem | ` foreach-object {$_.Win32Shutdown(0)}})}) $StartMenuItem.DropDownItems.Add($MenuItem3)
276
Partie 3
Les lments de menu ajouts par le code prcdent permettent aux utilisateurs de lancer des applications ou de fermer le bureau de Kiosque PSShell. chaque lment est affect un gestionnaire dvnements de clic qui utilise lobjet $RunspaceInvoke et sa mthode invoke() pour excuter la commande PowerShell indique. La liste suivante dcrit laction ralise par chaque lment de menu :
m $MenuItem1. Utilise la commande indique dans la variable $LaunchIE pour lancer Internet
Explorer.
m $MenuItem2.
Utilise la commande indique dans la variable $LaunchRemoteDesktop pour dmarrer mstsc.exe (le client du bureau distance de Microsoft). Utilise lapplet de commande
Get-WmiObject
m $MenuItem3.
Windows. Enn, le script doit activer la fentre et lafcher lutilisateur. Pour cela, nous utilisons la mthode ShowDialog() :
#-------------------# Afcher la fentre. #-------------------$MenuStrip.Items.Add($StartMenuItem) $Form.Controls.Add($MenuStrip) $Form.Add_Shown({$Form.Activate()}) $Form.ShowDialog()
Tout runir
Une fois le GPO Bureau Kiosque PSShell congur et prt tre appliqu aux utilisateurs, ltape suivante consiste dployer les chiers de Kiosque PSShell sur les systmes servant de clients lgers scuriss :
m Launch.bat.
Le chier de commandes qui permet de lancer PSShell.exe. Lapplication C# qui sert excuter le script PSShell.ps1. Le script PowerShell qui cre le Kiosque PSShell.
m PSShell.exe. m PSShell.ps1. m
Dossier Images. Le dossier qui contient les images utilises par le bureau de Kiosque PSShell.
Comme nous lavons indiqu prcdemment, Kiosque PSShell est congur pour le chemin C:\PSShell. Par consquent, aprs avoir dploy ces chiers dans ce dossier sur chaque machine, vous pouvez placer les utilisateurs qui ont besoin dun Bureau scuris dans le
Chapitre 10
277
groupe GPO Bureau Kiosque PSShell - Appliquer. La Figure 10.2 montre le Bureau de Kiosque PSShell avec trois lments de menu.
Figure 10.2
Le Bureau de Kiosque PSShell.
Le script ChangeLocalAdminPassword.ps1
Le script ChangeLocalAdminPassword.ps1 a t dvelopp pour soccuper dune tche demandant beaucoup de temps aux administrateurs systme. Il sagit de la modication du mot de passe de ladministrateur local, que ce soit de manire routinire (administration planie) ou force (suite une attaque du rseau). Cette modication fait partie des toutes premires activits de gestion des systmes, et les administrateurs la ngligent frquemment car elle est fastidieuse. companyabc.com dispose dune ferme de cinq cents serveurs sous Windows Server 2003. Conformment aux pratiques scuritaires de cette entreprise, le service informatique a essay de modier rgulirement le mot de passe de ladministrateur local sur les cinq cents serveurs, en gnral une fois par mois ou lorsquun administrateur systme quittait la socit. cause du temps et des efforts demands par ces changements, le service informatique a eu tendance
278
Partie 3
ne pas respecter les dates prvues. Il a ni par ne plus modier le mot de passe de ladministrateur local, ce qui a rapidement conduit un incident de scurit srieux : une entit externe a exploit cette dfaillance dans le respect des bonnes pratiques de gestion des mots de passe pour prendre le contrle de quelques serveurs de companyabc.com et demander une ranon pour rendre laccs ces systmes. Suite cet incident, le service informatique a recherch une manire de modier rapidement et en masse le mot de passe de ladministrateur local. Il a t dcid demployer un script dautomation qui cre une liste des serveurs dans une UO dtermine et qui se connecte chaque serveur pour modier le mot de passe de ladministrateur local. Le script ChangeLocalAdminPassword.ps1 est le fruit de ce travail. Vous trouverez une copie de ce script dans le dossier Scripts\Chapitre 10\ChangeLocalAdminPassword et en tlchargement sur le site www.pearsoneducation.fr. Pour lexcuter, il faut dnir le paramtre OUDN. Son argument doit tre le distinguishedName de lUO qui contient les serveurs dont le mot de passe de ladministrateur local doit tre modi. Voici la commande qui permet dexcuter le script ChangeLocalAdminPassword.ps1 :
PS D:\Scripts> .\ChangeLocalAdminPassword.ps1 "OU=Servers,OU=Managed Objects ,DC=companyabc,DC=com"
Les Figures 10.3 et 10.4 illustrent lexcution de ChangeLocalAdminPassword.ps1. Voici la suite des oprations ralises par le script ChangeLocalAdminPassword.ps1 : 1. Il charge le chier de bibliothque LibraryCrypto.ps1, qui propose une fonction permettant de gnrer des mots de passe alatoires. 2. Il cre un nouvel objet DataTable ($ServersTable) laide de la classe .NET System. Data.DataSet. Cet objet sera utilis pour enregistrer des informations dtat propos des machines de lUO prcise. 3. Il cre un journal derreurs nomm ChangeLocalAdminPassword_Errors.log en utilisant lapplet de commande Out-File. Ce journal permet de prsenter aux utilisateurs des informations dtailles concernant les erreurs. 4. Il se connecte au domaine douverture de session actuel en invoquant la fonction GetCurrentDomain. partir de lobjet retourn par cette fonction, il afche le nom du domaine sur la console PowerShell. Si la connexion choue, le script se termine. 5. Ensuite, le script vrie que lUO indique existe dans le domaine courant en appelant la fonction Get-ADObject. Si lUO nest pas valide, il se termine.
Chapitre 10
279
Figure 10.3
Modier le mot de passe de ladministrateur local.
Figure 10.4
Terminaison du script ChangeLocalAdminPassword.ps1.
280
Partie 3
6. Il utilise ensuite les fonctions Set-ChoiceMesssage et New-PromptYesNo pour demander lutilisateur sil souhaite un mot de passe gnr alatoirement ou le prciser. Pour les mots de passe alatoires, le script appelle la fonction New-RandomPassword de la bibliothque LibraryCrypto.ps1, en prcisant la longueur du mot de passe. Il est stock sous forme de chane scurise ($Password) et retourn lutilisateur pour quil le vrie. Pour les mots de passe indiqus par lutilisateur, le script emploie lapplet de commande Read-Host avec le paramtre AsSecureString an dobtenir le mot de passe et de lenregistrer dans une chane scurise ($Password). 7. Ensuite, le script utilise la classe .NET DirectoryServices.DirectoryEntry pour tablir une liaison avec lUO indique dans Active Directory, puis la classe .NET DirectoryServices.DirectorySearcher pour crer un objet $Searcher. La proprit SearchRoot de cet objet est lie lobjet dUO li. Une recherche LDAP est lance an de placer dans la variable $Computers tous les serveurs prsents dans lUO. 8. La classe System.Net.NetworkInformation.Ping permet ensuite au script de contacter chaque serveur indiqu dans la collection $Servers. Si un serveur rpond, une nouvelle ligne est alors ajoute dans lobjet DataTable ($ServersTable). Elle est constitue du nom du serveur et de ltat "En ligne". Si un serveur ne rpond pas, une nouvelle ligne est galement ajoute dans cet objet DataTable, mais son tat est x "Hors ligne". 9. Le script utilise nouveau la classe System.Net.NetworkInformation.Ping pour contacter chaque serveur indiqu dans la collection $Computers. Si un serveur rpond, une nouvelle ligne est alors ajoute dans lobjet DataTable ($ServersTable). Elle est constitue du nom du serveur et de ltat "En ligne". Si un serveur ne rpond pas, une nouvelle ligne est galement ajoute dans cet objet DataTable, mais son tat est x "Hors ligne". 10. La liste des serveurs et de leur tat est enregistre dans le journal des erreurs du script an de pouvoir y faire ensuite rfrence laide de lapplet de commande Out-File. 11. Ensuite, le script utilise la classe .NET System.Runtime.InteropServices.Marshal pour convertir la chane scurise contenue dans la variable $Password en une chane normale qui sera utilise plus loin dans le script. 12. Enn, pour chaque serveur "En ligne" prsent dans $ServersTable, lapplet de commande Get-WmiObject est utilise pour se connecter et obtenir une liste des comptes dutilisateurs. Le compte de ladministrateur local possde un identiant de scurit (SID, Security ID) qui se termine par "-500". Le script se lie ce compte laide du fournisseur ADSI WinNT et modie son mot de passe en utilisant la chane qui se trouve prsent dans la variable $Password.
Chapitre 10
281
$Crypto = new-object System.Security.Cryptography.RNGCryptoServiceProvider # Remplir un tableau doctets avec une squence de valeurs alatoires # diffrentes de zro et prsentant une qualit cryptographique leve. $Crypto.GetNonZeroBytes($Bytes) foreach ($Byte in $Bytes){ # Pour chaque octet, appliquer un modulo. $Password += $Chars[$Byte % ($Chars.Length - 1)] } # Retourner le mot de passe alatoire sous forme de SecureString. ConvertTo-SecureString "$Password" -AsPlainText -Force }
282
Partie 3
Comme nous lavons mentionn prcdemment, ChangeLocalAdminPassword.ps1 utilise la fonction New-RandomPassword du chier LibraryCrypto.ps1 pour gnrer des mots de passe alatoires de la taille indique, partir de lensemble des caractres autoriss. La fonction sappuie sur la classe .NET System.Security.Cryptography.RNGCryptoServiceProvider pour gnrer des nombres alatoires ayant une qualit cryptographique leve. Un gnrateur de nombres alatoires amliore la robustesse des mots de passe, mme ceux constitus de caractres et de nombres. La fonction New-RandomPassword utilise le gnrateur an dobtenir des caractres alatoires. Elle prend tout dabord la longueur indique et cre un tableau de System.Byte ($Bytes) de la mme taille. Elle dnit ensuite un tableau de caractres ($Chars) constitu de tous les caractres accepts dans les mots de passe. Puis, New-RandomPassword cre un gnrateur de nombres alatoires ($Crypto) laide de la classe System.Security.Cryptography.RNGCryptoServiceProvider. La mthode GetNonZeroBytes() utilise ensuite $Crypto pour remplir le tableau $Bytes avec une suite de valeurs alatoires diffrentes de zro, prsentant une qualit cryptographique leve. Pour chaque octet du tableau $Bytes, la fonction applique un modulo (le reste de la division dun nombre par un autre) an de dterminer le caractre du tableau $Chars qui doit tre ajout dans la variable $Password. Le rsultat nal est un mot de passe alatoire retourn lappelant sous forme dune chane scurise. Lextrait de code suivant contient len-tte du script ChangeLocalAdminPassword.ps1. Il fournit des informations sur le rle du script, sa date de dernire mise jour et son auteur. Juste aprs len-tte, nous trouvons le paramtre OUDN du script :
################################################## # ChangeLocalAdminPassword.ps1 # Ce script modie le mot de passe de ladministrateur local # sur les comptes dordinateurs dans. # # Cr le : 11/2/2006 # Auteur : Tyson Kopczynski ################################################## param([string] $OUDN)
Chapitre 10
283
284
Partie 3
PowerShell demande parfois deffectuer un choix avant de poursuivre une commande. Par exemple, comme nous lavons vu au Chapitre 4, "Signer du code", il peut demander une conrmation avant dexcuter un script qui nest pas sign par une entit approuve, en fonction de la stratgie dexcution en cours. Il peut galement attendre une conrmation avant dexcuter une commande lorsquune applet de commande est utilise avec loption conrm :
PS C:\> get-process | stop-process conrm Conrmer tes-vous sr de vouloir effectuer cette action ? Opration Stop-Process en cours sur la cible alg (2116) . [O] Oui [T] Oui pour tout [N] Non [U] Non pour tout [S] Suspendre [?] Aide(la valeur par dfaut est O ) :
Grce aux fonctions Set-ChoiceMessage et New-PromptYesNo, nous pouvons construire un menu doptions Oui ou Non et le prsenter aux utilisateurs sur la console PowerShell. La fonction Set-ChoiceMessage cre un ensemble dobjets de choix et est utilise avec la fonction New-PromptYesNo pour gnrer le menu. Pour cela, New-PromptYesNo invoque la mthode PromptForChoice() de lobjet $host.UI, qui nest quune implmentation de la classe System. Management.Automation.Host.PSHostUserInterface. Dans lextrait de code suivant, nous dnissons les variables qui seront employes par la suite dans le script. Par ailleurs, deux chiers de bibliothque sont chargs dans la porte du script. Le premier, LibraryGen.ps1, est une bibliothque gnrale qui contient les fonctions dutilisation du script et les fonctions Active Directory dveloppes au Chapitre 9, "PowerShell et Active Directory". Le second est la bibliothque LibraryCrypto.ps1 mentionne prcdemment. Elle fournit la fonction New-RandomPassword :
################################################## # Code principal. ################################################## #-------------------# Charger des bibliothques. #-------------------. .\LibraryGen.ps1 . .\LibraryCrypto.ps1
Chapitre 10
285
#-------------------# Dnir les variables de conguration. #-------------------$ScriptName = "ChangeLocalAdminPassword.ps1" $ScriptUsage = "Ce script modie le mot de passe de ladministrateur" ` local sur certaines machines." $ScriptCommand = "$ScriptName -OUDN valeur" $ScriptParams = "OUDN = Le distinguishedName de lUO o se trouvent" ` + " les machines." $ScriptExamples = "$ScriptName ""OU=Accounts,DC=companyabc,DC=com""" $ErrorLogName = $ScriptName + "_Errors.log" $Date = Date
Ltape suivant la dnition des variables du script et le chargement des bibliothques consiste vrier si lutilisateur a besoin dune aide et si le paramtre OUDN obligatoire a t dni :
#-------------------# Vrier les paramtres obligatoires. #-------------------if ($args[0] -match -(\?|(h|(help)))){ write-host Get-ScriptHeader $ScriptName $ScriptUsage Show-ScriptUsage $ScriptCommand $ScriptParams $ScriptExamples Return } if (!$OUDN){ write-host write-host Veuillez prciser dans quelle UO se trouvent les machines !" ` -Foregroundcolor Red write-host Get-ScriptHeader $ScriptName $ScriptUsage Show-ScriptUsage $ScriptCommand $ScriptParams $ScriptExamples Return }
286
Partie 3
Ensuite, le script cre un objet DataTable. Il sagit dun concept nouveau qui sappuie sur un objet .NET DataTable (il provient de la classe System.Data.DataTable, qui fait partie de larchitecture ADO.NET) :
#-------------------# Dnir le DataTable. #-------------------$ServersTable = new-object System.Data.DataTable $ServersTable.TableName = "Servers" [Void]$ServersTable.Columns.Add("Name") [Void]$ServersTable.Columns.Add("Status")
Les objets DataTable sont quivalents aux tables dune base de donnes, except quils se trouvent en mmoire. Les scripts peuvent se servir de ces tables pour conserver les donnes obtenues depuis dautres sources ou celles dnies manuellement. Dans ce script, un DataTable est utilis pour enregistrer les informations dtat des serveurs rcuprs dans Active Directory. Le script commence par crer un objet DataTable nomm $ServersTable en utilisant lapplet de commande New-Object et la classe System.Data. DataTable. Lorsquil est cr, le DataTable est vide et ne possde aucune structure. Nous devons donc la dnir avant de pouvoir y placer des donnes. Pour la structure de $ServersTable, le script invoque la mthode Add() an dajouter les colonnes Name et Status sa collection Columns. Plus loin, cette mme mthode Add() sera utilise pour ajouter des lignes de donnes la collection Rows de $ServersTable. Dans lextrait de code suivant, lapplet de commande Out-File cre un journal des erreurs et y crit des informations den-tte. Ensuite, la fonction Get-ScriptHeader est utilise pour signaler loprateur du script que la partie automation a dmarr :
#-------------------# Dbut du script. #-------------------# Commencer le journal des erreurs. $ScriptName + " Excut le : " + $Date | out-le $ErrorLogName write-host Get-ScriptHeader $ScriptName $ScriptUsage write-host
Chapitre 10
287
Le script doit prsent vrier si la connexion au domaine est valide. Pour cela, il se sert de la fonction Get-CurrentDomain. Si aucune connexion valide nexiste, le script se termine et retourne son code dtat. Dans le cas contraire, il poursuit son excution et afche le nom de domaine sur la console. Ensuite, il appelle la fonction Get-ADObject pour vrier si la chane contenue dans la variable $OUDN est un nom distinctif valide. Si la fonction retourne un objet, la variable est alors valide. Sinon, elle est considre comme invalide et le script se termine :
.{ trap{write-host `t "[ERREUR]" -Foregroundcolor Red; throw write-host $_ -Foregroundcolor Red; Break} write-host Vrication de la connexion au domaine" -NoNewLine # Tester la connexion au domaine. $Domain = Get-CurrentDomain # Afcher le nom du domaine. write-host `t $Domain.Name -Foregroundcolor Green } write-host Vrication du nom de lUO" -NoNewLine if (!(Get-ADObject "distinguishedName" $OUDN "organizationalUnit")){ write-host `t "Invalide ! -Foregroundcolor Red write-host Break } else{ write-host `t [OK] -Foregroundcolor Green }
Le code suivant correspond la procdure de dnition du mot de passe utilis. Tout dabord, le script demande lutilisateur si un mot de passe doit tre gnr ou sil va le prciser. Dans le premier cas, nous demandons la saisie de la taille du mot de passe. Ensuite, un mot de passe de la longueur indique est gnr par la fonction New-RandomPassword.
288
Partie 3
Si lutilisateur a choisi dindiquer le mot de passe, le script invoque lapplet de commande Read-Host avec loption AsSecureString :
#-------------------# Obtenir le mot de passe. #-------------------$Choices = Set-ChoiceMessage "Oui" " Non" $Prompt = New-PromptYesNo "Question : ` Dois-je gnrer un mot de passe alatoire ?" $Choices while(!$Password){ trap{write-host Veuillez saisir un nombre entier !" ` -Foregroundcolor Red; Continue} if ($Prompt -eq 0){ write-host [int]$Length = read-host Veuillez indiquer la longueur du mot de passe if ($Length -gt 0){ &{ $Temp = New-RandomPassword $Length write-host write-host Voici le nouveau mot de passe alatoire :" ` -Foregroundcolor White [System.Runtime.InteropServices.Marshal]::PtrToStringAuto( ` [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR( ` $Temp)) $Prompt = New-PromptYesNo "Question : ` Est-il correct ?" $Choices if ($Prompt -eq 0){ $Script:Password = $Temp } } } else{ write-host La longueur du mot de passe doit tre suprieure 0 !" ` -Foregroundcolor Red
Chapitre 10
289
Le script dispose donc du nouveau mot de passe. Il doit prsent obtenir la liste des machines dont le mot de passe est modier. Le code suivant se charge de cette tche. Grce la classe DirectoryServices.DirectorySearcher, il recherche les objets dordinateurs (les serveurs) qui se trouvent dans lUO. Ensuite, il contacte chacun deux et ajoute une ligne lobjet DataTable $ServersTable, constitue du dNSHostName du serveur et de son tat :
#-------------------# Obtenir les ordinateurs et leur tat. #-------------------write-host write-host "Obtention des informations sur les serveurs" -NoNewLine &{ trap{write-host `t "[ERREUR]" -Foregroundcolor Red; throw write-host $_ -Foregroundcolor Red; Break} $Root = new-object DirectoryServices.DirectoryEntry "LDAP://$OUDN" $Searcher = new-object DirectoryServices.DirectorySearcher $Searcher.SearchRoot = $Root $Searcher.PageSize = 1000 $SearchItem = "CN" $SearchValue = "*" $SearchClass = "Computer" $SearchCat = "*" $Searcher.Filter = "(&($($SearchItem)=$($SearchValue))(objectClass=$( ` $SearchClass))(objectCategory=$($SearchCat)))" $Script:Computers = $Searcher.FindAll()
290
Partie 3
} write-host `t "[OK]" -Foregroundcolor Green write-host Obtention des informations dtat" -NoNewLine $Computers | foreach-object -Begin {$i=0;} ` -Process {$Ping = new-object Net.NetworkInformation.Ping; &{$dNSHostName = $_.GetDirectoryEntry().dNSHostName.ToString(); trap{"[ERREUR] de ping : + $dNSHostName + $_ | out-le ` $ErrorLogName -Append; Continue}; $Result = $Ping.Send($dNSHostName); if ($Result.Status -eq Success){ ` [Void]$ServersTable.Rows.Add($dNSHostName, En ligne)} ` else{[Void]$ServersTable.Rows.Add($dNSHostName, "Hors ligne")}; $i = $i+1; write-progress -Activity "Contact des serveurs - $($dNSHostName)" ` -Status "Progression : ` -PercentComplete ($i / $Computers.Count * 100)}} write-host `t [OK] -Foregroundcolor Green # crire les informations dtat dans le journal des erreurs. $ServersTable | out-le $ErrorLogName Append
Ltape suivante modie les mots de passe sur tous les serveurs en ligne. Tout dabord, le script convertit en chane normale la chane scurise donne par la variable $Password. Ensuite, laide de la mthode Select() de DataTable, il place dans la variable $OnlineServers tous les objets dordinateurs qui correspondent des serveurs en ligne. Puis, il utilise WMI pour se connecter chacun deux, dterminer le compte Administrateur et lui affecter le mot de passe contenu dans la variable $Password :
write-host "Modication des mots de passe" -NoNewLine
$Password = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto( ` [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR( ` $Password)) $OnlineServers = $ServersTable.Select("Status = En ligne") foreach ($Server in $OnlineServers) { &{
Chapitre 10
291
write-progress -Activity "Obtention des utilisateurs - $($Server.Name)" ` -Status "Veuillez patienter..." $Users = get-wmiobject -ErrorVariable Err -ErrorAction ` SilentlyContinue Win32_UserAccount -Computer $Server.Name write-progress -Activity Obtention des utilisateurs - $($Server.Name) ` -Status "Termin -completed $True if ($Err.Count -ne 0){ [ERREUR] dobtention des utilisateurs : " + $Server.Name + " " + ` $Err | out-le ` $ErrorLogName -Append } else{ foreach ($User in $Users){ if ($User.SID.EndsWith("-500") -eq $True){ write-progress -Activity ` Modication du mot de passe - `$($User.Name) ` -Status Veuillez patienter... trap{[ERREUR] de modication du mot de passe : " + ` $Server.Name + " " + $_ | out-le ` $ErrorLogName -Append; Continue} $WinNTUser = new-object System.DirectoryServices.DirectoryEntry( ` "WinNT://" + $Server.Name + "/" + $User.Name) $WinNTUser.SetPassword($Password) $Null = $WinNTUser.SetInfo write-progress -Activity ` Modication du mot de passe - $($User.Name) ` -Status "Termin -completed $True } } } } } write-host `t [OK] -Foregroundcolor Green write-host write-host Le script est termin ! -Foregroundcolor Green write-host Consultez le chier $ErrorLogName en cas derreurs. ` -Foregroundcolor Yellow
292
Partie 3
En rsum
Au cours de ce chapitre, nous avons tudi deux scripts PowerShell qui ont t dvelopps pour rpondre des besoins dautomation trs forts. Dans le premier, nous avons dcouvert que PowerShell tait capable de sortir de son rle doutil dautomation et de rpondre un besoin scuritaire critique en remplaant le shell de Windows. Dans le second, nous avons vu quil pouvait tre un outil dautomation performant. Les deux scripts nont cependant fait quefeurer la surface des procdures dautomation possibles avec PowerShell. Comme nous lavons dj rpt maintes fois dans cet ouvrage, les possibilits de PowerShell sont sans limites. Ce chapitre constitue seulement un pas dans lexploration de PowerShell et de ses capacits.
11
Administrer Exchange avec PowerShell
Dans ce chapitre
m m m m m
Introduction Exchange Management Shell (EMS) Le script GetDatabaseSizeReport.ps1 Le script GetEvent1221Info.ps1 Le script ProvisionExchangeUsers.ps1
Introduction
Ce chapitre explique comment utiliser PowerShell pour administrer un environnement Exchange Server 2007. Ce logiciel se sert de PowerShell pour raliser des tches dautomation et de gestion au travers dEMS (Exchange Management Shell). Par ailleurs, nous prsentons le concept de composant logiciel enchable PowerShell, ce quest en ralit EMS. Enn, nous tudions trois scripts PowerShell qui prennent en charge la gestion dun environnement Exchange Server 2007 et nous prcisons comment les utiliser pour rpondre aux besoins dautomation.
294
Partie 3
EMS est une interface de gestion en ligne de commande conue pour ladministration et la conguration dun serveur. Puisquelle repose sur une plate-forme PowerShell, elle peut se connecter lenvironnement dexcution .NET (galement appel CLR, pour Common Language Runtime). Les tches qui devaient autrefois tre ralises manuellement dans
Chapitre 11
295
lapplication dadministration peuvent dsormais faire lobjet de scripts, ce qui apporte aux administrateurs une plus grande souplesse dans les activits rptitives. Dautre part, les administrateurs peuvent grer tous les aspects dExchange Server 2007, y compris la cration et la maintenance des comptes de courrier lectronique, la conguration des connecteurs et des agents de transport SMTP (Simple Mail Transport Protocol), ainsi que la dnition des proprits pour les enregistrements dans des bases de donnes. Toutes les tches dadministration dun environnement Exchange peuvent prsent tre accomplies depuis la ligne de commande. De plus, EMS peut tre utilis pour contrler des paramtres, crer des rapports, fournir des informations sur la sant des serveurs Exchange et surtout automatiser des tches frquentes. EMC est un outil graphique MMC 3.0 pour la visualisation et la modication de la conguration dun dploiement Exchange Server 2007. Alors que linterface dEMC tait analogue celle dESM (Exchange System Manager) dans les versions prcdentes dExchange, elle a t revue. Elle est dsormais mieux organise et plus facile apprhender. Puisque EMC est limit aux modications que les administrateurs peuvent effectuer, certains paramtres de conguration ne sont disponibles quau travers dEMS. EMS et EMC sappuient sur PowerShell pour raliser les tches dadministration. EMC nest quune interface graphique qui invoque EMS pour effectuer les tches. EMS nest quun composant logiciel enchable pour PowerShell. Par consquent, peu importe loutil employ par les administrateurs pour crer un rapport ou modier un paramtre, ils utilisent en ralit PowerShell.
296
Partie 3
nous voulons lutiliser dans PowerShell. Avant toute chose, nous devons lenregistrer dans linstallation de PowerShell laide de loutil .NET Framework Installer (installutil.exe) :
PS C:\Dev> set-alias IntUtil $Env:windir\Microsoft.NET\Framework\v2.0.50727\ installutil.exe PS C:\Dev> IntUtil MonPremierSnapin.dll Microsoft (R) .NET Framework Installation utility Version 2.0.50727.832 Copyright (c) Microsoft Corporation. Tous droits rservs. Excution dune installation traite avec transaction. ... Linstallation traite avec transaction est termine. PS C:\Dev>
Pour une version 64 bits de Windows, voici le chemin de loutil .NET Framework Installer :
PS C:\Dev> set-alias IntUtil $Env:windir\Microsoft.NET\Framework64\ v2.0.50727\installutil.exe
Une fois le composant logiciel enregistr, nous pouvons vrier son existence laide de lapplet de commande Get-PSSnapin et de son paramtre registered :
PS C:\Dev> get-pssnapin registered Name : MonPremierSnapin PSVersion : 1.0 Description : Pour devenir le matre du monde.
PS C:\Dev>
INFO La liste retourne par Get-PSSnapin est constitue uniquement des composants logiciels enchables enregistrs dans une installation PowerShell. Elle ne contient aucun des composants fournis par linstallation de base de PowerShell.
Chapitre 11
297
Aprs avoir vri lenregistrement du composant logiciel enchable, nous le chargeons dans la session PowerShell en utilisant lapplet de commande Add-PSSnapin :
PS C:\Dev> add-pssnapin MyFirstSnapin PS C:\Dev>
Lapplet de commande Get-PSSnapin nous permet ensuite de conrmer sa disponibilit dans la session PowerShell en cours :
PS C:\Dev> get-pssnapin Name : Microsoft.PowerShell.Core PSVersion : 1.0 Description : Ce composant logiciel enchable Windows PowerShell contient des applets de commande de gestion qui permettent de grer les composants de Windows PowerShell. Name : Microsoft.PowerShell.Host PSVersion : 1.0 Description : Ce composant logiciel enchable Windows PowerShell contient des applets de commande utilises par lhte Windows PowerShell. Name : Microsoft.PowerShell.Management PSVersion : 1.0 Description : Ce composant logiciel enchable Windows PowerShell contient des applets de commande de gestion qui permettent de grer les composants Windows. Name : Microsoft.PowerShell.Security PSVersion : 1.0 Description : Ce composant logiciel enchable Windows PowerShell contient des applets de commande qui permettent de grer la scurit de Windows PowerShell. Name : Microsoft.PowerShell.Utility PSVersion : 1.0 Description : Ce composant logiciel enchable Windows PowerShell contient des applets de commande utilitaires qui permettent de manipuler des donnes. Name : MonPremierSnapin PSVersion : 1.0 Description : Pour devenir le matre du monde.
PS C:\Dev>
298
Partie 3
Nous pouvons dsormais utiliser notre composant logiciel enchable MonPremierSnapin dans la session PowerShell. Cependant, si nous fermons cette session et en ouvrons une nouvelle, il faut nouveau charger le composant. Comme les alias, les fonctions et les variables, un composant logiciel enchable est, par dfaut, valide uniquement dans la session PowerShell courante. Pour quil persiste entre les sessions, il doit tre charg chaque dmarrage dune session PowerShell. Comme nous lavons expliqu au Chapitre 2, "Les fondamentaux de PowerShell", lutilisation dun prol PowerShell permet de rendre persistants les alias, les fonctions et les variables. Nous pouvons galement employer un prol pour charger un composant logiciel enchable dans nos sessions PowerShell. Une autre mthode consiste utiliser un chier console PowerShell ; ce chier de conguration a lextension .psc1. Il est constitu dinformations XML qui donnent la liste des composants logiciels enchables chargs au dmarrage de la session PowerShell. Pour crer un chier console, nous utilisons lapplet de commande Export-Console, comme le montre lexemple suivant qui cre MaConsole.psc1 :
PS C:\Dev> export-console MaConsole PS C:\Dev>
PowerShell peut ensuite utiliser ce document XML pour charger les composants logiciels enchables conformment une conguration prcdente de sa console. Pour cela, il suft de lancer PowerShell en dnissant le paramtre PSConsoleFile :
C:\>powershell.exe PSConsoleFile C:\Dev\MaConsole.psc1
Naturellement, nous ne souhaitons pas saisir cette commande chaque lancement de PowerShell. Nous pouvons donc crer un raccourci qui dmarre notre conguration personnelle de PowerShell. Cette mthode est analogue louverture dEMS depuis le menu Dmarrer de Windows.
Chapitre 11
299
Puisque EMS nest quun composant logiciel enchable pour PowerShell, il suft de le charger dans la session PowerShell pour pouvoir accder ses applets de commande :
PS C:\> add-pssnapin Microsoft.Exchange.Management.PowerShell.Admin PS C:\>
Cependant, le chargement du composant EMS et le dmarrage dEMS partir du menu Dmarrer de Windows ne sont pas totalement quivalents. Si nous chargeons simplement le composant logiciel enchable, nous ne disposons pas de la console dadministration personnalise dExchange. La session PowerShell ne ressemble pas et ne fonctionne pas comme EMS car le composant charge uniquement les applets de commande pour ladministration de lenvironnement Exchange. Pour que la session PowerShell ressemble EMS, nous devons excuter le mme script de conguration que celui vis par le raccourci du menu Dmarrer. Ce script, Exchange.ps1, se trouve dans le rpertoire par dfaut des binaires dExchange Server 2007 : C:\Program Files\Microsoft\Exchange Server\Bin.
Le script GetDatabaseSizeReport.ps1
GetDatabaseSizeReport.ps1 est le premier script tudi dans ce chapitre. Il gnre un rapport
sur la taille des bases de donnes des botes aux lettres dans un dploiement Exchange. Ce rapport contient les informations suivantes :
n n n n n
le nom du serveur d'une bote aux lettres ; le nom complet de la base de donnes, y compris celui du groupe de stockage ; le lecteur sur lequel se trouve la base de donnes ; l'espace disponible sur le lecteur, en gigaoctets ; la taille de la base de donnes, en gigaoctets.
300
Partie 3
Toute information concernant notre environnement rseau est utile. Cependant, lorsque nous utilisons Exchange, connatre la taille des bases de donnes des botes aux lettres, leur croissance, lespace disponible sur le lecteur hte et le comportement gnral des bases de donnes dans lenvironnement rseau peut permettre dviter certains problmes. Ce script a t dvelopp pour companyabc.com, une petite socit dont le rseau est compos de plusieurs centaines dutilisateurs et de deux serveurs Exchange. Les contraintes budgtaires nautorisent quune seule personne dans le service informatique. Elles nont galement pas permis lachat et linstallation dun logiciel de surveillance et de compte-rendu sur les systmes informatiques. Par consquent, le seul employ du service informatique ne disposait que de mthodes manuelles pour sassurer du fonctionnement des systmes et navait pas souvent le temps deffectuer une surveillance proactive. Les bases de donnes des botes aux lettres dExchange ont donc grossi jusqu empcher toute maintenance hors ligne et les disques hbergeant ces bases de donnes manquaient despace. Aprs avoir vit de justesse plusieurs dsastres, la direction de companyabc.com a demand au service informatique de trouver une solution pour amliorer la surveillance des bases de donnes Exchange. Ayant besoin dun moyen rapide, souple et bon march, lunique dveloppeur sest tourn vers les scripts et a demand le dveloppement de GetDatabaseSizeReport.ps1. Vous en trouverez une copie dans le dossier Scripts\Chapitre 11\GetDatabaseSizeReport et en tlchargement depuis le site www.pearsoneducation.fr. Lexcution de ce script ne ncessite aucun paramtre. Cependant, un paramtre facultatif, ExportFile, peut prciser le nom du chier CSV dans lequel sont enregistres les donnes du rapport. Voici la commande qui permet dexcuter le script GetDatabaseSizeReport.ps1 :
PS C:\Scripts> .\GetDatabaseSizeReport.ps1
Les Figures 11.1 et 11.2 illustrent son excution. Voici la suite des oprations effectues par le script GetDatabaseSizeReport.ps1 : 1. Le script cre deux objets DataTable : $ServersTable, qui enregistre les informations dtat des serveurs de botes aux lettres Exchange, et $ReportTable, qui contient le rapport sur la taille des bases de donnes. 2. Il cre un journal des erreurs nomm GetDatabaseSizeReport_Errors.log laide de lapplet de commande Out-File. Ce journal permet aux utilisateurs dobtenir des informations dtailles sur les erreurs.
Chapitre 11
301
Figure 11.1
Excution en cours du script GetDatabaseSizeReport.ps1.
Figure 11.2
Excution du script GetDatabaseSizeReport.ps1 termine.
302
Partie 3
3. Le script invoque lapplet de commande Get-MailboxServer pour obtenir une liste de tous les serveurs de botes aux lettres Exchange, qui est ensuite place dans la variable $MailboxServers. 4. Le script utilise la classe System.Net.NetworkInformation.Ping pour contacter chaque serveur de la collection $MailboxServers. Si un serveur rpond, une nouvelle ligne est alors ajoute dans lobjet $ServersTable. Elle est constitue du nom du serveur et de ltat "En ligne". Si un serveur ne rpond pas, une nouvelle ligne est galement ajoute dans cet objet $ServersTable, mais son tat est x "Hors ligne". 5. La liste des serveurs et de leur tat est enregistre dans le journal des erreurs du script an de pouvoir y faire ensuite rfrence laide de lapplet de commande Out-File. 6. Pour chaque serveur "En ligne" prsent dans $ServersTable, le script procde aux oprations suivantes : Lapplet de commande Get-MailboxDatabase est appele pour obtenir une liste de toutes les bases de donnes des botes aux lettres sur le serveur. Les informations Name, StorageGroupName et EdbFilePath de chaque base sont places dans la variable $Databases. Pour chaque base de botes aux lettres prsente dans la collection $Databases, le script invoque lapplet de commande Get-WmiObject an de runir des informations sur la taille de la base et lespace disponible sur le lecteur. Il ajoute ensuite $ReportTable une ligne qui contient le nom du serveur de botes aux lettres ($Server.Name), le nom de la base de donnes ($DBName), la lettre du lecteur hbergeant la base ($DBDriveName), lespace disponible ($DBDriveFreeSpace) et la taille de la base ($DBSize). 7. Le script exporte toutes les donnes de DataTable.
INFO Ce script et les autres scripts de ce chapitre ne pourront tre excuts quen utilisant une session PowerShell dans laquelle le composant logiciel enchable Microsoft.Exchange. Management.PowerShell.Admin a t charg.
$ReportTable
laide de la fonction
Export-
Le premier extrait de code contient len-tte du script GetDatabaseSizeReport.ps1. Il fournit des informations sur le rle du script, sa date de dernire mise jour et son auteur.
Chapitre 11
303
304
Partie 3
for ($i=0; $i -le $Data.Columns.Count-1; $i++){ $LogFile.Write($Data.Columns[$i].ColumnName) if ($i -lt $Data.Columns.Count-1){ $LogFile.Write(",") } } $LogFile.WriteLine() foreach ($Row in $Data.Rows){ for ($i=0; $i -le $Data.Columns.Count-1; $i++){ $LogFile.Write($Row[$i].ToString()) if ($i -lt $Data.Columns.Count-1){ $LogFile.Write(",") } } $LogFile.WriteLine() } $LogFile.Close() } }
Pour exporter les donnes, la fonction Export-DataTable sappuie sur la classe .NET System. IO.StreamWriter et cre $LogFile, un objet de la classe .NET TextWriter. Celui-ci permet dcrire un objet dans une chane ou des chanes dans un chier ou de srialiser un document XML. Dans ce script, $LogFile est utilis pour envoyer le contenu du DataTable dans le chier CSV (qui est cr en mme temps que $LogFile). Pour cela, la fonction ExportDataTable crit dans le chier CSV les noms des colonnes du DataTable, spars par une virgule (,). Ensuite, elle parcourt chaque ligne du DataTable et crit ses valeurs dans le chier CSV, en les sparant par une virgule (,). Si Export-DataTable est invoque sans prciser le nom du chier CSV, elle utilise la classe .NET System.Windows.Forms.saveFileDialog pour construire une bote de dialogue Enregistrer sous, qui permet dindiquer le nom et lemplacement de ce chier (voir Figure 11.3). Cet exemple illustre lune des nombreuses possibilits offertes PowerShell par Windows Forms pour collecter ou afcher des donnes.
Chapitre 11
305
Figure 11.3
Bote de dialogue Enregistrer sous fournie par Windows Forms.
Dans lextrait de code suivant, nous dnissons les variables qui seront utilises par la suite. Par ailleurs, la bibliothque LibraryGen.ps1 est charge de manire fournir les fonctions dutilisation du script :
################################################## # Code principal. ################################################## #------------------# Charger des bibliothques. #------------------. .\LibraryGen.ps1 #------------------# Dnir les variables de conguration. #------------------$ScriptName = "GetDatabaseSizeReport.ps1" $ScriptUsage = Ce script gnre un rapport sur la taille des bases" ` +de donnes Exchange." $ScriptCommand = "$ScriptName -ExportFile valeur" $ScriptParams = "ExportFile = Fichier CSV dexportation." $ScriptExamples = "$ScriptName ""rapport.csv""" $ErrorLogName = "GetDatabaseSizeReport.log" $Date = Date
306
Partie 3
Le code suivant cre les deux objets DataTable. Le premier se trouve dans $ServersTable et contient les informations sur le serveur. Le second est plac dans $ReportTable et contient les informations du rapport :
#-------------------# Dnir les DataTable. #-------------------$ServersTable = new-object System.Data.DataTable $ServersTable.TableName = "Servers" [Void]$ServersTable.Columns.Add("Name") [Void]$ServersTable.Columns.Add("Status") $ReportTable = new-object System.Data.DataTable $ReportTable.TableName = "Servers" [Void]$ReportTable.Columns.Add("Server") [Void]$ReportTable.Columns.Add("Database") [Void]$ReportTable.Columns.Add("Drive") [Void]$ReportTable.Columns.Add("FreeSpace") [Void]$ReportTable.Columns.Add("Size")
Puis, lapplet de commande Out-File cre un journal des erreurs et y crit des informations den-tte. Ensuite, la fonction Get-ScriptHeader signale loprateur du script que la partie automation a dmarr :
#-------------------# Dbut du script. #-------------------# Commencer le journal des erreurs. $ScriptName + " Excut le : " + $Date | out-le $ErrorLogName write-host Get-ScriptHeader $ScriptName $ScriptUsage write-host
Chapitre 11
307
Aprs lafchage de len-tte lutilisateur, la tche suivante du script consiste obtenir une liste des serveurs de botes aux lettres laide de lapplet de commande Get-MailboxServer. Ensuite, pour chaque objet prsent dans la variable $MailboxServers, il contacte le serveur correspondant an de dterminer son tat. Au cours de cette procdure, ltat obtenu et le nom du serveur sont crits dans une nouvelle ligne de lobjet $ServersTable :
#-------------------# Obtenir les serveurs et leur tat. #-------------------write-host "Obtention des serveurs de botes aux lettres" -NoNewLine $MailboxServers = get-mailboxserver write-host `t "[OK]" -Foregroundcolor Green write-host Obtention des informations dtat" -NoNewLine $MailboxServers | foreach-object -Begin {$i=0;} ` -Process {&{$Ping = new-object Net.NetworkInformation.Ping; $MBServerName = $_.Name; trap{"[ERREUR] de ping : + $MBServerName + $_ | out-le ` $ErrorLogName -Append; Continue}; $Result = $Ping.Send($MBServerName); if ($Result.Status -eq Success){ ` [Void]$ServersTable.Rows.Add($MBServerName, En ligne)} ` else{[Void]$ServersTable.Rows.Add($MBServerName, "Hors ligne")}; $i = $i+1; write-progress -Activity "Contact des serveurs - $($MBServerName)" ` -Status "Progression : ` -PercentComplete ($i / $MailboxServers.Count * 100)}} write-host `t [OK] -Foregroundcolor Green # crire les informations dtat dans le journal des erreurs. $ServersTable | out-le $ErrorLogName Append
La phase suivante consiste gnrer le rapport nal. Le script se sert de lapplet de commande Get-MailboxDatabase pour obtenir le EdbFilePath de chaque serveur Exchange en ligne. Ensuite, pour chaque base de donnes des botes aux lettres, le script utilise WMI pour connatre la taille de la base de donnes et lespace disponible sur le disque qui lhberge.
308
Partie 3
Toutes ces informations sont ensuite ajoutes dans une nouvelle ligne de lobjet $ReportTable (un DataTable) :
#------------------# Obtenir les informations pour le rapport. #------------------write-host "Obtention des informations pour le rapport" -NoNewLine $OnlineServers = $ServersTable.Select("Status = En ligne") foreach ($Server in $OnlineServers) { &{ trap{"[ERREUR] de cration du rapport : " + $Server.Name + " $_" | ` out-le $ErrorLogName -Append; Continue} write-progress ` -Activity Obtention des informations des bases de donnes - $($Server.Name)" ` -Status "Veuillez patienter..." $Databases = get-mailboxdatabase -Server $Server.Name | ` select Name, StorageGroupName, EdbFilePath foreach ($Database in $Databases){ &{ write-progress ` -Activity Obtention des informations sur le lecteur " + ` - $($Server.Name) ` -Status Veuillez patienter... $DBDriveName = $Database.EdbFilePath.DriveName $DBDrive = ` get-wmiobject Win32_PerfRawData_PerfDisk_LogicalDisk ` -Computer $Server.Name -Filter "Name = $DBDriveName" write-progress -Activity ` Obtention des informations sur la taille du lecteur " + ` - $($Server.Name) ` -Status Veuillez patienter... # \ doit tre remplac par \\. $DBPath = $Database.EdbFilePath.PathName.Replace("\","\\") $DBFile = get-wmiobject CIM_DataFile -Computer $Server.Name ` -Filter Name = $DBPath $DBName = $Database.StorageGroupName + \ + $Database.Name
Chapitre 11
309
# Les mgaoctets doivent tre convertis en gigaoctets. $DBDriveFreeSpace = $DBDrive.FreeMegabytes / 1000 # Les octets doivent tre convertis en gigaoctets. $DBSize = $DBFile.FileSize / 1073741824 [Void]$ReportTable.Rows.Add($Server.Name, $DBName, ` $DBDriveName, $DBDriveFreeSpace, $DBSize) } } write-progress -Activity ` Obtention des informations des bases de donnes - $($Server.Name)" ` -Status "Termin -completed $True } } write-host `t [OK] -Foregroundcolor Green
Pour nir, le script afche le rapport sur la console PowerShell laide de lapplet de commande Format-Table et exporte les donnes dans le chier CSV en invoquant la fonction Export-DataTable.
$ReportTable | format-table -groupBy Server Database, Drive, ` FreeSpace, Size -autosize $Null = Export-DataTable $ReportTable $ExportFile
Le script GetEvent1221Info.ps1
Les administrateurs peuvent utiliser le script GetEvent1221Info.ps1 pour effectuer des recherches dans les journaux dvnements dapplication des serveurs Exchange Server 2007 et gnrer un rapport qui contient les messages dont lidentiant dvnement est 1221. partir de ces messages, les administrateurs Exchange peuvent dterminer la quantit despace vide prsent dans une base de donnes pendant la dure indique (nombre de jours avant aujourdhui). Voici les points contenus dans le rapport :
n n
le nom du serveur des botes aux lettres ; la date et l'heure auxquelles l'vnement a t crit dans le journal Application ;
310
Partie 3
n n
le nom complet de la base de donnes, y compris le nom du groupe de stockage ; la quantit despace vide, en mgaoctets.
Ce script a t dvelopp pour companyabc.com, une socit de cinquante utilisateurs dont les botes aux lettres Exchange sont trs volumineuses (4 Go et plus). Cette entreprise produit des paquetages marketing constitus dimages numriques et dont la taille moyenne est suprieure 20 Mo. Les employs de companyabc.com travaillent domicile et dans diffrentes agences. Ils schangent gnralement les paquetages marketing par courrier lectronique au lieu de les poster dans un endroit partag. Puisque les employs utilisent leur bote aux lettres comme des systmes de chiers en ligne, la taille de ces botes a augment trs rapidement. Comprenant que des botes dune telle taille sont coteuses et difciles maintenir, ladministrateur Exchange de companyabc.com a demand que le contenu marketing soit enregistr localement sur les disques durs des utilisateurs et retir de leur bote aux lettres. Cette pratique a vit aux bases de donnes Exchange de grandir trop rapidement. Cependant, la frquence de suppression des messages lectroniques volumineux a engendr un autre problme : les bases de donnes Exchange sont remplies de vastes zones vides. La quantit despace vide est importante car lorsquune base de donnes Exchange a grandi, sa taille ne peut tre rduite tant que ladministrateur ne procde pas une dfrag-
Chapitre 11
311
mentation hors connexion. Par exemple, une base de donnes a atteint 12 Go, mais les utilisateurs ont supprim 3 Go de messages. Aprs une dfragmentation en ligne, les identiants dvnements 1221 indiquent un espace disponible de 3 Go. Les nouveaux messages crits dans la base utilisent cet espace et sa taille naugmente pas tant que tout cet espace nest pas utilis. La base de donnes occupe toujours 12 Go sur le disque dur, mme si elle ne contient que 9 Go de donnes. Si elle est plus volumineuse que ncessaire, elle risque daugmenter le temps ncessaire aux sauvegardes et aux restaurations. En examinant les vnements didentiant 1221, les administrateurs peuvent dterminer si une dfragmentation hors connexion est ncessaire pour rduire la taille de la base de donnes et amliorer les performances globales. Par ailleurs, en surveillant priodiquement ces vnements dans les journaux, les administrateurs suivent la quantit despace vide moyen dune base de donnes et dterminent plus facilement le schma de croissance des donnes relles dans la base. Grce cette information, ils sont en mesure de dcider du moment o un espace supplmentaire doit lui tre allou. Nayant pas le budget ncessaire pour acheter des outils Exchange, companyabc.com a demand le dveloppement dun script qui surveille lespace disponible dans les bases de donnes Exchange. Le script rsultant se nomme GetEvent1221Info.ps1. Vous en trouverez une copie dans le dossier Scripts\Chapitre 11\GetEvent1221Info et en tlchargement depuis le site www.pearsoneducation.fr. Lexcution de ce script ncessite la dnition dun paramtre. Largument du paramtre Days doit xer la priode (en nombre de jours) concerne par la recherche des vnements didentiant 1221 dans les serveurs des botes aux lettres. Largument du paramtre facultatif ExportFile prcise le nom du chier CSV dans lequel seront exportes les donnes du rapport. Voici la commande qui permet dexcuter le script GetEvent1221Info.ps1 :
PS C:\Scripts> .\GetEvent1221Info.ps1 5
Les Figures 11.4 et 11.5 illustrent son excution. Voici la suite des oprations ralises par le script GetEvent1221Info.ps1 : 1. Le script cre deux objets DataTable : $ServersTable, qui enregistre les informations dtat des serveurs de botes aux lettres Exchange, et $EventsTable, qui contient le rapport des vnements 1221.
312
Partie 3
Figure 11.4
Excution au cours du script GetEvent1221Info.ps1.
Figure 11.5
Excution du script GetEvent1221Info.ps1 termine.
Chapitre 11
313
2. Il cre un journal des erreurs nomm GetEvent1221Info _Errors.log laide de lapplet de commande Out-File. Ce journal permet aux utilisateurs dobtenir des informations dtailles sur les erreurs. 3. Le script invoque lapplet de commande Get-MailboxServer pour obtenir une liste de tous les serveurs de botes aux lettres Exchange, qui est ensuite place dans la variable $MailboxServers. 4. Le script utilise la classe System.Net.NetworkInformation.Ping pour contacter chaque serveur de la collection $MailboxServers. Si un serveur rpond, une nouvelle ligne est alors ajoute dans lobjet $ServersTable. Elle est constitue du nom du serveur et de ltat "En ligne". Si un serveur ne rpond pas, une nouvelle ligne est galement ajoute dans cet objet $ServersTable, mais son tat est x "Hors ligne". 5. La liste des serveurs et de leur tat est enregistre dans le journal des erreurs du script an de pouvoir y faire ensuite rfrence laide de lapplet de commande Out-File. 6. Pour chaque serveur "En ligne" prsent dans $ServersTable, le script procde aux oprations suivantes : La fonction Get-RemoteEventLog est appele de manire crer un objet ($Events) li au journal Application du serveur. Pour crer cet objet, elle utilise la classe .NET System.Diagnostics.Eventlog, qui permet une application ou un script dinteragir avec les journaux des vnements dune machine. Ensuite, le script invoque lapplet de commande Select-Object pour slectionner, partir de la proprit Entries de lobjet $Events, tous les vnements 1221 qui sont survenus pendant la priode indique ($Days). La collection dvnements rsultante est place dans la variable $1221Events. Pour chaque objet de la collection $1221Events, le script appelle sa mthode get_ timewritten() an denregistrer dans la variable $TimeWritten le moment de lvnement. Ensuite, une expression rgulire extrait du message de lvnement lespace libre ($MB) et le nom ($Database) de la base de donnes. Une ligne qui contient le nom du serveur ($Server.Name), la date de lvnement ($TimeWritten), le nom de la base de donnes ($Database) et lespace disponible en mgaoctets ($MB) est ajoute $EventsTable. 7. Le script exporte toutes les donnes de DataTable.
$EventsTable
laide de la fonction
Export-
314
Partie 3
Le premier extrait de code contient len-tte du script GetEvent1221Info.ps1. Il fournit des informations sur le rle du script, sa date de dernire mise jour et son auteur. Juste aprs len-tte, nous trouvons les paramtres du script :
################################################## # GetEvent1221Info.ps1 # Ce script exploite les vnements 1221 des serveurs des # botes aux lettres. # # Cr le : 26/10/2006 # Auteur : Tyson Kopczynski ################################################## param([int] $Days, [string] $ExportFile)
Ensuite, la fonction Get-RemoteEventLog est dnie. Elle collecte les informations EventLog dune machine distante en utilisant la classe System.Diagnostics.Eventlog. Puis, cest au tour de la fonction Export-DataTable, que nous avons dj rencontre la section prcdente :
################################################## # Fonctions. ################################################## #-----------------------------------------------# Get-RemoteEventLog #-----------------------------------------------# Usage : # # $Machine : # $Log : Recueillir les informations EventLog depuis une machine distante. Nom de la machine ("MonServeur"). Nom du EventLog ("Application").
function Get-RemoteEventLog{ param ($Machine, $Log) trap{Continue} new-object System.Diagnostics.Eventlog $Log, $Machine } #-----------------------------------------------# Export-DataTable #-----------------------------------------------# Usage : Exporter un DataSet dans un chier CSV. # $Data : Lobjet DataSet. # $FileName : Nom du chier CSV dexportation.
Chapitre 11
315
function Export-DataTable{ param ($Data, $FileName) $Null = ` [System.Reection.Assembly]::LoadWithPartialName( ` "System.Windows.Forms") trap{write-host "[ERREUR] $_" -Foregroundcolor Red; Continue} if ($FileName -eq ""){ $exFileName = new-object System.Windows.Forms.saveFileDialog $exFileName.DefaultExt = "csv" $exFileName.Filter = "CSV (Comma delimited)(*.csv)|*.csv" $exFileName.ShowDialog() $FileName = $exFileName.FileName } if ($FileName -ne ""){ $LogFile = new-object System.IO.StreamWriter($FileName, $False) for ($i=0; $i -le $Data.Columns.Count-1; $i++){ $LogFile.Write($Data.Columns[$i].ColumnName) if ($i -lt $Data.Columns.Count-1){ $LogFile.Write(",") } } $LogFile.WriteLine() foreach ($Row in $Data.Rows){ for ($i=0; $i -le $Data.Columns.Count-1; $i++){ $LogFile.Write($Row[$i].ToString()) if ($i -lt $Data.Columns.Count-1){ $LogFile.Write(",") } } $LogFile.WriteLine() } $LogFile.Close() } }
316
Partie 3
Dans lextrait de code suivant, nous dnissons les variables qui seront utilises par le script. Par ailleurs, la bibliothque LibraryGen.ps1 est charge de manire fournir les fonctions dutilisation du script :
################################################## # Code principal. ################################################## #-------------------# Charger des bibliothques. #-------------------. .\LibraryGen.ps1 #-------------------# Dnir les variables de conguration. #-------------------$ScriptName = "GetEvent1221Info.ps1" $ScriptUsage = "Ce script exploite les vnements 1221 des serveurs ` + "des botes aux lettres." $ScriptCommand = "$ScriptName -Days valeur -ExportFile valeur" $ScriptParams = "Days = Nombre de jours concerns par la recherche ` + "des vnements.", "ExportFile = Fichier CSV dexportation." $ScriptExamples = "$ScriptName 5 ""rapport.csv""" $ErrorLogName = "GetEvent1221Info.log" $Date = Date
Ensuite, le script vrie si lutilisateur a besoin dune aide. Si ce nest pas le cas, il sassure que le paramtre Days est dni. Sil ne lest pas, il informe loprateur du script que ce paramtre est obligatoire et afche les informations dutilisation :
#------------------# Vrier les paramtres obligatoires. #------------------if ($args[0] -match -(\?|(h|(help)))){ write-host Get-ScriptHeader $ScriptName $ScriptUsage Show-ScriptUsage $ScriptCommand $ScriptParams $ScriptExamples Return } if (!$Days){ write-host write-host Veuillez prciser le nombre de jours !" -Foregroundcolor Red
Chapitre 11
317
Le code suivant cre les deux objets DataTable. Le premier se trouve dans $ServersTable et contient les informations sur le serveur. Le second est plac dans $EventsTable et contient les informations du rapport :
#------------------# Dnir les DataTable. #------------------$ServersTable = new-object System.Data.DataTable $ServersTable.TableName = "Servers" [Void]$ServersTable.Columns.Add("Name") [Void]$ServersTable.Columns.Add("Status") $EventsTable = new-object System.Data.DataTable $EventsTable.TableName = "Servers" [Void]$EventsTable.Columns.Add("Server") [Void]$EventsTable.Columns.Add("TimeWritten",[DateTime]) [Void]$EventsTable.Columns.Add("Database") [Void]$EventsTable.Columns.Add("MB")
Puis, lapplet de commande Out-File cre un journal des erreurs et y crit des informations den-tte. Ensuite, la fonction Get-ScriptHeader signale loprateur du script que la partie automation a dmarr :
#------------------# Dbut du script. #------------------# Commencer le journal des erreurs. $ScriptName + " Excut le : " + $Date | out-le $ErrorLogName write-host Get-ScriptHeader $ScriptName $ScriptUsage write-host
318
Partie 3
La tche suivante consiste obtenir une liste des serveurs de botes aux lettres laide de lapplet de commande Get-MailboxServer. Ensuite, pour chaque objet prsent dans la variable $MailboxServers, nous contactons le serveur correspondant an de dterminer son tat. Au cours de cette procdure, ltat obtenu et le nom du serveur sont crits dans une nouvelle ligne de lobjet $ServersTable :
#------------------# Obtenir les serveurs et leur tat. #------------------write-host "Obtention des serveurs de botes aux lettres" -NoNewLine $MailboxServers = get-mailboxserver write-host `t "[OK]" -Foregroundcolor Green write-host Obtention des informations dtat" -NoNewLine $MailboxServers | foreach-object -Begin {$i=0;} ` -Process {&{$Ping = new-object Net.NetworkInformation.Ping; $MBServerName = $_.Name; trap{"[ERREUR] de ping : + $MBServerName + $_ | out-le ` $ErrorLogName -Append; Continue}; $Result = $Ping.Send($MBServerName); if ($Result.Status -eq Success){ ` [Void]$ServersTable.Rows.Add($MBServerName, En ligne)} ` else{[Void]$ServersTable.Rows.Add($MBServerName, "Hors ligne")}; $i = $i+1; write-progress -Activity "Contact des serveurs - $($MBServerName)" ` -Status "Progression : ` -PercentComplete ($i / $MailboxServers.Count * 100)}} write-host `t [OK] -Foregroundcolor Green # crire les informations dtat dans le journal des erreurs. $ServersTable | out-le $ErrorLogName Append
La phase suivante consiste gnrer le rapport nal. Le script invoque la mthode Select() de DataTable pour crer une collection des serveurs en ligne ($OnlineServers). Ensuite, pour chaque serveur de la collection $OnlineServers, il appelle la fonction GetRemoteEventLog an dobtenir tous les messages des vnements Application de ce serveur.
Chapitre 11
319
Pour chaque message dvnement 1221, une nouvelle ligne contenant ces informations mises en forme est ajoute lobjet DataTable dans $EventsTable :
#------------------# Obtenir les informations dvnement. #------------------write-host "Obtention des informations vnements" -NoNewLine $OnlineServers = $ServersTable.Select("Status = En ligne") foreach ($Server in $OnlineServers){ &{ trap{"[ERREUR] pour les informations dvnement : ` + "$Server.Name + " $_" | ` out-le $ErrorLogName -Append; Continue} $Events = Get-RemoteEventLog $Server.Name "Application" # Linstruction suivante peut demander beaucoup de temps # en fonction du nombre de serveurs. write-progress -Activity Collecte des vnements depuis ` + "- $($Server.Name)" ` -Status "Veuillez patienter..." $1221Events = $Events.Entries | where {$_.EventID -eq "1221" -and ` $_.TimeWritten -ge $Date.AddDays(-$Days)} foreach ($1221Event in $1221Events){ &{ $Message = $1221Event | select Message $TimeWritten = $1221Event.get_timewritten() # Cette expression rgulire extrait du message le nom # de la base de donnes. $Database = [Regex]::Match($Message, "[^"\r\n]*") $Database = $Database.Value.Replace(", "") # Cette expression rgulire extrait la quantit # despace vide. $MB = [Regex]::Match($Message, [0-9]+) [Void]$EventsTable.Rows.Add($Server.Name, $TimeWritten, ` $Database, $MB)
320
Partie 3
} } write-progress -Activity Collecte des vnements depuis ` + " - $($Server.Name)" ` -Status "Termin -completed $True } } write-host `t [OK] -Foregroundcolor Green
Pour nir, le script exporte les donnes de $EventsTable dans le chier CSV en invoquant la fonction Export-DataTable :
#-------------------# Exporter les donnes dans un chier CSV. #-------------------$Null = Export-DataTable $EventsTable $ExportFile write-host write-host "Le script a termin ! -Foregroundcolor Green write-host Consultez $ErrorLogName pour les erreurs. ` -Foregroundcolor Yellow
Le script ProvisionExchangeUsers.ps1
Grce au script ProvisionExchangeUsers.ps1, les administrateurs Exchange crent facilement et rapidement des comptes dutilisateurs dans des environnements Exchange Server 2007, partir dinformations dnies dans un chier CSV, dont voici la structure :
n n n n
prnom de lutilisateur ; nom de l'utilisateur ; alias de messagerie de l'utilisateur ; nom complet de la base de donnes.
Chapitre 11
321
En voici un exemple :
Prenom,Nom,Alias,BaseDonnees Stu,Gronko,sgronko,SFEX01\SG1\DB1 Caelie,Hallauer,challauer,SFEX02\SG2\DB2 Duane,Putnam,dputnam,SFEX02\SG2\DB2 Essie,Fea,efea,SFEX02\SG1\DB1 Rona,Trovato,rtrovato,SFEX01\SG1\DB2 Gottfried,Leibniz,gleibniz,SFEx01\SG1\DB1
Lorsque le code de ProvisionExchangeUsers.ps1 est modi, le format du chier CSV et les informations qui dnissent les comptes dutilisateurs peuvent tre ajusts nimporte quel environnement. Cette souplesse est importante pour rpondre aux besoins dautomation souvent volutifs. Ce script a t demand par companyabc.com au cours dun processus de plusieurs fusions qui ont conduit la cration de nombreux nouveaux comptes dutilisateurs avec messagerie. Le nombre de comptes crer et les variations dans les informations disponibles lors de la cration des comptes pour une fusion font que la meilleure solution a consist employer une mthode automatise qui pouvait tre adapte aux diffrents besoins. Pour rpondre aux contraintes de souplesse, le service informatique de companyabc.com a dvelopp le script ProvisionExchangeUsers.ps1. Vous en trouverez une copie dans le dossier Scripts\Chapitre 11\ProvisionExchangeUsers et en tlchargement depuis le site www.pearsoneducation.fr. Lexcution de ce script ncessite la dnition de trois paramtres. Largument du paramtre UPNSufx indique le sufxe de nom principal universel (UPN, universal Principal Name) pour les nouveaux comptes avec messagerie. Largument dOUDN prcise le distinguishedName de lUO dans laquelle les comptes doivent tre enregistrs. Largument dImportFile dsigne le chier CSV importer qui contient la liste des utilisateurs. Voici la commande qui permet dexcuter le script ProvisionExchangeUsers.ps1 :
PS C:\Scripts> .\ProvisionExchangeUsers.ps1 "companyabc.com" "OU=Accounts, DC=companyabc,DC=com" users.csv
322
Partie 3
Figure 11.6
Excution au cours du script ProvisionExchangeUsers.ps1.
Figure 11.7
Excution du script ProvisionExchangeUsers.ps1 termine.
Chapitre 11
323
Voici la suite des oprations effectues par le script ProvisionExchangeUsers.ps1 : 1. Le script cre un journal des erreurs nomm ProvisionExchangeUsers_Errors.log laide de lapplet de commande Out-File. Ce journal permet aux utilisateurs dobtenir des informations dtailles sur les erreurs. 2. Il se connecte au domaine douverture de session actuel en invoquant la fonction GetCurrentDomain. partir de lobjet retourn par cette fonction, il afche le nom du domaine sur la console PowerShell. Si la connexion choue, le script se termine. 3. Ensuite, le script vrie que lUO indique existe dans le domaine courant en appelant la fonction Get-ADObject. Si lUO nest pas valide, il se termine. 4. Il utilise lapplet de commande Test-Path pour vrier que le chier CSV dimportation est valide. Si ce nest pas le cas, le script se termine. 5. Le script emploie lapplet de commande Read-Host avec le paramtre AsSecureString an dobtenir le mot de passe des nouveaux comptes. La chane scurise obtenue est enregistre dans la variable $Password. 6. Il invoque lapplet de commande Import-Csv pour placer le contenu du chier CSV dans la variable $Users. 7. Pour chaque utilisateur dans la collection $Users, le script appelle lapplet de commande New-Mailbox pour crer un compte dutilisateur avec messagerie en fonction des informations du chier CSV et de celles fournies par lutilisateur. Les erreurs gnres pendant la cration du compte sont enregistres dans le journal des erreurs du script laide de lapplet de commande Out-File. Le premier extrait de code contient len-tte du script ProvisionExchangeUsers.ps1. Il fournit des informations sur le rle du script, sa date de dernire mise jour et son auteur. Juste aprs len-tte, nous trouvons les paramtres du script :
################################################## # ProvisionExchangeUsers.ps1 # Ce script cre des utilisateurs Exchange daprs le contenu # du chier CSV indiqu. # # Cr le : 10/21/2006 # Auteur : Tyson Kopczynski ################################################## param([string] $UPNSufx, [string] $OUDN, [string] $ImportFile)
324
Partie 3
Dans lextrait de code suivant, nous dnissons les variables qui seront utilises par la suite. Par ailleurs, la bibliothque LibraryGen.ps1 est charge de manire fournir les fonctions dutilisation du script :
################################################## # Code principal. ################################################## #-------------------# Charger des bibliothques. #------------------. .\LibraryGen.ps1 #------------------# Dnir les variables de conguration. #------------------$ScriptName = "ProvisionExchangeUsers.ps1" $ScriptUsage = "Ce script cre des utilisateurs Exchange daprs ` + "le contenu du chier CSV indiqu." $ScriptCommand = "$ScriptName -UPNSufx valeur -OUDN valeur -ImportFile valeur" $ScriptParams = "UPNSufx = Sufxe UPN des nouveaux utilisateurs.", ` "OUDN = Nom distinctif de lUO dans laquelle les utilisateurs sont crs.", ` "ImportFile = Fichier CSV importer." $ScriptExamples = "$ScriptName ""companyabc.com""" ` + " ""OU=Accounts,DC=companyabc,DC=com""" ` + " ""users.csv""" $ErrorLogName = "ProvisionExchangeUsers.log" $Date = Date
Ensuite, le script vrie si lutilisateur a besoin dune aide. Si ce nest pas le cas, il contrle si les paramtres UPNSufx, OUDN et ImportFile sont dnis. Sils ne le sont pas, il informe loprateur du script que ces paramtres sont obligatoires et afche les informations dutilisation :
#------------------# Vrier les paramtres obligatoires. #------------------if ($args[0] -match -(\?|(h|(help)))){ write-host Get-ScriptHeader $ScriptName $ScriptUsage Show-ScriptUsage $ScriptCommand $ScriptParams $ScriptExamples Return }
Chapitre 11
325
if (!$UPNSufx){ write-host write-host "Veuillez prciser le sufxe UPN ! -Foregroundcolor Red write-host Get-ScriptHeader $ScriptName $ScriptUsage Show-ScriptUsage $ScriptCommand $ScriptParams $ScriptExamples Return } if (!$OUDN){ write-host write-host Veuillez prciser lUO o crer les utilisateurs !" ` -Foregroundcolor Red write-host Get-ScriptHeader $ScriptName $ScriptUsage Show-ScriptUsage $ScriptCommand $ScriptParams $ScriptExamples Return } if (!$ImportFile){ write-host write-host Veuillez prciser le chier CSV importer !" ` -Foregroundcolor Red write-host Get-ScriptHeader $ScriptName $ScriptUsage Show-ScriptUsage $ScriptCommand $ScriptParams $ScriptExamples Return }
Puis, lapplet de commande Out-File cre un journal des erreurs et y crit des informations den-tte. Ensuite, la fonction Get-ScriptHeader signale loprateur du script que la partie automation a dmarr :
#------------------# Dbut du script. #------------------# Commencer le journal des erreurs. $ScriptName + " Excut le : " + $Date | out-le $ErrorLogName write-host Get-ScriptHeader $ScriptName $ScriptUsage write-host write-host Connexion au domaine NoNewLine
326
Partie 3
Le script doit ensuite vrier quil existe une connexion valide au domaine. Pour cela, il invoque Get-CurrentDomain. Sil nexiste aucune connexion valide, le script se termine et retourne son code dtat. Dans le cas contraire, il poursuit son excution et afche le nom de domaine sur la console :
.{ trap{write-host `t "[ERREUR]" -Foregroundcolor Red; throw write-host $_ -Foregroundcolor Red; Break} write-host Connexion au domaine -NoNewLine # Tester la connexion au domaine. $Domain = Get-CurrentDomain # Afcher le nom du domaine. write-host `t $Domain.Name -Foregroundcolor Green }
Nous vrions ensuite le nom distinctif dans la variable $OUDN. Pour cela, le script se sert de la fonction Get-ADObject. Elle se connecte Active Directory et recherche lUO par son nom distinctif. Si la fonction retourne un objet, lUO est valide. Sinon, lUO est considre comme invalide et le script se termine :
write-host "Vrication du nom de lUO" -NoNewLine if (!(Get-ADObject "distinguishedName" $OUDN "organizationalUnit")){ write-host `t "Invalide ! -Foregroundcolor Red write-host Break } else{ write-host `t [OK] -Foregroundcolor Green }
Chapitre 11
327
Le script vrie ensuite la validit du chier importer laide de lapplet de commande Test-Path :
write-host "Vrication du chier importer" -NoNewLine if (!(test-path $ImportFile -pathType Leaf)){ throw write-host `t "Invalide ! -Foregroundcolor Red } else{ write-host `t [OK] -Foregroundcolor Green }
Ensuite, pour obtenir le mot de passe de lutilisateur, il invoque lapplet de commande ReadHost avec loption AsSecureString :
#-------------------# Obtenir le mot de passe. #-------------------write-host $Password = read-host "Veuillez saisir le mot de passe" AsSecureString
Enn, le script cre les nouveaux comptes dutilisateurs en utilisant lapplet de commande New-Mailbox, les informations provenant du chier CSV et celles fournies par lutilisateur du script :
#------------------# Crer les botes aux lettres. #------------------write-host write-progress -Activity "Ajout des utilisateurs" ` -Status "Veuillez patienter..." $Users = import-csv $ImportFile $Users | foreach-object -Begin {$i=0;} -Process {$FName = $_.FName; $LName = $_.LName;
328
Partie 3
$Alias = $_.Alias; $Database = $_.Database; $UPN = $Alias + "@" + $UPNSufx; $Name = $FName + " " + $LName; $Null = new-mailbox -Name $Name -Database $Database ` -OrganizationalUnit $OUDN -UserPrincipalName $UPN ` -Password $Password -ResetPasswordOnNextLogon $True ` -Alias $Alias -DisplayName $Name -FirstName $FName ` -LastName $LName -ErrorVariable Err -ErrorAction ` SilentlyContinue; if ($Err.Count -ne 0){ ` [ERREUR] ajout de lutilisateur : " + $Alias + " " + $Err | ` out-le $ErrorLogName -Append}; $i = $i+1; write-progress -Activity "Ajout des utilisateurs" ` -Status "Progression : ` -PercentComplete ($i / $Users.Count * 100)} write-host Le script est termin ! -Foregroundcolor Green write-host Consultez le chier $ErrorLogName en cas derreurs. Foregroundcolor Yellow
En rsum
Nous venons de voir comment PowerShell pouvait servir administrer Exchange Server 2007, non seulement au travers des interfaces graphiques avec EMC, mais galement depuis la ligne de commande avec EMS. Exchange Server 2007 est la premire des nombreuses applications qui utiliseront PowerShell ainsi. Pour cela, elle sappuie sur les possibilits dextension de PowerShell laide des composants logiciels enchables. Grce eux, de nouvelles applets de commande deviennent disponibles aux utilisateurs de PowerShell et augmentent leur capacit administrer un dploiement Exchange. Les scripts tudis au l de ce chapitre sont une bonne dmonstration de ce que nous pouvons accomplir laide du composant logiciel enchable dExchange Server 2007. Grce ces exemples, vous savez prsent comment exploiter PowerShell pour obtenir des informations sur la taille dune base de donnes Exchange, calculer lespace vide dans une base de donnes et crer rapidement des comptes dutilisateurs avec messagerie lectronique. Mais les possibilits dadministration dExchange ne se bornent pas cela. Comme nous lavons rpt souvent, les tches ralisables avec PowerShell ne sont limites que par vos propres talents de dveloppement et dimagination.
Chapitre 11
329
Accepter le fait que les scripts peuvent accomplir de nombreuses tches constitue la premire tape dans la comprhension des possibilits de PowerShell. Avant de vous attaquer des besoins dautomation plus complexes, vous devez bien videmment comprendre PowerShell. Cependant, en faisant ce premier pas, vous avez commenc un voyage dexploration qui vous conduira utiliser PowerShell comme la imagin son quipe de dveloppement. Cet ouvrage vous a guid vers deux aspects de ce voyage. Tout dabord, vous avez compris ce quest PowerShell et comment lutiliser. Cependant, les informations de fond et les explications des caractristiques se sont limites quelques chapitres, focalises sur les sujets les plus importants la comprhension du fonctionnement de PowerShell. Ensuite, cet ouvrage a abord lutilisation de PowerShell sous un angle inhabituel. Au lieu dexpliquer toutes les nuances des caractristiques et de la syntaxe du langage de PowerShell, il a montr comment exploiter PowerShell. Pour cela, plusieurs chapitres ont compar lcriture de scripts Windows et de scripts PowerShell. Des exemples en ligne de commande et des scripts oprationnels ont t tudis, tant dans leur version VBScript que PowerShell. En procdant ainsi, vous avez pu mettre en relation vos connaissances des scripts Windows et les nouveaux concepts de PowerShell. Les deux derniers chapitres ont montr comment utiliser PowerShell pour rpondre diffrents besoins dautomation et pour administrer dExchange Server 2007. Comme lors des chapitres prcdents, lide centrale tait lapplication relle de PowerShell. Vous tes prsent arriv la n de cet ouvrage, mais votre voyage se poursuit. PowerShell fait partie des produits les plus intressants que Microsoft a crs depuis un certain temps. Jeffrey Snover et les autres membres de lquipe de PowerShell doivent tre flicits pour avoir identi un besoin et dvelopp loutil qui permet dy rpondre. Avec ladoption croissante de PowerShell par les applications de Microsoft et dautres fournisseurs, ltendue des possibilits de PowerShell va tre de plus en plus vidente et ne fera quaugmenter.
Index
Symboles
$Error, variable 93 $This, variable 85 $ (dollar), prxe 49 & (esperluette), oprateur dappel 33, 62, 260 -detailed, paramtre (applet de commande Get-Help) 44 -full, paramtre (applet de commande Get-Help) 44 ./, prxe excuter des scripts 107 ouvrir des chiers 34 .\\, prxe excuter des scripts 107 ouvrir des chiers 34 .NET Framework classes/mthodes statiques 73 rfrences entre crochets 72 rexion 74 tlcharger 23 .ps1, extension 62 [] (crochets) 72 [ADSI], type abrg 234 [WMI], type abrg 214 [WMIClass], type abrg 214 [WMISearcher], type abrg 215 ` (apostrophe inverse) 57 {} (accolades) 50
A
Accs informations de dossiers 147 de chiers 148 lecteurs 88, 146 PowerShell 26 Access Control Entry (ACE) 156 Accolades ({}) 50 ACE (Access Control Entry) 156 ActiveX Data Objects (ADO) 233 Active Directory Services Interfaces Voir ADSI Add-ACE, fonction 156 Add-Member, applet de commande 85 Add-PSSnapin, applet de commande 297 Administrateur, changer le mot de passe 290, 291 ADM (Group Policy Administrative Template) 105 ADO (ActiveX Data Objects) 233 ADSI (Active Directory Services Interfaces) 231 appartenance un groupe, scripts 260 dans PowerShell 234 dans WSH 233 objets crer 238 obtenir des informations sur 236 Afchage des information bloques 84
332
Index
Aide Get-Help, applet de commande 41 pour les applets de commande 39 Alias 53 applets de commande 56 crer 11 Denition, proprit 47 persistants 56 standards de nommage et 134 AllSigned, stratgie dexcution 101, 138 Apostrophe inverse (`) 57 Appartenance un groupe, VBScript vers PowerShell IsGroupMember.ps1, script 260 IsGroupMember.wsf, script 249 Appel de PowerShell depuis dautres shells 35 Applets de commande Add-Member 85 Add-PSSnapin 297 afcher la liste 45 alias 53 conventions de nommage 38 Copy-Item 174 dnition 30 Export-Alias 56 Export-Console 298 Export-CSV 260 Format-List 236 Format-Table 309 Get-ACL 152 Get-Alias 53 Get-AuthenticodeSignature 119 Get-ChildItem 89 Get-Command 39, 45 Get-Content 91 Get-ExecutionPolicy 104 Get-Help 41 Get-Item 147 Get-ItemProperty 90, 182 Get-MailboxDatabase 307 Get-MailboxServer 307, 318 Get-Member 74 Get-Process 27
Get-PSDrive 88, 147 Get-PSProvider 87 Get-PSSnapin 296 Get-WmiObject 210 Import-Alias 56 Import-Csv 174 informations daide 39 Join-Path 174 New-Alias 56 New-Mailbox 327 New-Object 71, 272, 286 New-PSDrive 92 Out-File 286, 306, 317, 325 paramtres communs 39 gestion des erreurs 95 Read-Host 288, 327 Remove-ItemProperty 183 Remove-PSDrive 92 Set-ACL 152 Set-Alias 56 Set-Aliases 56 Set-AuthenticodeSignature 117 Set-ExecutionPolicy 104 Set-ItemProperty 182 Set-Location 88 Test-Path 173, 259, 327 Update-TypeData 84 Write-Host 170 Applications compares aux shells 8 Denition, proprit 46 htes 100 Arguments 26 Assemblages, charger 272 Auto-signs, crer des certicats 113 Autorisations explicites 177 implicites 177 Autorisations, gestion VBScript vers PowerShell ProvisionWebFolders.ps1, script 177 ProvisionWebFolders.wsf, script 168 WSH contre PowerShell 157
Index
333
Autorits de certication racines de conance, magasin de certicats 120 Autorit de certication Voir CA
B
Bases de donnes des botes aux lettres espace vide, dterminer 320 taille, dterminer 309 Bash, shell 17 Blocs de signature 118 Botes aux lettres, bases de donnes espace vide, dterminer 320 taille, dterminer 309 Bonnes pratiques script concevoir 137 dvelopper 129 scurit 138 standardisation 140 Bourne, shell 17 Bourne Again Shell (Bash) 17
C
C, shell 17 CA (autorit de certication) 102 certicats signs, obtenir depuis 114 dnition 111 Certicats non autoriss, magasin de certicats 122 Certicats numriques auto-signs, crer 113 dnition 111 importer 117 obtenir 111 signs par une CA, obtenir 114 Chanes de commandes 10 ChangeLocalAdminPassword.ps1, script 291
Chargement assemblages 272 composants logiciels enchables 298 de source chiers de scripts 192 scripts 61 EMS 299 Choix du modle de dveloppement 126 Classes ManagementClass 214 ManagementObject 214 ManagementObjectSearcher 215 statiques 73 Clear-Inherit, fonction 153, 177 Clear-SD, fonction 155 Cl publique, cryptographie 110 CLI (interface en ligne de commande) 26 compare aux shells graphiques 8 naviguer 28 shells en tant que 8 types de commandes applets de commande 30 commandes natives 33 fonction shell 31 scripts 32 Code dentreprise, tablir une conance 123 public, tablir une conance 123 Commandes enchanes 10 enregistrer dans des scripts 62 formats 26 natives 33 types applets de commande 30 commandes natives 33 fonctions shell 31 scripts 32 Commentaires 130 Communs, paramtres, gestion des erreurs 95 Compltion automatique 28
334
Index
Composants logiciels enchables charger 298 conrmer la disponibilit 297 dnition 295 EMS, charger 299 enregistrer 296 persistants 298 vrier 296 Comptes dutilisateurs (Exchange 2007), crer 328 Condensat de message 111 Conance, tablir 123 Conguration console PowerShell 193 minimum pour PowerShell 22 Conrm, paramtre 137 Conrmation, invite de 284 Connexions distantes PowerShell 107 mthodes WMI 207 Contraintes, rassembler 128 Conventions de nommage 134 applets de commande 38 variables 49 Copy-Item, applet de commande 174 Couches dabstraction (ADSI) 232 CreateRegKey, fonction (VBScript) 188 CreateRegValue, fonction (VBScript) 189 Crer des comptes dutilisateurs (Exchange 2007) 328 Crochets ([]) 72 Cryptographie, cl publique 110 Cycle de vie du dveloppement, modle 126
Dnition de variables 49 DeleteRegKey, fonction (VBScript) 191 DeleteRegValue, fonction (VBScript) 191 Dlimiteurs 69, 71 Dveloppement logiciel contre criture de scripts 126 modle du cycle de vie 126 Dictionary, objet 241 Digital Command Language (DCL) 17 dir, commande 27 Distribution du code sign 123 Documentation de PowerShell 108 Dollar ($), prxe 49 DOSShell 18 Dossiers, accder aux informations 147 Drive, objet 147 Droits, principe des privilges moindres 138
E
diteurs approuvs, magasin de certicats 123 dition au clavier 28 EMC (Exchange Management Console) 295 Empreinte 111 EMS (Exchange Management Shell) 294 Enregistrement de composants logiciels enchables 296 Environnement de production, viter le dveloppement de scripts dans 128 orient objet compar un environnement orient texte 68 ETS (Extended Type System) 83 pipeline dans 70 environnement orient objet contre 68 pipeline dans 68 quipement rseau, shells dans 8
D
DCL (Digital Command Language) 17 Denition, proprit pour les alias 47 pour les applications 46 pour les fonctions 47 pour les scripts 47
Index
335
Erreurs $Error, variable 93 ErrorRecord, proprits 93 fatales 93 intercepter 96 throw, mot--cl 98 gestion ErrorAction et ErrorVariable, paramtres 95 intercepter les erreurs 96 throw, mot-cl 98 non fatales 93 grer 95 intercepter 96 ErrorAction, paramtre 95 ErrorRecord, objet 93 ErrorVariable, paramtre 95 Espaces dexcution 273 Espaces vides dans les bases de donnes des botes aux lettres, dterminer 320 Esperluette (&), oprateur dappel 33, 62, 260 ETS (Extended Type System) 83 Event ID 1221, messages (Exchange 2007) 320 Exchange 2007 automation 294 Event ID 1221 320 scripts GetDatabaseSizeReport.ps1 309 GetEvent1221Info.ps1 320 ProvisionExchangeUsers.ps1 328 Exchange Management Console (EMC) 295 Exchange Management Shell (EMS) 294 ExecuteGlobal, instruction (VBScript) 185 Excution de scripts 63, 107 Explorateur Windows, remplacer 267 Export-Alias, applet de commande 56 Export-Console, applet de commande 298 Export-CSV, applet de commande 260 Export-DataTable, fonction 309, 320
F
Fatales, erreurs 93 intercepter 96 throw, mot-cl 98 Fichiers accder aux informations 148 console pour les composants logiciels enchables persistants 298 Figer les informations de conguration 130 File, objet 148 FileSystem, fournisseur 146 FileSystemObject, objet 146 Folder, objet 147 Fonctions Add-ACE 156 Clear-Inherit 153, 177 Clear-SD 155 dnition 31 Denition, proprit 47 Export-DataTable 309, 320 FormatNumber 220 gestion des autorisations 153 Get-ADObject 255, 258, 287, 326 Get-CurrentDomain 255, 287, 326 Get-RegValue 194, 201 Get-RemoteEventLog 314, 318 Get-ScriptHeader 251, 286, 306, 317, 325 New-PromptYesNo 283 New-RandomPassword 282, 287 Ping 222 Remove-ACE 157 Remove-RegKey 198, 204 Remove-RegValue 199, 204 Set-ChoiceMessage 283 Set-Owner 154, 175
336
Index
Fonctions (suite) Set-RegKey 196 Set-RegValue 197 shell, commandes 31 Show-ScriptUsage 251 SubInACL, outil 148 Fonctions (VBScript) CreateRegKey 188 CreateRegValue 189 DeleteRegKey 191 DeleteRegValue 191 ReadRegValue 187 Format-List, applet de commande 236 Format-Table, applet de commande 309 FormatNumber, fonction 220 Fournisseurs 86 ADSI 231 FileSystem 146 lecteurs accder 88 monter 91 Registry 180 FSO, modle dobjet 146 Drive, objet 146 File, objet 148 FileSystemObject, objet 146 Folder, objet 147
Get-ExecutionPolicy, applet de commande 104 Get-Help, applet de commande 41 Get-Item, applet de commande 147 Get-ItemProperty, applet de commande 90, 182 Get-MailboxDatabase, applet de commande 307 Get-MailboxServer, applet de commande 307, 318 Get-Member, applet de commande 74 Get-Process, applet de commande 27 Get-PSDrive, applet de commande 88, 147 Get-PSProvider, applet de commande 87 Get-PSSnapin, applet de commande 296 Get-RegValue, fonction 194, 201 Get-RemoteEventLog, fonction 314, 318 Get-ScriptHeader, fonction 251, 286, 306,
317, 325
G
Gestion des erreurs Voir Erreurs, gestion Get-ACL, applet de commande 152 Get-ADObject, fonction 255, 258, 287, 326 Get-Alias, applet de commande 53 Get-AuthenticodeSignature, applet de commande 119 Get-ChildItem, applet de commande 89 Get-Command, applet de commande 39, 45 Get-Content, applet de commande 91 Get-CurrentDomain, fonction 255, 287, 326
Get-WmiObject, applet de commande 210 GetDatabaseSizeReport.ps1, script 309 GetEvent1221Info.ps1, script 320 globale, porte 59 GPO (Group Policy Object) xer les stratgies dexcution 105 remplacement du shell 267 Group Policy Administrative Template (ADM) 105 Group Policy Object (GPO) xer les stratgies dexcution 105 remplacement du shell 267
H
Hachage sens unique 111 Histoire des shells 20 de PowerShell 18
Index
337
I
Import-Alias, applet de commande 56 Import-Csv, applet de commande 174 Importation de certicats numriques 117 Inclusion dinstructions dans les scripts 131 de chiers de scripts en VBScript 185 Indicateurs explicites de porte 59 Informations bloques, afcher 84 dtat, fournir 134 de conguration emplacement 129 ger 130 variables dans 131 Installation de PowerShell 24 Instances dobjets .NET, crer 71 Interception des erreurs 96 Interface en ligne de commande Voir CLI Internes, variables 50 Interrogation des objets 74 Invites de conrmation 284 IsGroupMember.ps1, script 260 IsGroupMember.wsf, script 249
LibraryRegistry.ps1, script 205 LibraryRegistry.vbs, script 192 Lisibilit 134 Liste applets de commande 45 rpertoires 11 Locale, porte 59
M
Machines virtuelles, supervision MonitorMSVS.ps1, script 229 MonitorMSVS.wsf, script 222 Magasin de certicats Autorits de certication racines de conance 120 Certicats non autoriss 122 dnition 117 diteurs approuvs 123 Magasin de donnes, fournisseurs 86 lecteur accder 88 monter 91 Makecert, outil 113 ManagementClass, classe 214 ManagementObject, classe 214 ManagementObjectSearcher, classe 215 Masquer la console PowerShell 269 Mthodes dnition 30 statiques 73 Moniker, chanes 208 MonitorMSVS.ps1, script 229 MonitorMSVS.wsf, script 222 Montage dun lecteur 91 Mots de passe de ladministrateur local, changer 291
J
Join-Path, applet de commande 174, 175
K
Korn, shell 17
L
Lancement de PowerShell 26 Lecteurs accder 88, 146 dnition 88 monter 91
338
Index
N
Navigation dans une CLI 28 New-Alias, applet de commande 56 New-Mailbox, applet de commande 327 New-Object, applet de commande 71, 272,
286
New-PromptYesNo, fonction 283 New-PSDrive, applet de commande 92 New-RandomPassword, fonction 282, 287 Non fatales, erreurs 93 grer 95 intercepter 96
O
Objets crer avec ADSI 237 Dictionary 241 Drive 146 ErrorRecord 93 File 148 FileSystemObject 146 Folder 147 information, obtenir avec ADSI 235 type personnalis, crer 84 WshShell 180 Out-File, applet de commande 286, 306,
317, 325
Ouverture de chiers 34
P
Paramtres communs gestion des erreurs 95 liste 40 Conrm 137 dnition 26 dterminer 39 ErrorAction 95
ErrorVariable 95 obligatoires, vrier 132 valider 132 WhatIf, 135 Persistants alias 56 composants logiciels enchables 298 Ping, fonction 222 ping ICMP 222 Pipeline dans un environnement orient objet 70 dans un environnement orient texte 68 dnition 8 Voir aussi Commandes enchanes PKI (Public Key Infrastructure) 111 Point (.), oprateur dappel 175 Porte dnition 59 de script 60 globale 59 intercepter les erreurs 98 locale 59 prive 61 PowerShell ADSI dans 234 appeler depuis dautres shells 35, 37 conguration minimum 22 console, masquer 269 congurer 193 gestion des autorisations 157 du Registre 184 du systme de chiers 148 histoire 18 installer 24 lancer 26 rfrences du langage 107 scripts tablir une conance 123 signer 119 tlcharger 23
Index
339
VBScript vers appartenance un groupe 260 gestion du Registre 205 gestion du systme de chiers 177 supervision dune machine virtuelle 229 WMI dans Get-WmiObject, applet de commande 210 Prfrences, paramtres 52, 107 Prive, porte 61 Privilges moindres, principe des 138 Prols dnition 99 pour les composants logiciels enchables persistants 298 Tous les utilisateurs 99 Tous les utilisateurs pour un hte spcique 99 Utilisateur courant 100 Utilisateur courant pour un hte spcique 100 Projets, scripts en tant que 126 Proprits dnition 30 ErrorRecord, objet 93 ProvisionExchangeUsers.ps1, script 328 ProvisionWebFolders.wsf, script 168 PSBase 84 Pseudo-code 126 PSObject 83 PSShell.exe 269 PSShell.ps1, script 277 bureau avec Windows Forms 271 dployer 276 PSShell.exe 269 remplacement du shell de Windows 267 Public Key Infrastructure (PKI) 111 PVK Digital Certicate Files Importer 117
R
Raccourcis de commande Voir Alias Read-Host, applet de commande 288, 327 ReadRegValue, fonction (VBScript) 187 Rfrences .NET Framework 72 langage de PowerShell 107 Rexion 74 RegDelete, mthode (WSH) 183 Registre, gestion remplacement du shell 267 VBScript vers PowerShell 184 LibraryRegistry.ps1, script 205 LibraryRegistry.vbs, script 192 WSH contre PowerShell 184 Registry, fournisseur 180 Rgles daccs, construire 152 RegRead, mthode (WSH) 182 RegWrite, mthode (WSH) 182 RemoteSigned, stratgie dexcution 63,
102, 138
Remove-ACE, fonction 157 Remove-ItemProperty, applet de commande 183 Remove-PSDrive, applet de commande 92 Remove-RegKey, fonction 198, 204 Remove-RegValue, fonction 199, 204 Remplacement du shell 267 Rpertoires afcher la liste 11 utilisation du disque, dterminer 16 Restricted, stratgie dexcution 101 Rutilisabilit 133
340
Index
S
Scripts ChangeLocalAdminPassword.ps1 291 charger le source 61 commandes 32 concevoir 137 crer 62 Denition, proprit 47 dveloppement de logiciels contre 126 dvelopper 129 en tant que projets 126 Exchange 2007 GetDatabaseSizeReport.ps1 309 GetEvent1221Info.ps1 320 ProvisionExchangeUsers.ps1 328 excuter 63, 107 chiers charger 192 inclure dans VBScript 185 GetDatabaseSizeReport.ps1 309 GetEvent1221Info.ps1 320 inclure des instructions 131 IsGroupMember.ps1 260 IsGroupMember.wsf 249 LibraryRegistry.ps1 205 LibraryRegistry.vbs 192 MonitorMSVS.ps1 229 MonitorMSVS.wsf 222 objectifs 17 porte 60 ProvisionExchangeUsers.ps1 328 ProvisionWebFolders.ps1 177 ProvisionWebFolders.wsf 168 PSShell.ps1 277 bureau avec Windows Forms 271 dployer 276 PSShell.exe 269 remplacement du shell de Windows 267 scurit Voir Scurit standards professionnels 128 tester 128
SDDL (Security Descriptor Denition Language) 155 Scurit bonnes pratiques 138 connexions distantes PowerShell 107 scripts, excuter 107 signature de code Voir signature stratgies dexcution AllSigned 101 xer 104 RemoteSigned 102 Restricted 101 WSH 101 Security Descriptor Denition Language (SDDL) 155 Security Descriptor String Format 155 Squences dchappement 57 Set-ACL, applet de commande 152 Set-Alias, applet de commande 56 Set-AuthenticodeSignature, applet de commande 117 Set-ChoiceMessage, fonction 283 Set-ExecutionPolicy, applet de commande 104 Set-ItemProperty, applet de commande 182 Set-Location, applet de commande 88 Set-Owner, fonction 154, 175 Set-RegKey, fonction 196 Set-RegValue, fonction 197 Shells appeler PowerShell depuis 35 applications contre 8 Bash 17 Bourne 17 C 17 dnition 8 exemple dutilisation 11 graphiques 8 compars aux CLI 8 Windows en tant que 17
Index
341
histoire 20 Korn 17 remplacer 267 scripts exemple dutilisation 11 objectifs 17 Shells pour kiosques prsentation 8 PSShell.ps1, script 277 bureau avec Windows Forms 271 dployer 276 PSShell.exe 269 remplacement du shell Windows 267 scuriss, script PSShell.ps1 277 bureau avec Windows Forms 271 dployer 276 PSShell.exe 269 remplacement du shell de Windows 267 Show-ScriptUsage, fonction 251 Signatures numriques dnition 110 vrier 120 Voir aussi Signature de code Signature de code 102 bonnes pratiques 137 certicats numriques auto-signs, crer 113 importer 117 obtenir 111 signs par une CA, obtenir 114 dnition 110 tablir une conance 123 importance 109 scripts PowerShell 119 vrier 120 Somme de contrle 111 Standardisation 140 Standards professionnels pour les scripts 128 Statiques classes 73 mthodes 73
StdRegProv, classe (WMI) 186 Stockage commandes dans des scripts 62 expressions dans des variables 48 Stratgies dexcution AllSigned 101, 138 xer 104 RemoteSigned 102, 138 Restricted 101 Unrestricted 104, 109, 138 SubInACL, outil 148, 163 Systme de chiers, gestion VBScript vers PowerShell ProvisionWebFolders.ps1, script 177 ProvisionWebFolders.wsf, script 168 WSH contre PowerShell 148 Voir aussi Autorisations, gestion
T
Taille des bases de donnes de botes aux lettres, dterminer 309 Tlchargement .NET Framework 23 PowerShell 23 Test-Path, applet de commande 173, 259, 327 Test des scripts 128 Throw, mot-cl 98 Tous les utilisateurs, prol 99 Tous les utilisateurs pour un hte spcique, prol 99 Types abrgs 212 [ADSI] 234 [WMI] 214 [WMIClass] 214 [WMISearcher] 215 liste 213 dobjets personnaliss, crer 84 de donnes, ETS (Extended Type System) 83
342
Index
U
Unrestricted, stratgie dexcution 104, 109,
138
W
WhatIf, paramtre 135 Windows 17 Windows Forms 271 Windows Management Instrumentation Voir WMI Windows Script Host Voir WSH Windows Shell Replacement 267 WMI (Windows Management Instrumentation) dans PowerShell Get-WmiObject, applet de commande 210 dans WSH 208 mthodes de connexion 207 Write-Host, applet de commande 170 WshShell, objet 180 WSH (Windows Script Host) 18 ADSI dans 233 gestion des autorisations 157 du Registre 184 du systme de chiers 148 problmes de scurit 101 WMI dans 208
Update-TypeData, applet de commande 84 Utilisateur courant, prol 100 Utilisateur courant pour un hte spcique, prol 100 Utilisation du disque par les rpertoires, dterminer 16
V
Variables conventions de nommage 49 dnir 49 informations de conguration 131 internes 50 stocker des expressions dans 48 VBScript vers PowerShell appartenance un groupe 260 gestion du Registre 205 gestion du systme de chiers 177 supervision dune machine virtuelle 229 Vrication composants logiciels enchables 296 paramtres obligatoires 132 signatures numriques 120
X
xcopy, outil 163
PowerShell
Windows
PowerShell est un nouveau shell en ligne de commande et un langage de scripts exceptionnel, qui a t dvelopp par Microsoft pour donner aux informaticiens la possibilit dautomatiser et de personnaliser totalement les tches dadministration de leurs systmes. En exploitant lincroyable puissance de .NET Framework, PowerShell, avec sa syntaxe facile apprendre et ses outils labors, a t conu ds le dpart pour acclrer les dveloppements et offrir toute la puissance et la exibilit ncessaires une meilleure productivit. Avec cet ouvrage complet et riche en exemples, vous commencerez par acqurir les bases de linterface, vous constaterez ses liens avec lcriture classique des scripts Windows, puis vous exploiterez vos connaissances pour les appliquer au dveloppement de scripts PowerShell. Pour illustrer ses explications, lauteur fournit de nombreux exemples comments de scripts oprationnels. Il vous enseigne des mthodes PowerShell indites qui vous seront dune grande utilit pour administrer Windows Server, Active Directory et Exchange Server 2007. Tlchargez les codes source des exemples sur le site de Pearson Education France www.pearson.fr.
Niveau : Intermdiaire Programmation Conguration : Windows XP et ultrieur
TABLE DES MATIRES
Rfrence
Introduction aux shells et PowerShell Les fondamentaux de PowerShell Prsentation avance de PowerShell Signer du code Suivre les bonnes pratiques PowerShell et le systme de chiers PowerShell et le Registre PowerShell et WMI PowerShell et Active Directory Utiliser PowerShell en situation relle Administrer Exchange avec PowerShell
A propos de lauteur
Avec plus de neuf annes dexprience dans le domaine informatique, Tyson Kopczynski est devenu un spcialiste dActive Directory, des stratgies de groupe, des scripts Windows, de Windows Rights Management Services, de PKI et de la scurit des technologies de linformation. En tant que consultant pour Convergent Computing (CCO), il a travaill avec la nouvelle gnration de technologies Microsoft depuis leur dbut et a jou un rle essentiel dans le dveloppement des pratiques dcriture de scripts.
Pearson Education France 47 bis, rue des Vinaigriers 75010 Paris Tl. : 01 72 74 90 00 Fax : 01 42 05 22 17 www.pearson.fr
ISBN : 978-2-7440-4015-3