Vous êtes sur la page 1sur 350

PowerShell

Windows
Tyson Kopczynski

Rseaux et tlcom Programmation

Gnie logiciel

Scurit Systme dexploitation

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

Titre original : Windows PowerShell Unleashed

Traduction : Herv Soulard

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.

Table des matires


Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Notre public . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Organisation de ce livre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Conventions typographiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Partie I. Introduction PowerShell
Chapitre 1 Introduction aux shells et PowerShell . . . . . . . . . . . . . . . . . . . . . . . .

1 1 2 2

Rle du shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Historique des shells . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arrive de PowerShell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . En rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


Chapitre 2 Les fondamentaux de PowerShell . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

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

Table des matires

Windows PowerShell

Chapitre 3 Prsentation avance de 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

145 145 146 148 158 178

Table des matires

Windows PowerShell

Chapitre 7 PowerShell et le Registre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Grer le Registre depuis WSH et PowerShell . . . . . . . . . . . . . . . . . . . . . . . . . . . . De VBScript PowerShell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . En rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


Chapitre 8 PowerShell et WMI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

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 . . . . . . . . . . . . . . . . . . . . . . . .

Le script PSShell.ps1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Le script ChangeLocalAdminPassword.ps1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . En rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


Chapitre 11 Administrer Exchange avec PowerShell . . . . . . . . . . . . . . . . . . . . . .

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.

Zones de code en gris


Ces zones de code contiennent le code source de scripts, de chiers de conguration ou dautres lments qui ne sont pas excuts directement dans une session shell.

ATTENTION Les avertissements signalent des actions viter.

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

m Rle du shell m Historique des shells m Arrive de PowerShell


Les shells, ou interprteurs de commandes, sont indispensables aux systmes dexploitation car ils permettent deffectuer toutes sortes doprations, comme le parcours du systme de chiers, lexcution de commandes ou le lancement dapplications. Tout utilisateur dun ordinateur a t confront au shell, que ce soit en saisissant des commandes une invite ou en cliquant sur une icne pour faire dmarrer une application. Les shells sont incontournables lorsque vous utilisez un systme informatique. Au cours de ce chapitre, nous allons faire connaissance avec le shell et voir tout ce que nous pouvons en tirer. Pour cela, nous examinerons plusieurs commandes de base et nous les combinerons dans un script shell an den augmenter les possibilits. Ensuite, nous prsenterons lvolution des shells depuis ces trente-cinq dernires annes. Enn, nous donnerons les raisons de lexistence de PowerShell et ses implications pour les administrateurs systme et les auteurs de scripts.

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

Introduction aux shells et PowerShell

Premires utilisations du shell


De nombreuses commandes du shell, comme lafchage du contenu du rpertoire de travail, sont simples. Cependant, les shells peuvent rapidement devenir complexes lorsquon souhaite effectuer des traitements plus puissants. Lexemple suivant afche le contenu du rpertoire de travail :
$ ls apache2 bin etc include lib libexec man sbin share var

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

Introduction aux shells et PowerShell

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.

Premiers scripts shell


Lutilisation dun shell consiste saisir chaque commande, interprter la sortie, choisir lusage de ces donnes et combiner les commandes en un seul processus dpouill. Quiconque a dj examin des dizaines de chiers et ajout manuellement une seule ligne la n de chacun deux conviendra que les scripts sont aussi vitaux que lair que nous respirons. Nous avons vu comment enchaner des commandes dans un pipeline pour manipuler la sortie de la commande prcdente et comment crer un alias pour rduire la saisie. Les alias sont les petits frres des scripts shell et apportent la ligne de commande une part de la puissance des scripts, qui est sans commune mesure avec celle des alias.

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

Introduction aux shells et PowerShell

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

Introduction aux shells et PowerShell

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

Introduction aux shells et PowerShell

17

Historique des shells


Le premier interprteur de commandes largement utilis a t le shell Bourne. Il sagit de linterface utilisateur standard sur le systme dexploitation UNIX et ces systmes en ont encore besoin pour la phase dinitialisation. Ce shell robuste dispose des pipelines et de lexcution conditionnelle et rcursive des commandes. Il a t dvelopp par des programmeurs C pour des programmeurs C. Cependant, bien quil ait t crit par et pour des programmeurs C, le shell Bourne nutilise pas un style dcriture analogue ce langage. Cette absence de similitude avec le langage C a conduit la cration du shell C, lequel dispose des structures de programmation plus conformes C. Pendant quils crivaient un "meilleur" shell, les dveloppeurs ont dcid dajouter ldition de la ligne de commande et les alias de commandes (des raccourcis) pour rpondre la hantise de tout utilisateur dUNIX, cest--dire la saisie des commandes. Moins il a de caractres saisir, plus lutilisateur dUNIX est heureux. La majorit des utilisateurs dUNIX a apprci le shell C, mais, nanmoins, lapprentissage dun shell totalement nouveau sest rvl un vritable d pour certains. Cest pourquoi le shell Korn a t invent. Il a ajout certaines fonctionnalits du shell C au shell Bourne. Mais, puisque ce shell Korn tait un produit commercial, la communaut des logiciels open source avait besoin dun autre shell pour Linux et FreeBSD. Cest ainsi que le Bourne Again Shell, ou Bash, a t propos par la FSF (Free Software Foundation). Outre le dveloppement dUNIX et la naissance de Linux et de FreeBSD, dautres systmes dexploitation sont arrivs, avec leur propre shell. DEC (Digital Equipment Corporation) a sorti VMS (Virtual Memory System) pour concurrencer UNIX sur ses systmes VAX. Le shell de VMS se nommait DCL (Digital Command Language) et employait une syntaxe verbeuse, contrairement ses homologues UNIX. Par ailleurs, il ntait pas sensible la casse et ne disposait pas des pipelines. Puis, un moment donn, le PC est n. IBM a positionn cette machine sur le march des entreprises et Apple a repris une technologie matrielle similaire avec les consommateurs pour cible. Microsoft a cr DOS pour lIBM PC, en lui donnant le rle de noyau et de shell et en le dotant de certaines fonctionnalits des autres shells (la syntaxe des pipelines vient dUNIX). Aprs DOS est venu Windows, avec un shell graphique qui a depuis servi de base aux shells Microsoft. Malheureusement, les shells graphiques ont la rputation dtre difciles scripter et Windows a donc propos un environnement de type DOS. Il a t amlior par un nouvel excutable, cmd.exe la place de command.com, et par des fonctionnalits ddition

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

Introduction aux shells et PowerShell

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

Les fondamentaux de PowerShell

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

Les fondamentaux de PowerShell

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.

Comprendre linterface en ligne de commande


La syntaxe dutilisation de PowerShell en ligne de commande est analogue celle des autres shells dans le mme mode. Llment fondamental dune commande PowerShell est, bien entendu, son nom. Par ailleurs, une commande peut tre rendue plus spcique en utilisant des paramtres et leurs arguments. Voici les formats dune commande PowerShell :
[nom [nom [nom [nom de de de de commande] commande] -[paramtre] commande] -[paramtre] [paramtre] [argument1] commande] -[paramtre] [paramtre] [argument1],[argument2]

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

Les fondamentaux de PowerShell

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

Utiliser la ligne de commande


Comme pour tout shell en ligne de commande, nous devons apprendre nous dplacer dans la ligne de commande de PowerShell pour lutiliser efcacement. Le Tableau 2.1 donne la liste des oprations ddition associes aux diffrentes touches disponibles dans la console PowerShell.
Tableau 2.1 Fonctions ddition de la console de PowerShell
Touches
Flches vers la gauche et vers la droite Flches vers le haut et vers le bas Insr. Suppr. Espace arrire

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

Les fondamentaux de PowerShell

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

Les fondamentaux de PowerShell

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

Ensuite, excutons la fonction :


PS D:\Travail> ma-fonction-dir DBOGUER : 1+ ma-fonction-dir DBOGUER : ! CALL function ma-fonction-dir DBOGUER : 1+ function ma-fonction-dir {get-childitem | ft Mode,Name} ...

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

Les fondamentaux de PowerShell

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.

Le mme comportement se produit lorsquon indique explicitement une commande native :


PS C:\> notepad C:\monchier.txt PS C:\>

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

TTL=126 TTL=126 TTL=126 TTL=126

Chapitre 2

Les fondamentaux de PowerShell

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

Les fondamentaux de PowerShell

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

Comprendre les applets de commande


Les applets de commande (ou cmdlets) sont un lment essentiel de la puissance de PowerShell. Elles sont implmentes comme des classes gres (dveloppes avec .NET Framework), qui offrent un ensemble de mthodes parfaitement dni pour traiter les donnes. Le programmeur crit le code qui sexcute lors de lappel de lapplet de commande et le compile dans une DLL charge dans une instance de PowerShell au redmarrage du shell. Les applets de commande sont toujours nommes en respectant le format Verbe-Nom, o le verbe dnit lopration et le nom prcise lobjet concern par lopration. Comme vous lavez certainement not, la plupart des noms de PowerShell sont au singulier an de rendre PowerShell plus universel. En effet, une commande peut fournir une valeur ou un ensemble de valeurs et il est impossible de savoir lavance si le nom dune applet de commande doit tre pluriel. Par ailleurs, langlais nest pas trs cohrent dans son utilisation du pluriel.

Chapitre 2

Les fondamentaux de PowerShell

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

Les fondamentaux de PowerShell

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.

Quelques applets de commande utiles


Lorsquon dbute avec PowerShell, les applets de commande Get-Help et Get-Command se rvlent extrmement utiles. Dcrites dans les sections suivantes, elles vous aident explorer le fonctionnement de PowerShell et comprendre les commandes excutes.

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

Les fondamentaux de PowerShell

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.

Contenu de laide sur une applet de commande

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

Syntaxe Paramtres Type dentre Type de retour Erreurs fatales

Chapitre 2

Les fondamentaux de PowerShell

45

Tableau 2.3 Rubriques de laide de PowerShell (suite)


Rubrique
Erreurs non fatales

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

Exemples Liens connexes

Get-Command
Get-Command est galement trs utile, car elle afche la liste de toutes les applets de commande

disponibles dans une session PowerShell :


PS C:\> get-command CommandType ----------Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet ... PS C:\> Name ---Add-Content Add-History Add-Member Add-PSSnapin Clear-Content Clear-Item Clear-ItemProperty Clear-Variable Compare-Object Denition ---------Add-Content [-Path] <String[... Add-History [[-InputObject] ... Add-Member [-MemberType] <PS... Add-PSSnapin [-Name] <String... Clear-Content [-Path] <Strin... Clear-Item [-Path] <String[]... Clear-ItemProperty [-Path] <... Clear-Variable [-Name] <Stri... Compare-Object [-ReferenceOb...

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

Les fondamentaux de PowerShell

47

Avec une fonction, la proprit Denition donne le corps de la fonction :


PS C:\> get-command Prompt CommandType ----------Function Name ---prompt Denition ---------Write-Host ("PS " + $(Get-Lo...

PS C:\>

Avec un alias, nous obtenons la commande cible de lalias :


PS C:\> get-command write CommandType ----------Alias Name ---write Denition ---------Write-Output

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

Les fondamentaux de PowerShell

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.

Comprendre les variables


Une variable est un emplacement permettant de stocker des donnes. Dans la majorit des shells, les variables ne peuvent contenir que des donnes de type texte. Dans les shells labors et les langages de programmation, les donnes places dans des variables peuvent tre quasiment de nimporte quel type, de la chane de caractres des ensembles dobjets. De la mme manire, les variables de PowerShell acceptent de stocker des donnes quelconques. Pour dnir une variable PowerShell, nous devons la nommer avec le prxe $, lequel permet de diffrencier les variables des alias, des applets de commande, des noms de chiers et des autres lments du shell. Ce nom est sensible la casse et peut contenir toute combinaison de caractres alphanumriques (AZ et 09) et le caractre de soulignement (_). Mme sil nexiste aucune convention de nommage des variables, il est conseill de leur donner un nom qui rete le type des donnes contenues :
PS C:\> $MSProcesses = get-process | where {$_.company -match ".*Microsoft*"} PS C:\> $MSProcesses Handles ------68 715 647 522 354 NPM(K) -----4 21 19 11 17 PM(K) ----1712 27024 23160 31364 28172 WS(K) VM(M) ----- ----6496 30 40180 126 36924 109 30876 151 47612 482 CPU(s) -----0.19 58.03 18.69 6.59 36.22 Id -2420 3620 1508 3268 2464 ProcessName ----------ctfmon explorer iexplore powershell WINWORD

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

Les fondamentaux de PowerShell

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.

Tableau 2.4 Paramtres de prfrence de PowerShell


Nom
$DebugPreference

Valeur accepte Stratgie de commande

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

$MaximumAliasCount $MaximumDriveCount $MaximumErrorCount $MaximumFunctionCount $MaximumVariableCount $MaximumHistoryCount

Entier Entier Entier Entier Entier Entier

$ShouldProcessPreference

Stratgie de commande Boolen Stratgie de commande

$ProcessReturnPreference $ProgressPreference

$VerbosePreference

Stratgie de commande

Chapitre 2

Les fondamentaux de PowerShell

53

Comprendre les alias


Vous le remarquerez trs rapidement, lutilisation de PowerShell demande une saisie importante, moins que vous nexcutiez un script. Par exemple, ouvrons une console PowerShell et tapons la commande suivante :
PS C:\> get-process | where-object {$_.Company -match ".*Microsoft*"} | format-table Name, ID, Path Autosize

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

Les fondamentaux de PowerShell

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

Dcouvrir les applets de commande relatives aux alias


Plusieurs applets de commande permettent de dnir de nouveaux alias, dexporter, dimporter et dafcher les alias existants. Grce la commande suivante, nous pouvons obtenir toutes les cmdlets relatives aux alias :
PS C:\> get-command *-Alias CommandType ----------Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Name ---Export-Alias Get-Alias Import-Alias New-Alias Set-Alias Denition ---------Export-Alias [-Path] <String... Get-Alias [[-Name] <String[]... Import-Alias [-Path] <String... New-Alias [-Name] <String> [... Set-Alias [-Name] <String> [...

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.

Crer des alias persistants


Les alias crs avec New-Alias et Set-Alias ne sont valides que dans la session PowerShell en cours. Lorsque vous fermez cette session, les alias existants sont effacs. Pour que des alias persistent entre des sessions PowerShell, nous devons les dnir dans le chier prole.ps1 :

Chapitre 2

Les fondamentaux de PowerShell

57

set-alias new new-object set-alias time get-date ...

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:\>

Le Tableau 2.5 rcapitule les squences dchappement reconnues par PowerShell.


Tableau 2.5 Squences dchappement de PowerShell
Caractre
` `" `0 `a `b `f `n `r `t `v

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

Les fondamentaux de PowerShell

59

Comprendre les portes


Une porte est une frontire logique dans PowerShell qui isole lutilisation des fonctions et des variables. Les portes peuvent tre globales, locales, de scripts et prives. Elles fonctionnent comme une hirarchie, dans laquelle les informations sont hrites vers le bas. Par exemple, la porte locale a accs la porte globale, mais pas linverse. Les portes et leurs utilisations sont dcrites au l des sections suivantes.

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

Les fondamentaux de PowerShell

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"}

Enregistrons ce chier sous le nom Scripts dans notre exemple).

AfcherServicesArretes.ps1

dans un rpertoire (C:\

Chapitre 2

Les fondamentaux de PowerShell

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

Les fondamentaux de PowerShell

65

Ce script afche les rsultats suivants :


PS C:\> C:\Scripts\AfcherServicesArretes.ps1 N* Les services N* suivants sont arrts sur PLANX : Name ---NetDDE NetDDEdsdm NtLmSsp de... NtmsSvc DisplayName ----------DDE rseau DSDM DDE rseau Fournisseur de la prise en charge Stockage amovible

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

Prsentation avance de PowerShell

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

Prsentation avance de PowerShell

71

Puisque nous disposons du PID du processus (arrter) ce processus :


PS C:\> get-process bash | stop-process PS C:\>

bash,

voyons comment nous pouvons tuer

Conseils .NET Framework


Avant de poursuivre, vous devez connatre quelques dtails sur linteraction entre PowerShell et .NET Framework. Ces informations sont essentielles la comprhension des scripts qui seront prsents au cours des chapitres suivants.
Applet de commande New-Object
New-Object permet de crer une instance dun objet .NET. Pour cela, nous prcisons simplement le nom complet de la classe .NET de lobjet : PS C:\> $Ping = new-object Net.NetworkInformation.Ping PS C:\>

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

un nom de classe complet, par exemple ;

[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

Le Chapitre 8, "PowerShell et WMI", reviendra en dtail sur les types abrgs.

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

Prsentation avance de PowerShell

73

ReadAttributes WriteAttributes Write Delete ReadPermissions Read ReadAndExecute Modify ChangePermissions TakeOwnership Synchronize FullControl PS C:\>

Classes et mthodes statiques

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

Prsentation avance de PowerShell

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

Prsentation avance de PowerShell

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

Prsentation avance de PowerShell

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

Prsentation avance de PowerShell

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

Prsentation avance de PowerShell

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")

IPAddressToString Address AddressFamily ScopeId IsIPv6Multicast IsIPv6LinkLocal IsIPv6SiteLocal

: : : : : : :

64.191.203.30 516669248 Internetwork False False False

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.

Systme de types tendu

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

Prsentation avance de PowerShell

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

Comprendre les fournisseurs


La plupart des systmes informatiques servent stocker des donnes, gnralement dans une structure comme un systme de chiers. tant donn le volume de donnes enregistr dans ces structures, le traitement et la recherche dinformations peuvent tre complexes. Les shells offrent gnralement des interfaces, ou fournisseurs, pour interagir avec les magasins de donnes de manire prdnie. PowerShell dispose galement dun ensemble de fournisseurs pour prsenter le contenu des magasins de donnes, par le biais dun jeu dapplets de commande principales. Nous pouvons nous en servir pour parcourir et manipuler les donnes enregistres au travers dune interface commune. La commande suivante afche la liste des applets principales :
PS C:\> help about_core_commands APPLETS DE COMMANDE ChildItem Get-ChildItem APPLETS DE COMMANDE CONTENT Add-Content Clear-Content Get-Content Set-Content APPLETS DE COMMANDE DRIVE Get-PSDrive New-PSDrive Remove-PSDrive APPLETS DE COMMANDE ITEM Clear-Item Copy-Item Get-Item Invoke-Item Move-Item New-Item Remove-Item Rename-Item Set-Item APPLETS DE COMMANDE LOCATION Get-Location

Chapitre 3

Prsentation avance de PowerShell

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:\>

La commande suivante afche les fournisseurs PowerShell prdnis :


PS C:\> get-psprovider Name ---Alias Environment FileSystem Function Registry Variable Certicate PS C:\> Capabilities -----------ShouldProcess ShouldProcess Filter, ShouldProcess ShouldProcess ShouldProcess ShouldProcess ShouldProcess Drives -----{Alias} {Env} {C, D, E, F...} {Function} {HKLM, HKCU} {Variable} {cert}

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:\>

Accder aux lecteurs et aux donnes


Pour accder aux lecteurs PowerShell et leurs donnes, une solution consiste utiliser lapplet de commande Set-Location. Elle modie lemplacement de travail en slectionnant celui qui est indiqu, lequel peut tre un rpertoire, un sous-rpertoire, une pile demplacements ou un emplacement dans le Registre :
PS C:\> set-location hklm: PS HKLM:\> set-location software\microsoft\windows PS HKLM:\software\microsoft\windows>

Chapitre 3

Prsentation avance de PowerShell

89

Get-ChildItem

permet ensuite dafcher les sous-cls de la cl Windows :

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

CommonFilesDir ProductId WallPaperDir MediaPath ProgramFilesPath SM_AccessoriesName PF_AccessoriesName

: : : : : : :

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*

Rpertoire : Microsoft.PowerShell.Core\FileSystem::C:\WINDOWS\system32\ windowspowershell\v1.0\fr

Mode ----------------

LastWriteTime ------------19/09/2006 09:03 19/09/2006 09:03 19/09/2006 09:03

Length -----6397 3774 9403

Name ---about_alias.help.txt about_arithmetic_operators.help.txt about_array.help.txt

Chapitre 3

Prsentation avance de PowerShell

91

-------------

19/09/2006 19/09/2006 19/09/2006

09:03 09:03 09:03

17090 about_assignment_operators.help.txt 6227 about_associative_array.help.txt 4597 about_automatic_variables.help.txt

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

Pour cela, nous utilisons New-PSDrive :


PS C:\> new-psdrive -name PSScripts -root D:\Dev\Scripts -psp FileSystem Name ---PSScripts Provider -------FileSystem Root ---D:\Dev\Scripts CurrentLocation ---------------

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

La suppression dun lecteur se fait avec lapplet de commande Remove-PSDrive :


PS C:\> remove-psdrive -name PSScripts PS C:\> get-psdrive Name ---Alias C cert D E Env F Provider -------Alias FileSystem Certicate FileSystem FileSystem Environment FileSystem Root ---C:\ \ D:\ E:\ F:\ CurrentLocation ---------------

Chapitre 3

Prsentation avance de PowerShell

93

Function G HKCU HKLM U Variable PS C:\>

Function FileSystem Registry Registry FileSystem Variable

G:\ HKEY_CURRENT_USER HKEY_LOCAL_MACHINE U:\

software ...crosoft\windows

Comprendre les erreurs


Les erreurs PowerShell se rpartissent en deux catgories : fatales et non fatales. Comme leur nom le sous-entend, les erreurs fatales stoppent lexcution dune commande. Les erreurs non fatales sont gnralement signales sans que la commande soit arrte. Lorsque des erreurs se produisent, quel que soit leur type, elles sont ajoutes dans la variable $Error. Cette collection contient les erreurs gnres pendant la session PowerShell en cours. Lerreur la plus rcente se trouve dans $Error[0] et le nombre maximal derreurs est dni par $MaximumErrorCount, qui vaut par dfaut 256. Les erreurs contenues dans la variable $Error variable peuvent tre reprsentes par lobjet ErrorRecord. Il dtient les informations dexception, ainsi que dautres proprits permettant de comprendre lorigine dune erreur. Lexemple suivant montre les informations qui se trouvent dans la proprit InvocationInfo dun objet ErrorRecord :
PS C:\> $Error[0].InvocationInfo MyCommand ScriptLineNumber OffsetInLine ScriptName Line PositionMessage : : : : : : Get-ChildItem 1 -2147483648 dir z:

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

Exception FullyQualiedErrorId InvocationInfo

TargetObject

Chapitre 3

Prsentation avance de PowerShell

95

Grer les erreurs


Les mthodes de gestion des erreurs dans PowerShell vont de la plus simple la plus complexe. La plus simple consiste laisser PowerShell traiter lerreur. Selon le type de lerreur, la commande ou le script peut se terminer ou se poursuivre. Cependant, si le gestionnaire derreurs par dfaut ne rpond pas aux besoins, nous pouvons mettre en place une gestion derreurs plus complexe en employant les mthodes dcrites dans les sections suivantes.

Mthode 1 : prfrences dune applet de commande


Dans PowerShell, certains paramtres sont disponibles pour toutes les applets de commande. En particulier, les paramtres ErrorAction et ErrorVariable xent le traitement des erreurs non fatales :
PS C:\> get-childitem z: -ErrorVariable Err -ErrorAction SilentlyContinue PS C:\> if ($Err){write-host $Err -Foregroundcolor Red} Lecteur introuvable. Il nexiste aucun lecteur nomm z . PS C:\>

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

lerreur et poursuivre lexcution (action par dfaut).

n Inquire. Demander lutilisateur sil souhaite poursuivre, arrter ou suspendre lexcution. n Stop.

Stopper lexcution de la commande ou du script.

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 .

Mthode 2 : interception des erreurs


En cas derreur fatale, PowerShell afche par dfaut lerreur et stoppe lexcution de la commande ou du script. Pour mettre en place une gestion personnalise des erreurs fatales, il faut dnir un gestionnaire dexception qui empche que lerreur fatale (ErrorRecord) ne soit envoye au mcanisme par dfaut. Cette procdure sapplique galement aux erreurs non fatales, car PowerShell afche par dfaut lerreur et poursuit la commande ou le script. Pour dnir une interception, nous utilisons la syntaxe suivante :
trap ExceptionType {code; mot-cl}

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.

Lexception est nouveau leve et lexcution de la porte en cours sarrte.

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

Prsentation avance de PowerShell

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"

Voici la sortie produite par cet exemple :


PS C:\> .\traperreur2.ps1 Changer le lecteur pour z: [ERREUR] Lexcution de la commande sest arrte, car la variable denvironnement ErrorActionPreference a la valeur Stop : Lecteur introuvable. Il nexiste aucun lecteur nomm z . Termin PS C:\>

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.

Mthode 3 : mot cl throw


Dans PowerShell, nous pouvons gnrer nos propres erreurs fatales. Cela ne signie pas provoquer des erreurs en utilisant une syntaxe invalide, mais gnrer exprs une erreur fatale en utilisant le mot cl throw. Ainsi, lexemple suivant gnre une erreur lorsquun utilisateur excute le script MonParam.ps1 sans dnir le paramtre MonParam. Cette possibilit est trs utile lorsque des donnes provenant de fonctions, dapplets de commande, de sources de donnes, dapplications, etc., ne sont pas celles attendues et peuvent donc empcher lexcution correcte dun script ou dun ensemble de commandes.

Chapitre 3

Prsentation avance de PowerShell

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.

Le prol Tous les utilisateurs


Ce prol se trouve dans le chier %windir%\system32\windowspowershell\v1.0\prole.ps1. Les paramtres qui y sont dnis sont appliqus tous les utilisateurs PowerShell sur la machine courante. Si vous voulez congurer PowerShell pour lensemble des utilisateurs dune machine, vous devez modier ce prol.

Le prol Tous les utilisateurs pour un hte spcique


Ce prol se trouve dans le chier %windir%\system32\windowspowershell\v1.0\IdShell_ prole.ps1. Les paramtres qui y sont dnis sont appliqus tous les utilisateurs du shell en cours (par dfaut la console PowerShell). PowerShell reconnat le concept de shells, ou htes, multiples. Par exemple, la console PowerShell est un hte, que la majorit des utilisateurs emploient exclusivement. Cependant, dautres applications peuvent dmarrer une instance

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.

Le prol Utilisateur courant


Ce prol se trouve dans le chier %userprole%\Mes Documents\WindowsPowerShell\prole.ps1. Lutilisateur qui souhaite dnir ses propres paramtres de prol peut le faire dans ce chier. Les paramtres sont appliqus uniquement sa session PowerShell courante et naffectent pas les autres utilisateurs.

Le prol Utilisateur courant pour un hte spcique


Ce prol se trouve dans le chier %userprole%\My Documents\WindowsPowerShell\IdShell_ prole.ps1. Comme pour le prol Tous les utilisateurs pour un hte spcique, ce type de prol charge les paramtres uniquement pour le shell en cours. Cependant, ils sont propres lutilisateur.
INFO Lorsque vous dmarrez le shell pour la premire fois, un message signalant que les scripts sont dsactivs et quaucun prol nest charg peut safcher. Vous pouvez changer ce comportement en modiant la stratgie dexcution de PowerShell (voir la section suivante).

Chapitre 3

Prsentation avance de PowerShell

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

Prsentation avance de PowerShell

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

INFO Le Chapitre 4 reviendra en dtail sur les options de cette invite.

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 ) :

Fixer la stratgie dexcution


Pour changer de stratgie dexcution, nous devons employer lapplet de commande ExecutionPolicy :
PS C:\> set-executionpolicy AllSigned PS C:\> Set-

Lapplet de commande Get-ExecutionPolicy afche la stratgie dexcution en place :


PS C:\> get-executionpolicy AllSigned PS C:\>

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

Prsentation avance de PowerShell

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

Prsentation avance de PowerShell

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.

Mesures de scurit complmentaires


Les stratgies dexcution ne sont pas la seule mesure de scurit implmente par Microsoft dans PowerShell. Les chiers de scripts PowerShell qui ont lextension .ps1 ne peuvent pas tre excuts partir de lExplorateur Windows car ils sont associs Bloc-notes. Autrement dit, nous ne pouvons pas simplement double-cliquer sur un chier .ps1 pour lexcuter. Les scripts PowerShell doivent tre lancs depuis une session PowerShell en utilisant un chemin relatif ou absolu ou depuis linvite de commandes Windows en utilisant lexcutable de PowerShell. Par ailleurs, comme nous lavons expliqu au Chapitre 2, pour excuter ou ouvrir un chier du rpertoire courant depuis la console PowerShell, il est ncessaire de prxer la commande par .\ ou ./. Cela vite que des utilisateurs PowerShell lancent accidentellement une commande ou un script sans avoir prcis explicitement son excution. Enn, par dfaut, il nexiste aucune mthode pour se connecter PowerShell ou linvoquer distance. Cependant, cela ne signie pas quil est impossible dcrire une application qui accepte les connexions distantes PowerShell. En ralit, cela existe dj. Si vous souhaitez apprendre comment procder, tlchargez PowerShell Remoting depuis le site www.codeplex.com/powershellremoting.

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.

Quest-ce que la signature du code ?


En bref, la signature du code consiste signer numriquement des scripts, des chiers excutables, des DLL, etc., an de donner un certain niveau de conance au code, laquelle repose sur deux hypothses. Premirement, un code sign garantit quil na pas t modi ou corrompu depuis sa signature. Deuximement, la signature numrique sert prouver lidentit de lauteur du code, ce qui doit aider lutilisateur savoir sil peut excuter le code en toute scurit. Ces deux hypothses sont un moyen de garantir lintgrit et lauthenticit du code. Cependant, elles seules, elles nassurent pas la abilit du code sign. Pour quelles soient valides, nous avons besoin de la signature numrique et de linfrastructure qui dnit un mcanisme didentication de lorigine de la signature. Les signatures numriques reposent sur une cryptographie cls publiques, avec des algorithmes de chiffrement et de dchiffrement. Ces algorithmes gnrent une paire de cls constitue dune cl prive et dune cl publique. La cl prive reste secrte et seul son propritaire y a accs. La cl publique peut tre donne dautres entits, au travers dune forme dinteraction scurise. Selon le type dinteraction, une cl sert verrouiller (chiffrer) la communication et lautre sert la dbloquer (dchiffrer). Dans le cas des signatures numriques, la cl prive est utilise pour gnrer la signature, tandis que la cl publique permet de valider la signature gnre. Voici la procdure mise en uvre : 1. Un code de hachage sens unique du contenu (document, code, etc.) signer est gnr en utilisant un condensat (digest) cryptographique. 2. Le code de hachage est ensuite chiffr laide de la cl prive, an dobtenir la signature numrique. 3. Le contenu est ensuite envoy au destinataire.

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.

Obtenir un certicat de signature du code


Il existe deux manires dobtenir un certicat de signature du code : gnrer des certicats auto-signs et utiliser une autorit de certication dans une infrastructure cls publiques (PKI, Public Key Infrastructure) valide. Un certicat auto-sign est plus simple et plus rapide gnrer. Il a galement lavantage dtre gratuit. Cependant, aucun tiers nen vrie lauthenticit, ce qui noffre donc pas le niveau de conance attendue pour une signature de code. Par consquent, aucune autre entit ne fera par dfaut conance votre certicat. Pour distribuer votre script ou votre chier de

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.

Mthode 1 : certicat auto-sign


La cration dun certicat auto-sign sappuie sur lutilitaire makecert fourni avec le kit de dveloppement (SDK, Software Development Kit) pour .NET Framework. En voici les tapes : 1. Tlchargez la dernire version du Microsoft .NET Framework SDK ladresse http:// msdn2.microsoft.com/fr-fr/netframework/aa569263.aspx. Au moment de lcriture de ces lignes, il sagit de la version 3.0. 2. Installez le SDK sur la machine o vous souhaitez gnrer le certicat auto-sign. 3. Reprez lemplacement de loutil makecert sur votre systme. Par dfaut, il sagit du rpertoire C:\Program Files\Microsoft SDKs\Windows\v6.0. 4. Ouvrez une invite de commande Windows et allez dans le rpertoire de makecert laide de la commande cd. 5. Crez un certicat auto-sign :
makecert -r -pe -n "CN=NomCommunAutoriteCertication" -b 01/01/2000 -e 01/01/2099 eku 1.3.6.1.5.5.7.3.3 -ss My

Vous devez obtenir le rsultat suivant :


C:\Program Files\Microsoft SDKs\Windows\v6.0>makecert -r -pe -n "CN=Mon autorite de signature du code" -b 01/01/2000 -e 01/01/2099 -eku 1.3.6.1.5.5.7.3.3 -ss My Succeeded

114

Partie 1

Introduction PowerShell

6. Enn, saisissez la commande PowerShell suivante pour vrier linstallation du certicat :


PS C:\> get-childitem cert:\CurrentUser\My -codesign

Directory: Microsoft.PowerShell.Security\Certicate::CurrentUser\My

Thumbprint ---------944E910757A862B53DE3113249E12BCA9C7DD0DE

Subject ------CN=Mon autorite de signature du code

PS C:\>

Mthode 2 : certicat sign par une CA


Cette mthode sappuie sur lobtention dun certicat partir dune autorit de certication Microsoft Windows. Ces tapes supposent quune PKI a t dploye dans votre entreprise. Si ce nest pas le cas, linstallation des services de certicats Windows pour rpondre votre besoin immdiat est dconseille. Procdez comme suit pour obtenir un certicat de signature du code : 1. Demandez votre administrateur PKI de crer et dactiver un modle de certicat de signature du code pour vos scripts et vos chiers de conguration PowerShell. 2. partir dInternet Explorer, allez sur le site des services dinscription Web de lautorit de certication ladresse https://NomServeurCA/certsrv (en remplaant NomServeurCA par le nom de votre serveur). 3. Cliquez sur le lien Demander un certicat. 4. Sur la page Demander un certicat, cliquez sur le lien Demande de certicat avance. 5. Sur la page Demande de certicat avance, cliquez sur le lien Crer et soumettre une demande de requte auprs de cette Autorit de certication. 6. Dans la section Modle de certicat, slectionnez le certicat de signature du code cr par votre administrateur PKI. 7. Saisissez les informations didentication manquantes et les options de demande de certicat conformment la stratgie de votre entreprise. Vous pouvez utiliser la Figure 4.1 comme aide. 8. Cliquez sur le bouton Envoyer. 9. Dans la bote de message Violation de script potentielle qui safche (voir Figure 4.2), cliquez sur Oui pour continuer.

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

Subject ------E=Richard.Stallman@goodcode.com, C...

PS C:\>

Chapitre 4

Signer du code

117

Loutil dimportation de chiers de certicats


Lorsquun certicat numrique est gnr, la cl prive est parfois enregistre dans un chier PVK (Private Key) et le certicat numrique correspondant est plac dans un chier SPC (Software Publishing Certicate). Par exemple, si le certicat de signature du code a t obtenu auprs de Verisign ou de Thawte, il est envoy au client sous la forme dun chier SPC et dun chier PVK. Si vous souhaitez employer ce certicat pour signer numriquement des scripts ou des chiers de conguration PowerShell, vous devez importer les chiers SPC et PVK dans votre magasin de certicats personnels.
INFO Un magasin de certicats est un emplacement sur votre ordinateur ou sur un priphrique dans lequel sont stockes les informations concernant les certicats. Sous Windows, vous pouvez utiliser la console MMC Autorit de certication pour afcher le magasin dun utilisateur, dun ordinateur ou dun service. Votre magasin de certicats personnels fait rfrence votre propre magasin dutilisateur.

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"

Signer des scripts


La signature dun script PowerShell se fait laide de lapplet de commande Set-AuthenticodeSignature, qui attend deux paramtres obligatoires. Le premier, lePath, est le chemin et le nom de chier du script signer numriquement. Le second, certicate, dsigne le certicat X.509 utilis pour signer le script. Pour que le certicat X.509 soit dans un

118

Partie 1

Introduction PowerShell

format reconnu par Get-ChildItem :

Set-AuthenticodeSignature,

nous devons lobtenir par le biais de

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.

Vrier des signatures numriques


Pour vrier la signature dun script ou dun chier de conguration PowerShell, nous devons utiliser lapplet de commande Get-AuthentiCodeSignature. Elle retourne un tat de validit, comme HashMismatch, qui indique lexistence ou non dun problme avec le chier. tat valide :
PS C:\Scripts> Get-AuthenticodeSignature ScriptSigne.ps1

Rpertoire : C:\Scripts

SignerCerticate ----------------661BC0A2A11850CEF4862F97D7335B40FCCCCF06

Status -----Valid

Path ---ScriptSigne.ps1

PS C:\Scripts> .\ScriptSigne.ps1 Ce script est sign! PS C:\Scripts>

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.

Distribuer du code sign


Lorsquun script ou un chier de conguration PowerShell sign est distribu, lutilisateur doit dterminer sil peut faire conance au code dun diteur particulier. La premire tape consiste valider lidentit de lditeur en fonction dune chane de conance. Pour tablir celle-ci, lutilisateur se sert du certicat de signature de code de lditeur associ la signature numrique et vrie que le propritaire du certicat est lditeur. Par exemple, la Figure 4.5 prsente un chemin (ou chane) de certication non interrompu et valide, partir du certicat de lditeur vers une autorit de certication racine approuve.Lorsquune autorit de certication racine publique ou interne approuve constitue lautorit principale de conance du certicat de lditeur, lutilisateur fait explicitement conance lidentit de lditeur. Si une autorit de certication racine est approuve, le certicat de cette autorit se trouve dans le magasin Autorits de certication racines de conance (voir Figure 4.6). Lorsquune autorit de certication racine nest pas une autorit principale de conance ou lorsque le certicat est auto-sign, lutilisateur doit dcider sil peut faire conance lidentit annonce par lditeur. Si cest le cas, le certicat de lautorit de certication racine ou le certicat auto-sign doit tre ajout au magasin Autorits de certication racines de conance pour tablir une chane de conance valide. Aprs vrication ou approbation de lidentit de lditeur, ltape suivante consiste dcider si lexcution du code sign est sre. Lorsquun utilisateur a dj valid la abilit de lexcution du code publi par lditeur, le code (un script ou un chier de conguration PowerShell) sexcute sans autre intervention.

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 ) :

Voici la signication des options disponibles :


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.

Distribuer du code dans lentreprise


Vous vous demandez peut-tre comment contrler le code qui peut tre approuv dans votre entreprise. Si le choix du code approuv est laiss aux utilisateurs ou aux machines, la distribution du code sign dans un environnement gr est contrarie. Si votre environnement est gr, la mise en uvre de votre PKI doit offrir des mthodes permettant de matriser ce qui est digne de conance dans une entreprise. Si votre socit se trouve dans un environnement Windows, la mthode classique passe par un GPO. Par exemple, vous pouvez dnir des diteurs approuvs en utilisant une liste de certicats de conance (CTL, Certicate Trust List) ou au travers de lextension Maintenance dInternet Explorer.

Distribuer du code dans le domaine public


Dterminer la conance dans le domaine public est totalement diffrent. Lorsquon tablit une conance entre deux entits prives, elles sont en mesure de dnir ce qui est digne de conance ou non. Lorsque des entits publiques interviennent, ce niveau de contrle nexiste pas. Cest ces entits publiques de dterminer ce quoi elles accordent leur conance.

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

Dvelopper des scripts


Les sections suivantes dcrivent les pratiques suivre pour le dveloppement gnral de scripts. Nous vous conseillons fortement de les suivre, tout au moins en partie, lors de vos dveloppements. Ainsi, vous constaterez que vos scripts commencent satisfaire aux exigences dun projet, demandent moins de temps de dveloppement et prsentent moins de problmes de dploiement.

Considrer le dveloppement de scripts comme de vritables projets


La mise en uvre dun script peut demander autant defforts que nimporte quel projet de dveloppement logiciel. Par exemple, il ne faut pas oublier les phases de prototypage et de test an dviter un impact ngatif sur lenvironnement. Par consquent, lors de lcriture dun script, la porte de ses effets doit tre vrie. Sil est complexe, si son temps dexcution est suprieur quelques minutes, sil implique dautres ressources que son dveloppeur (comme dautres personnes) ou si son excution montre un niveau de risque lev, il est prfrable de transformer lcriture du script en un rel projet de dveloppement.

Mettre en place un cycle de dveloppement


Comme pour tout projet logiciel, un modle du cycle de dveloppement correspondant aux besoins du script doit tre mis en place. Les modles vont du traditionnel modle en cascade aux plus rcents, comme les mthodes agiles, lExtreme Programming (XP), le cycle en spirale, le cycle itratif, etc. Cependant, le choix nest pas aussi important que la dnition dun processus formel de gestion des projets de scripts. Si les modles mentionns semblent trop complexes pour un projet de scripts, la Figure 5.1 prsente une suite dtapes simples conues pour le dveloppement de scripts. Bien quelles soient comparables un modle intgral de cycle de dveloppement, ces tapes ne sont que des rfrences vers des tches qui doivent tre accomplies. Vous pouvez suivre ce modle ou dvelopper le vtre, mais limportant est dtablir une mthode de gestion des projets de scripts.

Concevoir et prototyper les scripts avec du pseudo-code


La conception et le prototypage dun script avec pseudo-code ont pour objectif de dvelopper la structure et la logique du script avant dcrire ne serait-ce quune seule ligne de code. De cette manire, il est plus facile de sassurer que le script rpond aux exigences et de dtecter les problmes de logique ds le dbut du processus de dveloppement.

Chapitre 5

Suivre les bonnes pratiques

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

Phases cycliques Dveloppement

Test

Dploiement

Phases cycliques Apprentissage

Maintenance

128

Partie 1

Introduction PowerShell

Rassembler efcacement les contraintes du script


Comme pour nimporte quel projet, il faut dnir les problmes rsolus par le script an de dterminer ce quil doit raliser. Parfois, un script doit juste satisfaire un simple besoin dautomation et ses contraintes sont alors faciles cerner. Lorsquil doit rsoudre des problmes dautomation plus complexes, il peut tre ncessaire den savoir plus sur les processus mtiers automatiser pour pouvoir dterminer les contraintes. Dans tous les cas, identier les exigences dun script et demander tous les participants de les approuver constitue un lment essentiel du succs du projet. Si ces tapes du processus de dveloppement sont sous-estimes, le script nal risque de ne pas rpondre aux besoins et de ne pas tre retenu comme une solution au problme initial.

Ne pas dvelopper des scripts dans un environnement de production


La plupart des scripts apportent des changements au systme. Il est donc possible que lexcution dun script dans un environnement de production occasionne des dgts inattendus. Mme si le script neffectue aucune modication, il peut avoir des effets indsirables ou ses implications peuvent ne pas tre totalement matrises. Pire encore, lorsquil est excut an de vrier son fonctionnement, sil nest pas lanc dans lenvironnement de test dni, il peut affecter des systmes en production. Par consquent, les scripts ne doivent jamais tre dvelopps dans un environnement de production.

Tester, tester et tester


Les scripts ont gnralement pour objectif une forme dautomation, comme modier un attribut pour chaque utilisateur dun domaine Active Directory. La tche dautomation peut avoir un impact lev ou faible, mais il est indispensable de raliser un test de qualit du code avant de le placer dans un environnement de production. Les scripts doivent tre tests consciencieusement car ils peuvent avoir un effet sur lenvironnement.

crire des scripts professionnels


De nombreux dveloppeurs ont tendance considrer les scripts comme une solution rapide et facile pour effectuer des tches et ne voient pas la ncessit dune mthodologie professionnelle impliquant planication, documentation et norme. Cette mentalit vient de lpoque o lcriture de scripts tait considre comme une tche rserve aux programmeurs UNIX et Linux. Cette vision est en train de changer, avec la sortie de PowerShell. La ligne de commande, les scripts et lautomation deviennent les bases sur lesquelles les administrateurs de systmes

Chapitre 5

Suivre les bonnes pratiques

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.

Concevoir des scripts


Les sections suivantes proposent de bonnes pratiques pour la conception de scripts PowerShell. Le terme "conception" est employ de manire assez souple car lobjectif est dentrer dans les aspects de la conception qui doivent ou ne doivent pas tre retenus lors de lcriture dun script PowerShell. Par exemple, les informations fournies au script doivent tre valides. Une fois encore, nous vous recommandons fortement dappliquer, sous une forme ou sous une autre, les pratiques donnes dans ces sections. En les respectant, les scripts seront plus lisibles, plus utilisables, plus robustes et moins bogus.

Ajouter des informations de conguration au dbut du script


Les variables ou les paramtres qui dnissent la conguration du script doivent toujours tre placs au dbut. Ainsi, toute personne qui utilise, lit ou modie le script pourra les retrouver trs simplement. Par exemple :
#--------------------------# Dnir les variables. #--------------------------$Proprietaire = "Administrateurs" $Cibles = import-csv $FichierImport #--------------------------# Corps du script. #--------------------------...

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.

Utiliser les commentaires


Rien ne garantit que les utilisateurs comprendront immdiatement la logique du script ou seront familiers des mthodes employes pour raliser certaines tches. Par consquent, des commentaires doivent les aider comprendre le fonctionnement du script, mais, en aucun cas, ils ne doivent ressembler un roman. En revanche, ils doivent apporter sufsamment dinformations pour que la logique du script apparaisse clairement. Par ailleurs, si le script inclut une mthode, une classe ou une fonction complexe, un commentaire doit lexpliquer. Les commentaires ont galement pour avantage de faciliter le retour sur un script ou sa mise jour. Lexemple suivant montre comment des commentaires apportent des informations utiles :
#------------------------------------------------# Add-DACL #------------------------------------------------# 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").

viter de ger des informations de conguration


Figer des informations de conguration dans le code est une erreur classique. Les informations requises ne sont pas demandes aux utilisateurs, elles sont ges dans des variables ou rparties alatoirement dans le script. Cette mthode impose aux utilisateurs dintervenir manuellement dans les scripts pour en modier la conguration. Cela augmente donc les risques derreurs et des problmes dexcution. Noubliez pas que lun des objectifs est de fournir des scripts utilisables. Les informations ges dans le code ne permettent pas dutiliser facilement un script dans des environnements diffrents. Nous vous conseillons dutiliser

Chapitre 5

Suivre les bonnes pratiques

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 ! "))

Si ncessaire, utiliser des variables


Si les informations de conguration ne doivent pas tre ges dans le script, elles doivent cependant tre reprsentes par des variables. Le fait de dnir une information dans une variable en un seul endroit, au lieu de la placer en plusieurs endroits du script, rduit les risques dintroduire des erreurs lors de la modication de cette information. Par ailleurs, le regroupement des informations de conguration en un mme endroit, en particulier au dbut du script, diminue galement le temps ncessaire la reconguration dun script pour des environnements diffrents.

Donner des instructions


La plupart des scripts sont crits par une personne mais utiliss par une autre, un administrateur, trs souvent, qui ne matrise pas le code et les interfaces en ligne de commande. Autrement dit, les scripts doivent tre aussi utilisables quutiles. Si vous ne fournissez aucune instruction pour que mme le dbutant puisse lancer le script et comprendre son rle, vous ntes pas un vritable dveloppeur de scripts. Il nest pas rare de rencontrer des scripts sans explications, avec des instructions incorrectes ou trs peu dexplications de son objectif. Cela est gnralement frustrant pour les utilisateurs, qui peuvent navoir aucune ide de limpact des scripts sur leur environnement et les excuter, ce qui peut conduire des dsastres. Lexemple suivant comprend des instructions inclure dans un chier qui documente lobjectif et le fonctionnement du script :
=================================================================== Informations sur le script. =================================================================== Nom : AddProxyAddress.ps1 Auteur : Tyson Kopczynski Date : 6/02/2006

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.

Valider les paramtres requis


Une erreur classique consiste ne pas valider les paramtres requis. Si le script demande lutilisateur de saisir des informations, labsence de cette vrication peut lempcher de fournir une entre invalide et le script risque de sarrter avec une erreur. Pour les petits scripts, cet oubli ne constituera sans doute pas un problme, mais il risque daffecter srieusement la simplicit dutilisation des longs scripts complexes. Supposons que le script gre un inventaire de logiciels. Dans un environnement de dveloppement constitu de quelques machines, nous excutons le script, mais sans fournir linformation correcte pour un paramtre obligatoire. Il sexcute et choue quelques secondes plus tard. Nous comprenons notre erreur, la corrigeons et relanons le script. Ensuite, sur des milliers de machines, ladministrateur systme lance le script, lequel sexcute pendant six heures puis choue. En consultant les informations derreur, ladministrateur dcouvre que le script sest arrt cause dun paramtre mal saisi. Il vient de dpenser six heures de son temps uniquement pour rencontrer une erreur. Il risque de conclure que le script nest pas utilisable. Autrement dit, le script fonctionne dans notre environnement mais pas dans celui de ladministrateur.

Chapitre 5

Suivre les bonnes pratiques

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 }

crire des scripts et des fonctions rutilisables


Si vous avez pass du temps dvelopper une fonctionnalit sophistique, vous devez aussi la rendre rutilisable. Un jeu de scripts ou de fonctions commun permet de gagner du temps lors de lcriture de nouveaux scripts. Supposons, par exemple, que nous ayons crit dans un script une logique danalyse du contenu dun chier CSV an de crer un tableau HTML. Au lieu de copier et de modier cette logique dans de nouveaux scripts, il est prfrable de crer un script ou un chier de bibliothque qui la met en uvre de manire la rutiliser dans un autre script.

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

Choisir des noms descriptifs la place des alias


Lutilisation des alias dans PowerShell permet de gagner du temps, mais les scripts sont alors plus difciles lire. Le langage de PowerShell est conu pour rester simple crire et lire, mais les conventions de nommage de chacun et lemploi des alias ont un effet sur la lisibilit. Pour garantir la bonne lisibilit du code, il est prfrable de suivre des conventions de nommage cohrentes et de remplacer les alias par des noms descriptifs. En produisant du code lisible, les utilisateurs comprendront plus facilement le script et les mises jour et les modications futures seront simplies. Si vous respectez des conventions de nommage cohrentes et vitez des alias, la modication du script doit tre un jeu denfant.

Afcher des informations dtat


Dans un script dautomation, il est important dafcher des informations dtat an que les utilisateurs suivent la progression du script et sachent quelles tches ont t accomplies avec succs. Ces informations permettent galement aux utilisateurs de connatre les erreurs qui se sont produites et peuvent mme indiquer une estimation de lheure de terminaison du script. Pour fournir ces informations aux utilisateurs, nous pouvons nous servir de la console, comme le montre la Figure 5.2, avec les applets de commande Write-Host et Write-Progress, les crire dans un journal ou utiliser les classes Windows Forms.
INFO Quelle que soit la mthode employe, lide est de fournir sufsamment dinformations dtat sans noyer les utilisateurs sous des dtails inutiles. Sil faut diffrents niveaux de dtails des informations, utilisez les applets de commande Write-Verbose et Write-Debug, les paramtres Verbose et Debug ou un afchage personnalis.

Chapitre 5

Suivre les bonnes pratiques

135

Figure 5.2
Exemple dafchage dinformations dtat.

Utiliser les paramtres WhatIf et Conrm


Comme nous lavons expliqu au Chapitre 2, "Les fondamentaux de PowerShell", deux paramtres dapplet de commande permettent aux auteurs de scripts et aux administrateurs systme dviter des modications non voulues. Le paramtre WhatIf retourne des informations sur les modications qui seront effectues par lapplet de commande, mais sans les appliquer rellement :
PS C:\> get-process expl* | stop-process WhatIf WhatIf: Opration Stop-Process en cours sur la cible explorer (2172) .

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.

PS C:\> get-process | stop-process

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) .

WhatIf: Opration Stop-Process en cours sur la cible GoogleToolbarNotie (2236) . ...

Chapitre 5

Suivre les bonnes pratiques

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.

Scuriser des scripts


La scurit reste souvent un lment qui nest pas pris en compte pendant le dveloppement dun logiciel. Cest aussi le cas lors de lcriture de scripts. Cependant, la prise en charge de la scurit dans les scripts fait partie de la liste des bonnes pratiques. Cest pourquoi les trois sections venir, qui traitent de la scurit des scripts PowerShell, sont peut-tre les plus importantes de ce chapitre.

Signer numriquement les scripts et les chiers de conguration


Comme nous lavons soulign au Chapitre 4, "Signer du code", les scripts et les chiers de conguration PowerShell doivent toujours tre signs numriquement pour que les utilisateurs et les machines cibles connaissent lorigine du code et sachent quil nest pas corrompu. En adhrant cette pratique, vous pouvez conserver une stratgie dexcution AllSigned sur toutes les machines de votre entreprise, y compris la vtre.

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.

Ne jamais xer les stratgies dexcution Unrestricted


Fixer la stratgie dexcution Unrestricted revient accepter lexcution dun code malveillant sur le systme. tant donn ce risque, la stratgie dexcution doit au moins tre xe RemoteSigned. Cette conguration autorise lexcution des scripts et le chargement des chiers de conguration crs localement sur la machine, mais empche celle de tout code distant non sign et non approuv. Cependant, elle nest pas toute preuve et pourrait autoriser PowerShell excuter certains codes distants. Le respect des conseils et la matrise du processus de signature du code sont essentiels la protection de lenvironnement PowerShell. Choisir la stratgie dexcution AllSigned accrot la scurit car tous les scripts et tous les chiers de conguration doivent alors tre signs par une source de conance avant de pouvoir tre excuts ou chargs.

Excuter les scripts avec les droits minimaux


Les bonnes pratiques de scurit incluent le principe des privilges moindres. Ils garantissent que les entits, comme les utilisateurs, les processus et les logiciels, ne reoivent que les droits minimaux ncessaires pour effectuer une opration lgitime. Par exemple, si un utilisateur na pas besoin des droits dadministration pour lancer un logiciel de traitement de texte, il ny a aucune raison de les lui accorder. Le principe des privilges moindres sapplique galement aux scripts. Lors du dveloppement dun script, il faut essayer dcrire le code de manire que son excution exige des droits minimaux. Par ailleurs, il est indispensable dexpliquer les droits requis an que les utilisateurs agissent en connaissance de cause. Sinon, ils risquent de lancer lexcution dun script avec des droits dadministration, ce qui augmente les possibilits de dommages inigs lenvironnement.

Chapitre 5

Suivre les bonnes pratiques

139

Utiliser les standards dcriture


Comme pour le dveloppement de logiciels, lcriture des scripts doit inclure une forme de standardisation. Le terme "standardisation" ne signie pas ici une norme, comme celles rdiges par lISO (International Organization for Standardization) ou lIEEE (Institute of Electrical and Electronics Engineers). Nous faisons rfrence lusage de mthodes cohrentes pour le nom, lorganisation et la structure des scripts, pour leur fonctionnement et pour leur traitement des erreurs. En standardisant ces aspects, nous assurons une certaine cohrence dans linteraction avec nos scripts, leur dpannage et leur utilisation. La lisibilit dun script peut tre amliore si vous utilisez des conventions de nommage cohrentes entre les scripts et au sein mme des scripts. Rpondant une organisation standard, ils deviennent plus faciles lire, dpanner ou modier. Cette standardisation permet galement de rduire le temps de dveloppement de nouveaux scripts. Par exemple, nous pouvons crer des structures standard pour le traitement des erreurs, la cration de journaux et la mise en forme des sorties, puis les rutiliser trs simplement.

Standards dcriture employs dans ce livre


Les chapitres suivants de cet ouvrage se concentrent sur des exemples de scripts PowerShell. Ces scripts oprationnels sont tirs de projets rels rpondant des besoins dentreprises. Nous prsenterons leur code source au cours des chapitres venir, mais il est galement disponible sur la page Web consacre cet ouvrage ladresse http://www.pearsoneducation.fr. Larchive propose contient les scripts de chaque chapitre, rpartis dans des sous-dossiers2. Pour rsoudre quelques problmes de standardisation, nous avons fait des choix de prsentation des scripts dans cet ouvrage. Premirement, ils se limitent aux langages PowerShell et VBScript, an de rduire la complexit inhrente lutilisation de diffrents langages. Deuximement, les scripts VBScript sont placs dans un chier WSF (Windows Scripting File). Troisimement, chacun des scripts PowerShell et VBScript respecte une structure commune facile comprendre. Les Figures 5.3 et 5.4 prsentent des exemples de structures employes dans ce livre.

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

Suivre les bonnes pratiques

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

Appliquer ses connaissances PowerShell

Grer le systme de chiers depuis WSH et PowerShell


WSH propose plusieurs mthodes de manipulation du systme de chiers de Windows. Lobjet FileSystemObject (FSO), WMI (Windows Management Instrumentation) et certains outils, comme copy, calcs et xcalcs, nen sont que quelques exemples. Grce ces outils plthoriques, nous pouvons effectuer des tches comme copier, crer et supprimer des chiers et des dossiers. La plupart des crateurs de scripts se servent du modle FSO pour manipuler le systme de chiers. FSO fait partie du modle dobjet de WSH. Il joue le rle de racine dune hirarchie dobjets, de mthodes et de collections COM qui donnent accs au systme de chiers. Il permet gnralement aux programmeurs de manipuler le systme de chiers comme bon leur semble, mais, dans certains cas, ses fonctionnalits ne sont pas sufsantes et des outils et des mthodes complmentaires sont ncessaires certaines tches. Dun autre ct, PowerShell dispose dun fournisseur intgr, appel FileSystem, pour interagir avec le systme de chiers de Windows. Ce fournisseur apporte une couche dabstraction entre PowerShell et le systme de chiers de Windows qui fait que ce dernier ressemble un magasin de donnes hirarchique. Par consquent, laccs au systme de chiers se fait exactement comme pour nimporte quel autre magasin de donnes disponible par le biais dun fournisseur PowerShell. Comme nous lavons expliqu au Chapitre 3, "Prsentation avance de PowerShell", les applets de commande principales permettant daccder aux magasins de donnes et de les manipuler servent galement pour le systme de chiers. La commande suivante afche la liste des applets de commande principales qui manipulent les magasins de donnes accessibles par le biais des fournisseurs PowerShell :
PS C:\> help about_core_commands

Manipuler les lecteurs


Dans WSH, nous pouvons utiliser lobjet FSO Drive pour obtenir des informations concernant les lecteurs disponibles sur un systme :
Dim FSO, objDrive Set FSO = CreateObject("Scripting.FileSystemObject") Set objDrive = fso.GetDrive(fso.GetDriveName("C:\")) WScript.Echo "Espace total : & FormatNumber(objDrive.TotalSize / 1024, 0)

Chapitre 6

PowerShell et le systme de chiers

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:\>

Manipuler les dossiers


Dans WSH, nous pouvons accder aux informations dun dossier et crer, supprimer, copier et dplacer des dossiers laide de lobjet FSO Folder :
Dim FSO, objFolder Set FSO = CreateObject("Scripting.FileSystemObject") Set objFolder = FSO.GetFolder("C:\outils") WScript.Echo objFolder.DateLastAccessed

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

Appliquer ses connaissances PowerShell

Manipuler les chiers


Dans WSH, nous pouvons accder aux informations dun chier et crer, modier, copier, dplacer et supprimer des chiers laide de lobjet FSO File :
Dim FSO Set FSO = CreateObject("Scripting.FileSystemObject") strNomExtension = FSO.GetExtensionName(C:\outils\Plan_Domination_Monde_R1.doc) WScript.Echo strExtensionName

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.

Manipuler les autorisations


Dans WSH, la manipulation des autorisations du systme de chiers prsente quelques limites. Par exemple, il nexiste aucune solution simple pour modier les autorisations dun chier ou dun dossier. Les dveloppeurs de scripts doivent choisir entre utiliser un outil externe, comme cacls, Xcacls, Xcalcs.vbs ou SubInACL, ou passer par ADsSecurity.dll ou la classe WMI Win32_LogicalFileSecuritySetting. Aucune de ces mthodes noffre une solution complte ou standard de gestion des autorisations du systme de chiers dans WSH. En gnral, un script permet de compenser labsence de fonctionnalits.

Fixer des autorisations avec SubInACL


tant donn les limites de WSH, loutil SubInACL est trs souvent employ pour modier les autorisations du systme de chiers. Il nest pas parfait, mais, en le compltant par des scripts, il suft gnralement cette tche. Par ailleurs, SubInACL prend en charge les chiers, les

Chapitre 6

PowerShell et le systme de chiers

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

Appliquer ses connaissances PowerShell

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

PowerShell et le systme de chiers

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

Appliquer ses connaissances PowerShell

Fixer des autorisations dans PowerShell


Vous pourriez penser que, grce aux applets de commandes Get-ACL et Set-ACL, la gestion des autorisations du systme de chiers est plus facile dans PowerShell. Cependant, Set-ACL a besoin dun objet descripteur de scurit dni par la classe System.Security.AccessControl. ObjectSecurity. La cration dun descripteur de scurit nest pas complexe, mais la gestion des autorisations nest pas aussi vidente mettre en place dans un script quon pourrait le croire. Face des termes tels que descripteur de scurit et liste de contrle daccs (ACL, Access Control List), vous pourriez tre tent de revenir des outils plus familiers, comme SubInACL. Cependant, si vous tudiez le processus tape par tape, vous vous apercevrez quil nest nalement pas trs compliqu : 1. Obtenir le descripteur de scurit dun objet laide de Get-ACL. 2. Crer une ACL partir dentres de contrle daccs (ACE, Access Control Entry). 3. Ajouter lACL au descripteur de scurit. 4. Associer le nouveau descripteur de scurit lobjet laide de Set-ACL. Le code suivant illustre ces quatre tapes :
PS C:\> $DS = get-acl "Planning de Helena.csv" PS C:\> $Regle = new-object System.Security.AccessControl. FileSystemAccessRule( maiko, FullControl, Allow) PS C:\> $DS.AddAccessRule($Regle) PS C:\> set-acl Planning de Helena.csv $DS PS C:\>

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

PowerShell et le systme de chiers

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

Appliquer ses connaissances PowerShell

$SD = get-acl $Object $SD.SetAccessRuleProtection($True, $False) set-acl $Object $SD }

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

PowerShell et le systme de chiers

155

Ensuite, la fonction systme de chiers :

Clear-SD

permet deffacer le descripteur de scurit dun objet du

#------------------------------------------------# 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

Appliquer ses connaissances PowerShell

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

PowerShell et le systme de chiers

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

Appliquer ses connaissances PowerShell

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

PowerShell et le systme de chiers

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

Appliquer ses connaissances PowerShell

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

PowerShell et le systme de chiers

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

Appliquer ses connaissances PowerShell

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

PowerShell et le systme de chiers

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

Appliquer ses connaissances PowerShell

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

PowerShell et le systme de chiers

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

Appliquer ses connaissances PowerShell

------------------- 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

PowerShell et le systme de chiers

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

Appliquer ses connaissances PowerShell

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

PowerShell et le systme de chiers

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

Appliquer ses connaissances PowerShell

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

PowerShell et le systme de chiers

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

Appliquer ses connaissances PowerShell

#------------------------------------------------# 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

PowerShell et le systme de chiers

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

Appliquer ses connaissances PowerShell

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

PowerShell et le systme de chiers

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

Appliquer ses connaissances PowerShell

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

PowerShell et le systme de chiers

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

Appliquer ses connaissances PowerShell

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 Grer le Registre depuis WSH et PowerShell De VBScript PowerShell

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.

Grer le Registre depuis WSH et PowerShell


WSH fournit un objet pour la manipulation des applications en cours dexcution, le lancement de nouvelles applications, la cration de raccourcis, la cration de menus contextuels, la gestion des variables denvironnement, la journalisation des vnements et mme laccs

180

Partie 2

Appliquer ses connaissances PowerShell

ou la modication du Registre local. Pour ces dernires oprations, lobjet trois mthodes :
n RegDelete n RegRead

WshShell

offre

supprime une cl ou lune de ses valeurs du Registre.

lit le contenu de la valeur indique depuis le Registre.

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

Appliquer ses connaissances PowerShell

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)

Dans PowerShell, il suft dutiliser Get-ItemProperty :


PS C:\> $Chemin = HKLM:\Software\Microsoft\Windows NT\CurrentVersion PS C:\> $Cle = get-itemproperty $Chemin PS C:\> $Cle.ProductName Microsoft Windows XP PS C:\>

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")

Dans PowerShell, la mme opration emploie lapplet Set-ItemProperty :


PS C:\> $Chemin = "HKCU:\Software" PS C:\> set-itemproperty -path $Chemin -name PSinfo type String -value Vive_PowerShell PS C:\> PS C:\> $Cle = get-itemproperty $Chemin PS C:\> $Cle.PSinfo Vive_PowerShell PS C:\>

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

Appliquer ses connaissances PowerShell

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

Appliquer ses connaissances PowerShell

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

Appliquer ses connaissances PowerShell

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

objReg.CreateKey HKEY_LOCAL_MACHINE, strKeyPath End Function

La fonction CreateRegKey cre une cl dans la ruche paramtres suivants : "." dsigne la machine locale.
n strKeyPath.

HKEY_LOCAL_MACHINE.

Elle attend les ;

n strComputer. Le nom ou ladresse IP de lordinateur sur lequel nous voulons crer la cl

Le chemin de la nouvelle cl du Registre.

Voici un exemple dutilisation de cette fonction :


strServer = "serverxyz.companyabc.com" CreateRegKey strServer, "SOFTWARE\Turtle_Worm"

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

Appliquer ses connaissances PowerShell

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.

n strValueName. n strValue. n strType.

Le nouveau contenu de la valeur du Registre.

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.

Voici un exemple dutilisation de cette fonction :


Set StdOut = WScript.StdOut strServer = "serverxyz.companyabc.com" DeleteRegKey strServer, "SOFTWARE\Turtle_Worm"

La fonction DeleteRegValue :
Function DeleteRegValue(strComputer, strKeyPath, strValueName) On Error Resume Next const HKEY_LOCAL_MACHINE = &H80000002

192

Partie 2

Appliquer ses connaissances PowerShell

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.

Voici un exemple dutilisation de cette fonction :


Set StdOut = WScript.StdOut strServer = "server1000" DeleteRegValue strServer, "SOFTWARE\Turtle_Worm", "binValue"

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

Appliquer ses connaissances PowerShell

Function Function Function Function Function Function Function Function ... Function Function Function Function Function Function Function Function Function

more help man mkdir md A: B: C:

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:

W: X: Y: Z: Get-RegValue Set-RegKey Set-RegValue Remove-RegKey Remove-RegValue

Set-Location W: Set-Location X: Set-Location Y: Set-Location Z: param($Computer, param($Computer, param($Computer, param($Computer, param($Computer,

$KeyPath, $KeyPath) $KeyPath, $KeyPath) $KeyPath,

$... $... $... $... $...

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

Appliquer ses connaissances PowerShell

Lexemple suivant montre comment utiliser cette fonction :


PS C:\> get-regvalue "Arus" "SOFTWARE\Voltron" "BlueLion" "BIN"

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.

Voici un exemple dutilisation de cette fonction :


PS C:\> set-regkey "Arus" "SOFTWARE\Voltron"

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

Appliquer ses connaissances PowerShell

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-

er une valeur du Registre ; "." dsigne la machine locale.


n $KeyPath.

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.

Le nouveau contenu de la valeur du Registre.

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.

Voici un exemple dutilisation de cette fonction :


PS C:\> remove-regkey "Arus" "SOFTWARE\Voltron"

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

Appliquer ses connaissances PowerShell

Voici comment utiliser cette fonction :


PS C:\> remove-regvalue "Arus" "SOFTWARE\Voltron" "Lion_Statement"

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:\>

dwordValue 1 DWORD expValue %SystemRoot%\

multiValue $Multi strValue Fin de la

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"

__GENUS __CLASS __SUPERCLASS __DYNASTY __RELPATH

: 2 : __PARAMETERS : : __PARAMETERS :

202

Partie 2

Appliquer ses connaissances PowerShell

__PROPERTY_COUNT __DERIVATION __SERVER __NAMESPACE __PATH ReturnValue uValue

: : : : : : :

2 {}

0 {101, 118, 105, 108...}

PS C:\> get-regvalue DC1 SOFTWARE\Turtle_Worm dwordValue DWORD

__GENUS __CLASS __SUPERCLASS __DYNASTY __RELPATH __PROPERTY_COUNT __DERIVATION __SERVER __NAMESPACE __PATH ReturnValue uValue

: : : : : : : : : : : :

2 __PARAMETERS __PARAMETERS 2 {}

0 1

PS C:\> get-regvalue DC1 SOFTWARE\Turtle_Worm expValue EXP

__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

PS C:\> get-regvalue DC1 SOFTWARE\Turtle_Worm multiValue MULTI

__GENUS __CLASS __SUPERCLASS __DYNASTY __RELPATH __PROPERTY_COUNT __DERIVATION __SERVER __NAMESPACE __PATH ReturnValue sValue

: : : : : : : : : : : :

2 __PARAMETERS __PARAMETERS 2 {}

0 {PowerShell, est, super !}

PS C:\> get-regvalue DC1 SOFTWARE\Turtle_Worm strValue STR

__GENUS __CLASS __SUPERCLASS __DYNASTY __RELPATH __PROPERTY_COUNT __DERIVATION __SERVER __NAMESPACE __PATH ReturnValue sValue

: : : : : : : : : : : :

2 __PARAMETERS __PARAMETERS 2 {}

0 Fin de la modication du Registre !

PS C:\>

204

Partie 2

Appliquer ses connaissances PowerShell

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"

__GENUS __CLASS __SUPERCLASS __DYNASTY __RELPATH __PROPERTY_COUNT __DERIVATION __SERVER

: : : : : : : :

2 __PARAMETERS __PARAMETERS 1 {}

Chapitre 7

PowerShell et le Registre

205

__NAMESPACE __PATH ReturnValue

: : : 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.

Comparer lutilisation de WMI dans WSH et dans PowerShell


Pour employer WMI dans des scripts, nous utilisons certains objets de lAPI de WMI Scripting avec les mthodes WSH CreateObject() et GetObject() (ou les mthodes dun autre langage de scripts qui permettent de crer ou de se lier des objets COM). Nous pouvons ainsi nous lier un objet WMI qui peut tre une classe WMI ou une instance dune classe WMI.

208

Partie 2

Appliquer ses connaissances PowerShell

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.

Utiliser WMI dans WSH


Lexemple de script VBScript suivant utilise un moniker qui cre une connexion une machine distante et retourne ensuite la quantit de mmoire RAM installe sur cette machine :
On Error Resume Next Dim objWMIService, objComputer, colItems Dim strComputerName strComputerName = "Jupiter" Set objWMIService = GetObject("winmgmts:\\" & strComputerName _ & "\root\cimv2") Set colItems = objWMIService.ExecQuery _ ("Select * from Win32_ComputerSystem") For Each objItem in colItems WScript.Echo Taille de la mmoire RAM : " _ & FormatNumber((objItem.TotalPhysicalMemory \ 1024) _ \ 1000, 0, 0, 0, -1) & Mo Next

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

Utiliser WMI dans PowerShell


Lutilisation de WMI dans PowerShell prsente une logique conceptuelle analogue la prcdente. La diffrence principale est lie au fait que les mthodes de PowerShell sappuient sur WMI .NET au lieu de lAPI de WMI Scripting. Dans PowerShell, il existe trois manires demployer WMI : WMI .NET (les espaces de noms System.Management et System.Management .Instrumentation de .NET), lapplet de commande Get-WmiObject et les types WMI abrgs de PowerShell ([WMI], [WMIClass] et [WMISearcher]).

210

Partie 2

Appliquer ses connaissances PowerShell

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"

ExitCode Name ProcessId StartMode State Status

: : : : : :

0 Virtual Server 656 Auto Running OK

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"

ExitCode Name ProcessId StartMode State Status

: : : : : :

0 Virtual Server 656 Auto Running OK

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

: : : : : : : : : : :

Win32_Product 1 Win32_Product CIM_Product CIM_Product Win32_Product 12 {CIM_Product} PLANX ROOT\cimv2 \\PLANX\ROOT\cimv2:Win32_Product

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

Appliquer ses connaissances PowerShell

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

Tableau 8.1 Types abrgs dans PowerShell


Nom
[int] [int[]] [long] [long[]] [string] [string[]] [char] [char[]] [bool] [bool[]] [byte] [double] [decimal] [oat] [single] [regex] [array] [xml] [scriptblock] [switch] [hashtable] [type] [ref] [psobject] [wmi] [wmisearcher] [wmiclass] [adsi]

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

Appliquer ses connaissances PowerShell

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

Domain Manufacturer Model Name PrimaryOwnerName TotalPhysicalMemory

: : : : : :

companyabc.com Hewlett-Packard Pavilion dv8000 (ES184AV) PLANX Frank Miller 2145566720

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.

Le type abrg [WMIClass]

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 PS C:\> $ClasseOrdi | format-list *

Name __GENUS __CLASS

: Win32_ComputerSystem : 1 : Win32_ComputerSystem

Chapitre 8

PowerShell et WMI

215

__SUPERCLASS __DYNASTY __RELPATH __PROPERTY_COUNT __DERIVATION __SERVER __NAMESPACE __PATH

: : : : :

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:\>

Le type abrg [WMISearcher]

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()

Domain Manufacturer Model Name PrimaryOwnerName TotalPhysicalMemory

: : : : : :

companyabc.com Hewlett-Packard Pavilion dv8000 (ES184AV) PLANX Miro 2145566720

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

Appliquer ses connaissances PowerShell

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

Appliquer ses connaissances PowerShell

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

Appliquer ses connaissances PowerShell

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

passe galement en mgaoctets.

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

Appliquer ses connaissances PowerShell

Ping = 0 Else Ping = 1 End If Next End Function

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

Appliquer ses connaissances PowerShell

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

Appliquer ses connaissances PowerShell

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, (?<=&amp;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

Appliquer ses connaissances PowerShell

Voici le code de toute cette procdure :


#-------------------# Obtenir les donnes concernant les machines virtuelles. #-------------------write-host "Obtention des donnes des machines virtuelles" -NoNewLine .{ trap{write-host `t`t "[ERREUR]" -Foregroundcolor Red; throw write-host $_ -Foregroundcolor Red; Break} $VSMachines = get-wmiobject -namespace "root/vm/virtualserver" ` -class VirtualMachine -computername $ServerName -ErrorAction Stop write-host `t`t "[OK]" -Foregroundcolor Green } foreach ($Server in $Servers){ &{ $VSMachine = $VSMachines | where {$_.Name -eq $Server.Name} if($VSMachine){ $Uptime = $VSMachine.Uptime / 60 $Memory = ($VSMachine.PhysicalMemoryAllocated / 1024) / 1000 $Disk = ($VSMachine.DiskSpaceUsed / 1024) /1000 add-member -inputObject $Server -membertype noteProperty -name "Status" -value "En ligne" add-member -inputObject $Server -membertype noteProperty -name "Uptime" -value $Uptime add-member -inputObject $Server -membertype noteProperty -name "CPU" -value $VSMachine.CpuUtilization add-member -inputObject $Server -membertype noteProperty -name "Memory" -value $Memory add-member -inputObject $Server -membertype noteProperty -name "Disk" -value $Disk } else{ add-member -inputObject $Server -membertype noteProperty -name "Status" -value "Hors ligne" } } } ` ` ` ` `

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.

Comparer lutilisation dADSI dans WSH et dans PowerShell


Avant de voir comment ladministration dActive Directory peut se faire depuis PowerShell, vous devez savoir quADSI reprsente la premire interface de programmation pour la gestion dActive Directory. La grande majorit des outils de gestion sappuie sur ADSI pour interagir avec Active Directory. De mme, la gestion dActive Directory depuis un script se fait gnralement avec ADSI.

232

Partie 2

Appliquer ses connaissances PowerShell

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

PowerShell et Active Directory

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.

Utiliser ADSI dans WSH


Dans WSH, il existe deux manires dutiliser ADSI. La premire consiste employer une mthode (comme GetObject() de WSH) ou une fonction (comme GetObject() de VBScript) pour se connecter (se lier) un objet Active Directory. Pour cela, nous utilisons le fournisseur LDAP ou WinNT en prcisant le chemin ADSI de lobjet :
Set objUser = GetObject("LDAP://CN=Garett Kopczynski,OU=Accounts,OU=Managed Objects,DC=companyabc,DC=com")

Set objUser = GetObject(WinNT://companyabc.com/garett)

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

Appliquer ses connaissances PowerShell

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.

Utiliser ADSI dans PowerShell


Dans PowerShell, il existe galement deux manires de travailler avec Active Directory. La premire, et la plus simple, consiste utiliser le type abrg [ADSI]. Il est analogue [WMI] car le chemin de lobjet auquel nous nous connectons doit tre prcis. En revanche, ce chemin est donn sous la forme dun chemin ADSI :
PS C:\> $Utilisateur = [ADSI]"LDAP://CN=Garett Kopczynski,OU=Accounts, OU=Managed Objects,DC=companyabc,DC=com"

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

PowerShell et Active Directory

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.

Obtenir des informations sur un objet


Lexemple VBScript suivant se lie lobjet dutilisateur indiqu laide de la mthode VBScript GetObject() et un fournisseur ADSI LDAP. Le script rcupre ensuite les attributs Name, userPrincipalName, description et physicalDeliveryOfceName de lobjet dutilisateur. Enn, il les afche par lintermdiaire dune bote de message ou sur la console :
Set objUser = GetObject("LDAP://CN=Garett Kopczynski,OU=Accounts,OU=Managed Obje cts,DC=companyabc,DC=com") WScript.Echo objUser.Name WScript.Echo objUser.userPrincipalName WScript.Echo objUser.description WScript.Echo objUser.physicalDeliveryOfceName

236

Partie 2

Appliquer ses connaissances PowerShell

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

name userPrincipalName description physicalDeliveryOfceName

: : : :

{Garett Kopczynski} {Garett@taosage.net} {Marketing Manager} {Dallas}

PS C:\>

Chapitre 9

PowerShell et Active Directory

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."

Lenregistrement de ce script dans le chier cscript produisent les rsultats suivants :

createuserinfo.vbs

et son excution avec

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

Appliquer ses connaissances PowerShell

Cette procdure est mise en uvre par le code suivant :


PS PS PS PS PS PS PS PS C:\> C:\> C:\> C:\> C:\> C:\> C:\> C:\> $UO = [ADSI]"LDAP://OU=Accounts,OU=Managed Objects,DC=companyabc,DC=com" $NouvUtil = $UO.Create("user", "CN=David Lightman") $NouvUtil.Put("sAMAccountName", "dlightman") $NouvUtil.Put("sn", "Lightman") $NouvUtil.Put("givenName", "David") $NouvUtil.Put("userPrincipalName", "dlightman@norad.gov") $NouvUtil.SetInfo() [ADSI]"LDAP://CN=David Lightman,OU=Accounts,OU=Managed Objects, DC=companyabc,DC=com"

distinguishedName ----------------{CN=David Lightman,OU=Accounts,OU=Managed Objects,DC=companyabc,DC=com}

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

PowerShell et Active Directory

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

Appliquer ses connaissances PowerShell

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

PowerShell et Active Directory

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

Appliquer ses connaissances PowerShell

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")

strGroupName = WScript.Arguments.Named("groupname") strImportFile = WScript.Arguments.Named("importle") strExportFile = WScript.Arguments.Named("exportle")

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

PowerShell et Active Directory

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

Appliquer ses connaissances PowerShell

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

PowerShell et Active Directory

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])

Le code suivant parcourt le tableau arrUsers cr lors de limportation du chier CSV :


------------------- Obtenir les informations sur lutilisateur. -------------------StatStart "Obtention des informations sur lutilisateur" For Each User In arrUsers Err.Clear objCommand.CommandText = _ "<LDAP://" & strDNSDomain & ">;(&(objectCategory=user)" _ & "(sAMAccountName=" & User & "));distinguishedName;subtree" Set objRecordSet = objCommand.Execute If objRecordset.RecordCount = 0 Then dictUsers.Add User, Inexistant Else strUserDN = objRecordSet.Fields("distinguishedName") If (dictGroup.Exists(strUserDN) = True) Then dictUsers.Add User, Oui Else dictUsers.Add User, "Non" End If End If

246

Partie 2

Appliquer ses connaissances PowerShell

Set objRecordset = Nothing strUserDN = vbNullString Next StatDone

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

PowerShell et Active Directory

247

Le code suivant implmente cette procdure :


------------------- Crer un chier dexportation. -------------------Mess vbNullString StdOut.Write "Cration du chier dexportation" If strExportFile <> "" Then Set objExportFile = FSO.OpenTextFile(strExportFile, ForWriting, TRUE) For Each User In dictUsers objExportFile.Write User & "," objExportFile.WriteLine dictUsers.Item(User) Next objExportFile.Close() Set objExportFile = Nothing StdOut.WriteLine "[OK]" End If

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

Appliquer ses connaissances PowerShell

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

PowerShell et Active Directory

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

Appliquer ses connaissances PowerShell

Figure 9.2
Excution du script IsGroupMember.ps1 sans chier dexportation.

Figure 9.3
Excution du script IsGroupMember.ps1 avec chier dexportation.

Chapitre 9

PowerShell et Active Directory

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)

Ensuite, le script contient les fonctions Get-ScriptHeader et Show-ScriptUsage :


################################################## # Fonctions. ################################################## #------------------------------------------------# Get-ScriptHeader #------------------------------------------------# Usage : Gnrer linstruction den-tte du script.

252

Partie 2

Appliquer ses connaissances PowerShell

# $Name : # $Usage :

Nom du script. Rle du script.

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

PowerShell et Active Directory

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

Appliquer ses connaissances PowerShell

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

PowerShell et Active Directory

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

Appliquer ses connaissances PowerShell

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

PowerShell et Active Directory

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

Appliquer ses connaissances PowerShell

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

PowerShell et Active Directory

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

Appliquer ses connaissances PowerShell

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

PowerShell et Active Directory

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

Le script PSShell.ps1 Le script ChangeLocalAdminPassword.ps1

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

Utiliser PowerShell pour les besoins dautomation

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

Utiliser PowerShell en situation relle

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).

Composant 1 : shell de remplacement


Le premier composant de Kiosque PSShell est le shell de remplacement. Par dfaut, Windows utilise explorer.exe comme interface avec le systme dexploitation. Cependant, ce shell nest absolument pas ncessaire au fonctionnement de Windows. Parfois, les utilisateurs souhaitent disposer de fonctionnalits non fournies par lExplorateur Windows ou veulent rduire les fonctionnalits an damliorer la scurit, ce qui est le cas de companyabc.com. Les utilisateurs et les administrateurs de Windows peuvent modier explorer.exe ou le remplacer par un autre shell (ce qui nest pas forcment pris en charge par Microsoft). Cette procdure se nomme "remplacement du shell de Windows" (Windows Shell Replacement). Diffrents shells peuvent tre employs comme remplaants. Cela va des shells graphiques, comme Internet Explorer (iexplore.exe), Geoshell et LiteStep, aux shells en ligne de commande, comme cmd.exe, command.com et mme PowerShell. Il existe deux mthodes pour remplacer explorer.exe. La premire consiste modier le Registre de Windows et prciser le shell de remplacement dans la valeur Shell de la cl HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon. Pour companyabc.com, la modication du Registre sur chaque machine Windows XP ntait pas envisageable. Par ailleurs, le remplacement du shell pour lintgralit du systme nest pas prudent. Supposons que des techniciens doivent se connecter des machines pour effectuer une opration de maintenance. Si le shell par dfaut du systme a t remplac par le biais de la mthode du Registre, les techniciens nont dautres choix que dutiliser le shell de remplacement limit car la modication a t effectue pour tous les utilisateurs. Mme si le Registre permet dactiver un shell de remplacement en fonction des utilisateurs, cette solution nest pas une mthode conviviale et efcace de dployer des shells, comme la dcouvert le service informatique de companyabc.com. La seconde mthode permettant de remplacer explorer.exe passe par un paramtre de GPO (Group Policy Object) baptis Interface utilisateur personnalise. Il permet de prciser le shell des utilisateurs lorsquils ouvrent une session sur une machine. Lutilisation des GPO a lavantage doffrir la centralisation et la facilit de gestion. Par ailleurs, nous pouvons dnir diffrentes congurations de shells en fonction de lutilisateur et non de la machine sur laquelle il se connecte. Puisque companyabc.com recherche ce type de contrle, le service informatique a choisi la mthode GPO pour la gestion de Kiosque PSShell. Les tapes suivantes dtaillent cette solution.

268

Partie 3

Utiliser PowerShell pour les besoins dautomation

tape 1 : crer le GPO du Kiosque PSShell scuris

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.

tape 2 : congurer le remplacement du shell de Windows

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

Utiliser PowerShell en situation relle

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

Utiliser PowerShell pour les besoins dautomation

Lextrait suivant montre le code source de cette application :


using System; using System.Diagnostics; namespace PSShell { static class Program { static void Main() { Process Process = new Process (); Process.StartInfo.FileName = "powershell.exe "; Process.StartInfo.Arguments = "-Command \"C:\\PSShell\\PSShell.ps1\""; Process.StartInfo.CreateNoWindow = true; Process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; Process.Start(); } } }

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

Utiliser PowerShell en situation relle

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

Utiliser PowerShell pour les besoins dautomation

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

Utiliser PowerShell en situation relle

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

Utiliser PowerShell pour les besoins dautomation

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

Utiliser PowerShell en situation relle

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

Utiliser PowerShell pour les besoins dautomation

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.

pour fermer la session

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

Utiliser PowerShell en situation relle

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

Utiliser PowerShell pour les besoins dautomation

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

Utiliser PowerShell en situation relle

279

Figure 10.3
Modier le mot de passe de ladministrateur local.

Figure 10.4
Terminaison du script ChangeLocalAdminPassword.ps1.

280

Partie 3

Utiliser PowerShell pour les besoins dautomation

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

Utiliser PowerShell en situation relle

281

Voici le chier de bibliothque LibraryCrypto.ps1 :


################################################## # LibraryCrypto.ps1 # Les fonctions de ce chier ralisent des oprations de chiffrement. # # Cr le : 3/11/2006 # Auteur : Tyson Kopczynski ################################################## #------------------------------------------------# New-RandomPassword #------------------------------------------------# Usage : Gnrer un mot de passe alatoire. # $Size : Longueur du mot de passe gnrer. function New-RandomPassword{ param ([int] $Size) $Bytes $Chars $Chars $Chars = new-object System.Byte[] $Size = "abcdefghijklmnopqrstuvwxyz".ToCharArray() += "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray() += "0123456789``~!@#$^*()-_=+[]{}`\|;:``",./".ToCharArray()

$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

Utiliser PowerShell pour les besoins dautomation

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

Utiliser PowerShell en situation relle

283

Le script dnit ensuite les fonctions Set-ChoiceMessage et New-PromptYesNo :


################################################## # Fonctions. ################################################## #------------------------------------------------# Set-ChoiceMessage #------------------------------------------------# Usage : Proposer les options de choix Oui et Non. # $No : Le message Non. # $Yes : Le message Oui. function Set-ChoiceMessage{ param ($No, $Yes) $N = ([System.Management.Automation.Host.ChoiceDescription]"&Non") $N.HelpMessage = $No $Y = ([System.Management.Automation.Host.ChoiceDescription]"&Oui") $Y.HelpMessage = $Yes Return ($Y,$N) } #------------------------------------------------# New-PromptYesNo #------------------------------------------------# Usage : Afcher une invite de choix. # $Caption : Intitul de linvite. # $Message : Message dinvite. # $Choices : Catgorie de lobjet. function New-PromptYesNo{ param ($Caption, $Message, [System.Management.Automation.Host.ChoiceDescription[]]$Choices) $Host.UI.PromptForChoice($Caption, $Message, $Choices, 0) }

284

Partie 3

Utiliser PowerShell pour les besoins dautomation

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

Utiliser PowerShell en situation relle

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

Utiliser PowerShell pour les besoins dautomation

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

Utiliser PowerShell en situation relle

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

Utiliser PowerShell pour les besoins dautomation

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

Utiliser PowerShell en situation relle

289

} } else{ write-host $Password = read-host Veuillez saisir le mot de passe -AsSecureString } }

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

Utiliser PowerShell pour les besoins dautomation

} 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

Utiliser PowerShell en situation relle

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

Utiliser PowerShell pour les besoins dautomation

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

Utiliser PowerShell pour les besoins dautomation

Exchange Management Shell (EMS)


Depuis plusieurs annes, les administrateurs dExchange nont eu que deux possibilits pour raliser des tches rptitives : les effectuer la main au travers de linterface graphique ou crire des scripts dans des langages de programmation complexes. Bien que ces langages de programmation permettent deffectuer de nombreuses tches routinires dans un environnement Exchange, ils nont pas t conus explicitement pour cela. Par consquent, mme la tche la plus simple peut demander des centaines de lignes de code. Avec le temps, limpossibilit dautomatiser des tches sest largement rvle comme laspect le plus frustrant de ladministration dun environnement Exchange. En ralit, comme le souligne cet ouvrage, lautomation Windows en gnral nest pas sufsante car Microsoft sest principalement appuy sur des interfaces graphiques et trs peu sur des interfaces en ligne de commande. Cette frustration est devenue lune des motivations de lquipe PowerShell, conduite par Jeffrey Snover, pour dvelopper une interface CLI du shell qui permette aux administrateurs de tout raliser depuis la ligne de commande. peu prs au mme moment, lquipe charge du dveloppement dExchange tait en pleine criture des spcications de la version suivante (E12, qui est devenu Exchange Server 2007). Initialement, elle semblait opter pour une autre interface graphique MMC (Microsoft Management Console) limite pour la gestion dExchange. Mais elle a dcid de prendre une voie diffrente en sorientant vers une administration fonde sur PowerShell. En consquence, dans Exchange Server 2007, la conguration et ladministration se font avec deux nouveaux outils : EMS et EMC (Exchange Management Console). Pour accder aux informations et aux paramtres de conguration dun environnement Exchange Server 2007 et pour les modier, ils sappuient tous deux sur PowerShell.
INFO Exchange Server 2007 est le premier logiciel Microsoft qui utilise exclusivement PowerShell pour mettre en uvre ses interfaces de gestion.

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

Administrer Exchange avec PowerShell

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.

Un simple composant logiciel enchable


Un composant logiciel enchable (snap-in) nest rien dautre quune collection dune ou de plusieurs applets de commande compiles dans une DLL et utilises pour tendre les fonctionnalits de PowerShell. En gnral, cette extension des fonctionnalits a pour objectif la gestion dune application au travers de PowerShell et peut se faire aisment en utilisant des composants logiciels enchables, tout comme ils permettent dtendre les possibilits de la MMC. Un composant logiciel enchable PowerShell doit tre charg dans la session PowerShell en cours avant de pouvoir tre utilis. Par exemple, supposons que nous venions de terminer un composant PowerShell en C#. Il a t compil dans la bibliothque MonPremierSnapin.dll et

296

Partie 3

Utiliser PowerShell pour les besoins dautomation

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

Administrer Exchange avec PowerShell

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

Utiliser PowerShell pour les besoins dautomation

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>

Lextrait de code suivant est un exemple de chier console PowerShell :


<?xml version="1.0" encoding="utf-8"?> <PSConsoleFile ConsoleSchemaVersion="1.0"> <PSVersion>1.0</PSVersion> <PSSnapIns> <PSSnapIn Name="MonPremierSnapin" /> </PSSnapIns> </PSConsoleFile>

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

Administrer Exchange avec PowerShell

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.

Voici un exemple de rapport cr par GetDatabaseSizeReport.ps1 :


Server,Database,Drive, FreeSpace,Size SFEX01,SG1\DB1,C:,34.67,40.453 SFEX02,SG1\DB1,F:,40.56,20.232 SFEX02,SG1\DB2,F:,40.56,30.2144 SFEX02,SG2\DB1,F:,40.56,45.333

300

Partie 3

Utiliser PowerShell pour les besoins dautomation

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

Administrer Exchange avec PowerShell

301

Figure 11.1
Excution en cours du script GetDatabaseSizeReport.ps1.

Figure 11.2
Excution du script GetDatabaseSizeReport.ps1 termine.

302

Partie 3

Utiliser PowerShell pour les besoins dautomation

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

Administrer Exchange avec PowerShell

303

Juste aprs len-tte, nous trouvons le seul paramtre ExportFile du script :


################################################## # GetDatabaseSizeReport.ps1 # Ce script gnre un rapport sur la taille des bases de donnes Exchange. # # Cr le : 26/10/2006 # Auteur : Tyson Kopczynski ################################################## param([string] $ExportFile)

Dans le script GetDatabaseSizeReport.ps1, une seule fonction (Export-DataTable) est dnie :


################################################## # Fonctions. ################################################## #------------------------------------------------# Export-DataTable #------------------------------------------------# Usage : Exporter un DataSet dans un chier CSV. # $Data : Lobjet DataSet. # $FileName : Nom du chier CSV dexportation. 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)

304

Partie 3

Utiliser PowerShell pour les besoins dautomation

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

Administrer Exchange avec PowerShell

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

Utiliser PowerShell pour les besoins dautomation

Ensuite, le script vrie si lutilisateur a besoin dune aide :


#-------------------# Vrier les paramtres obligatoires. #-------------------if ($args[0] -match -(\?|(h|(help)))){ write-host Get-ScriptHeader $ScriptName $ScriptUsage Show-ScriptUsage $ScriptCommand $ScriptParams $ScriptExamples Return }

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

Administrer Exchange avec PowerShell

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

Utiliser PowerShell pour les besoins dautomation

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

Administrer Exchange avec PowerShell

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

Utiliser PowerShell pour les besoins dautomation

n n

le nom complet de la base de donnes, y compris le nom du groupe de stockage ; la quantit despace vide, en mgaoctets.

Voici un exemple de rapport gnr par le script GetEvent1221Info.ps1 :


Server,TimeWritten,Database,MB SFEX02,10/27/2006 1:00:02 AM,SG1\DB1,500 SFEX02,10/27/2006 1:00:06 AM,SG2\PF1,700 SFEX02,10/27/2006 2:00:00 AM,SG1\DB1,500 SFEX02,10/27/2006 2:00:01 AM,SG2\PF1,700 SFEX02,10/27/2006 3:00:00 AM,SG1\DB1,500 SFEX02,10/27/2006 3:00:32 AM,SG2\PF1,700 SFEX02,10/27/2006 4:00:00 AM,SG1\DB1,500 SFEX02,10/27/2006 4:00:00 AM,SG2\PF1,700 SFEX01,10/27/2006 1:00:04 AM,SG1\DB2,200 SFEX01,10/27/2006 1:00:04 AM,SG1\DB1,100 SFEX01,10/27/2006 2:00:00 AM,SG1\DB1,200 SFEX01,10/27/2006 2:00:00 AM,SG1\DB2,100 SFEX01,10/27/2006 3:15:00 AM,SG1\DB1,100 SFEX01,10/27/2006 3:15:00 AM,SG1\DB2,200 SFEX01,10/27/2006 4:00:00 AM,SG1\DB1,200 SFEX01,10/27/2006 4:00:00 AM,SG1\DB2,100

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

Administrer Exchange avec PowerShell

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

Utiliser PowerShell pour les besoins dautomation

Figure 11.4
Excution au cours du script GetEvent1221Info.ps1.

Figure 11.5
Excution du script GetEvent1221Info.ps1 termine.

Chapitre 11

Administrer Exchange avec PowerShell

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

Utiliser PowerShell pour les besoins dautomation

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

Administrer Exchange avec PowerShell

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

Utiliser PowerShell pour les besoins dautomation

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

Administrer Exchange avec PowerShell

317

write-host Get-ScriptHeader $ScriptName $ScriptUsage Show-ScriptUsage $ScriptCommand $ScriptParams $ScriptExamples Return }

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

Utiliser PowerShell pour les besoins dautomation

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

Administrer Exchange avec PowerShell

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

Utiliser PowerShell pour les besoins dautomation

} } 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

Administrer Exchange avec PowerShell

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

Les Figures 11.6 et 11.7 illustrent son excution.

322

Partie 3

Utiliser PowerShell pour les besoins dautomation

Figure 11.6
Excution au cours du script ProvisionExchangeUsers.ps1.

Figure 11.7
Excution du script ProvisionExchangeUsers.ps1 termine.

Chapitre 11

Administrer Exchange avec PowerShell

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

Utiliser PowerShell pour les besoins dautomation

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

Administrer Exchange avec PowerShell

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

Utiliser PowerShell pour les besoins dautomation

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

Administrer Exchange avec PowerShell

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

Utiliser PowerShell pour les besoins dautomation

$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

Administrer Exchange avec PowerShell

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

Expressions 47 Extended Type System (ETS) 83 Extension des types dobjet 84

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

Vous aimerez peut-être aussi