Vous êtes sur la page 1sur 350

Rfrence

PowerShell
Windows

Tyson Kopczynski

Rseaux
et tlcom
Programmation

Gnie logiciel

Scurit
Systme
dexploitation

Windows
PowerShell

Tyson Kopczynski

CampusPress a apport le plus grand soin la ralisation de ce livre afin de vous fournir une
information complte et fiable. 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

Titre original : Windows PowerShell


Unleashed

75010 PARIS
Tl. : 01 72 74 90 00

Ralisation pao : La B.

Traduction : Herv Soulard

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

1
1
2
2

Partie I. Introduction PowerShell


Chapitre 1 Introduction aux shells et PowerShell . . . . . . . . . . . . . . . . . . . . . . . .

Rle du shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Historique des shells . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Arrive de PowerShell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
En rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Chapitre 2 Les fondamentaux de PowerShell . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

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

7
8
17
18
20
21
21
22
25
26
38
41
47
49
53
57
59
62
65

IV

Table des matires

Windows PowerShell

Chapitre 3 Prsentation avance de PowerShell . . . . . . . . . . . . . . . . . . . . . . . . . . .

Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Orientation objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Comprendre les fournisseurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Comprendre les erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Grer les erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Profils . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Comprendre la scurit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Langage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
En rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Chapitre 4 Signer du code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Quest-ce que la signature du code ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Obtenir un certificat de signature du code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Signer des scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Vrifier 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

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

Partie II. Appliquer ses connaissances PowerShell


Chapitre 6 PowerShell et le systme de fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . .

Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Grer le systme de fichiers 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

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

179
179
179
184
205
207
207
207
215
229
231
231
231
238
261

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

Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Exchange Management Shell (EMS) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Le script GetDatabaseSizeReport.ps1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Le script GetEvent1221Info.ps1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Le script ProvisionExchangeUsers.ps1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
En rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

293
293
294
299
309
320
328

Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

331

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 certifications en scurit, dont GIAC
Security Essentials Certification (GSEC), Microsoft Certified Systems Engineer (MCSE)
Security, CompTIA Security+ et GIAC Certified 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 afin 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 reflte 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 fichiers 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
modifications 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 dfinition 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 afin 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
fichiers, 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 afin den augmenter les possibilits. Ensuite, nous prsenterons lvolution des shells depuis ces trente-cinq dernires annes. Enfin, 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 difficile dexpliquer la diffrence aux utilisateurs non techniques (ce qui conduit lautomation des tches
et, par consquent, une plus grande efficacit 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 afin 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 fichier excutable.

Chapitre 1

Introduction aux shells et PowerShell

Premires utilisations du shell


De nombreuses commandes du shell, comme laffichage du contenu du rpertoire de travail,
sont simples. Cependant, les shells peuvent rapidement devenir complexes lorsquon souhaite
effectuer des traitements plus puissants.
Lexemple suivant affiche 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 fichiers ne suffit 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 fins dillustration, non pour vous enseigner les complexits du shell Bash.

Largument pass la commande suivante permet dafficher des informations plus dtailles
sur chaque fichier :
$ ls l
total 8
drwxr-xr-x

13 root

admin

drwxrwxr-x

57 root

admin

442 Sep 18 20:50 apache2

drwxrwxr-x

5 root

admin

drwxrwxr-x

30 root

admin

1020 Sep 19 22:30 include

drwxrwxr-x

102 root

admin

3468 Sep 19 22:30 lib

drwxrwxr-x

3 root

admin

lrwxr-xr-x

1 root

admin

drwxrwxr-x

3 root

admin

102 Sep 18 20:11 sbin

drwxrwxr-x

13 root

admin

442 Sep 19 22:35 share

drwxrwxr-x

3 root

admin

102 Jul 30 21:05 var

1938 Sep 19 22:35 bin


170 Sep 18 20:50 etc

102 Sep 18 20:11 libexec


9 Sep 18 20:12 man -> share/man

Partie 1

10

Introduction PowerShell

Nous devons prsent dcider de lutilisation de ces informations. Comme vous pouvez le
constater, les rpertoires et les fichiers sont mlangs. Il est donc difficile de les distinguer.
Pour nafficher que les rpertoires, nous pouvons filtrer les rsultats en envoyant la sortie de
la commande ls vers la commande grep. Dans lexemple suivant, la sortie a t rduite afin
de nafficher que les lignes commenant par la lettre d, qui indique que le fichier est un rpertoire (directory).
$ ls -l | grep ^d
drwxr-xr-x

13 root

admin

drwxrwxr-x

57 root

admin

442 Sep 18 20:50 apache2

drwxrwxr-x

5 root

admin

drwxrwxr-x

30 root

admin

1020 Sep 19 22:30 include

drwxrwxr-x

102 root

admin

3468 Sep 19 22:30 lib

drwxrwxr-x

3 root

admin

102 Sep 18 20:11 libexec

drwxrwxr-x

3 root

admin

102 Sep 18 20:11 sbin

drwxrwxr-x

13 root

admin

442 Sep 19 22:35 share

drwxrwxr-x

3 root

admin

102 Jul 30 21:05 var

1938 Sep 19 22:35 bin


170 Sep 18 20:50 etc

Nous disposons ainsi dune liste contenant uniquement les rpertoires, mais les autres informations, comme la date, les autorisations, la taille, etc., sont superflues car seuls les noms des
rpertoires nous intressent. Dans lexemple suivant, nous utilisons la commande awk pour
afficher 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 afficher 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 fichiers et ajout manuellement une seule ligne
la fin 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 fichiers 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 flux 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 signifie 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 affiche lespace disque occup par chaque rpertoire. La
commande bash, qui affiche 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 afficher 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 fichier 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

apache2

5900

bin

72

etc

2652

include

82264

lib

libexec

sbin

35648

share

166768

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, modifiez le fichier
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 affich. Puisque cette valeur peut tre
change relativement souvent, elle doit pouvoir ltre facilement. De mme, nous pouvons
la rutiliser ailleurs dans le script afin dviter davoir la modifier en de multiples
endroits.

Partie 1

14

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 affichage du
rpertoire courant. Si vous recherchez des fichiers 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 afin 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 modifier ce
script en ajoutant des paramtres de commande afin dindiquer la procdure raliser,
comme afficher 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 modifions ensuite le script pour afficher 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 naffichons 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 dafficher 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 afficher le message si ncessaire. Suite ces
modifications, 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 modifiant 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 planifier 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 afin 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 simplifier
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 dauthentification. 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 finalit 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 flexible 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 dfi 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 difficiles 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 signifiait 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 efficace 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 flot 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 final, 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 dfi 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
fichiers .cmd. Enfin, 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 stupfiant 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 bnficier 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 efficacement 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, affichait 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,
dfinirons 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
vrifier que la configuration 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 fichier tlcharg. (Le nom du
fichier diffre selon la plate-forme, la version de Windows et la langue.) Aprs le dmarrage
de linstallation, suivez les instructions dinstallation affiches.

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 fichier 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-fichier-dinstallation-de-PowerShell /quiet (en remplaant le texte
en italique par le nom du fichier 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 spcifique 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 dfinitions 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 affiche 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 fichiers .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 affiche 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 affiche les informations concernant le processus dexplorer.exe. Si
aucun paramtre ni argument nest utilis, elle affiche simplement les informations concernant
tous les processus en cours et non un seul. Pour modifier 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 efficacement. 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

Opration ddition

Flches vers la gauche


et vers la droite

Dplacent le curseur vers la gauche et vers la droite sur la ligne


de commande en cours.

Flches vers le haut


et vers le bas

Parcourent la liste des dernires commandes saisies, vers le dbut


et la fin.

Insr.

Bascule en mode insertion et remplacement du texte.

Suppr.

Supprime le caractre la position courante du curseur.

Espace arrire

Supprime le caractre qui se trouve juste avant la position courante


du curseur.

F7

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

Tab

Complte automatiquement les lments de la ligne de commande.


La combinaison Maj+Tab permet de revenir en arrire dans la liste
des correspondances possibles.

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 fichiers et de rpertoires. Si nous saisissons un nom partiel et appuyons sur la
touche Tab, PowerShell retourne le premier nom de fichier 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 afin 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 suffit
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 fixe 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 affiches 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 afin


quelle corresponde leur dfinition. 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 afin de
dfinir 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 signifie que les applets de commande intgres ne sont pas
figes ; 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 dfinition
dune fonction simple dans PowerShell :
PS C:\> function ma-fonction-dir {get-childitem | ft Mode,Name}

Aprs avoir dfini ma-fonction-dir, nous pouvons lexcuter pour afficher 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 dfinies 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 dfinie 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 fichiers .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 fichier .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 :

cd,

nous

C:\>powershell -command C:\Scripts\monscript.ps1

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 modifie 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 efficaces 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 raffiche presque immdiatement et lditeur par dfaut des
fichiers ayant lextension .txt dmarre et affiche 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 fichier du
rpertoire de travail, vous devez prfixer 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 fichier 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 fin 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 fin 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 affiche
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.

Partie 1

36

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

C:\>

-psconsolele sqlsnapin.psc1
-version 1.0 -nologo -inputformat text -outputformat XML
-command {get-eventlog -logname security}
-command & {get-eventlog -logname security}

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

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

Introduction PowerShell

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 dfini 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 dfinit lopration et le nom prcise lobjet concern par lopration. Comme vous
lavez certainement not, la plupart des noms de PowerShell sont au singulier afin 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 "fish" est au singulier ou au pluriel, selon le contexte. Puisque langlais
nest sans doute pas votre langue maternelle, il vous sera difficile 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 signifie 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 afficher uniquement la dfinition 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

Type de donnes

Description

Verbose

Boolean

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.

Debug

Boolean

Gnre des dtails de lopration destins


au programmeur. Ce paramtre nest valide
quavec les applets de commande qui gnrent
des donnes de dbogage.

ErrorAction

Enum

Dtermine la rponse de lapplet de commande


aux erreurs. Les valeurs acceptes sont Continue
(par dfaut), Stop, SilentlyContinue et Inquire.

ErrorVariable

String

Dsigne une variable qui stocke les erreurs de la


commande pendant son excution. Cette variable
est modifie tout comme $error.

OutVariable

String

Dsigne une variable qui stocke la sortie


de la commande pendant son excution.

OutBuffer

Int32

Dtermine le nombre dobjets placer


dans le tampon avant dinvoquer lapplet
de commande suivante du pipeline.

WhatIf

Boolean

Affiche le droulement de lexcution de la


commande, mais sans rellement lexcuter.

Conrm

Boolean

Demande une autorisation lutilisateur avant


deffectuer toute action qui modifie le systme.

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 confirmation de lopration lutilisateur, en lui indiquant le nom de la ressource concerne par la modification.

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 affiche une aide sur les applets de commande
et dautres thmes. Pour afficher la liste de tous les sujets daide, saisissons Get-Help *
linvite de commande de PowerShell :
PS C:\> get-help *
Name

Category

Synopsis

---ac
asnp
clc
cli
clp
clv
cpi
cpp
cvpa
diff
epal
epcsv
fc

-------Alias
Alias
Alias
Alias
Alias
Alias
Alias
Alias
Alias
Alias
Alias
Alias
Alias
Alias

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

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

Introduction PowerShell

Alias

ForEach-Object

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

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

Provider
Provider
Provider
Provider
Provider
Provider
Provider

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

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

Les fondamentaux de PowerShell

HelpFile
HelpFile
HelpFile
HelpFile
HelpFile
HelpFile
HelpFile
HelpFile
HelpFile
HelpFile
HelpFile
HelpFile
HelpFile
HelpFile
HelpFile

43

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

PS C:\>

Si cette liste semble trop longue pour tre utile, nous pouvons la raccourcir en appliquant un
filtre 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 affiche des informations complmentaires sur
une applet de commande, y compris la description des paramtres et des exemples dutilisation. Le paramtre -full affiche 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

Description

Nom

Le nom de lapplet de commande

Rsum

Courte description du rle de lapplet de commande

Description dtaille

Description dtaille du comportement de lapplet de commande,


gnralement avec des exemples dutilisation

Syntaxe

Dtails dinvocation de lapplet de commande

Paramtres

Paramtres reconnus par lapplet de commande

Type dentre

Type de lentre accepte par lapplet de commande

Type de retour

Type des donnes retournes par lapplet de commande

Erreurs fatales

Si cette rubrique est prsente, elle identifie les erreurs qui conduisent
larrt prmatur de lapplet de commande

Chapitre 2

Les fondamentaux de PowerShell

45

Tableau 2.3 Rubriques de laide de PowerShell (suite)


Rubrique

Description

Erreurs non fatales

Identifie les erreurs non critiques qui peuvent se produire pendant


lexcution de lapplet de commande sans pour cela la terminer

Remarques

Informations dtailles complmentaires sur lutilisation de lapplet


de commande, y compris des scnarios particuliers et des limitations
possibles ou des curiosits

Exemples

Exemple dutilisation classique de lapplet de commande

Liens connexes

Rfrences dautres cmdlets qui ralisent des tches similaires

Get-Command
Get-Command est galement trs utile, car elle affiche 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
...

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

PS C:\>

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.

Get-Command

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 fichier .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 affiche 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 daffichage avant de pouvoir tre prsent lcran.

Mme si PowerShell affiche immdiatement les rsultats des expressions, rien ne nous empche de les stocker dans des variables ou dans des fichiers 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

PM(K)
----14248

WS(K) VM(M)
----- ----24804
83

CPU(s)
-----107,51

Id
-2964

ProcessName
----------explorer

PS C:\> $Procinfo
Handles
------494

NPM(K)
-----12

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

Chapitre 2

Les fondamentaux de PowerShell

49

rsultat pour le processus explorer. Lorsque $Procinfo est affiche 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 dfinir une variable PowerShell, nous devons la nommer avec le prfixe $, lequel permet
de diffrencier les variables des alias, des applets de commande, des noms de fichiers 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 reflte 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 dfinissez 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 dfinies :
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 signification


particulire dans PowerShell car elle enregistre des informations de configuration 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.

m $Error

contient les objets derreur de la session PowerShell en cours.

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

Valeur accepte

Description

$DebugPreference

Stratgie de
commande

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

$ErrorActionPreference

Stratgie de
commande

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

$MaximumAliasCount

Entier

Nombre maximal dalias

$MaximumDriveCount

Entier

Nombre maximal de lecteurs autoriss

$MaximumErrorCount

Entier

Nombre maximal derreurs places dans $Error

$MaximumFunctionCount

Entier

Nombre maximal de fonctions pouvant tre dfinies

$MaximumVariableCount

Entier

Nombre maximal de variables pouvant tre dfinies

$MaximumHistoryCount

Entier

Nombre maximal dentres enregistres dans lhistorique


des commandes

$ShouldProcessPreference

Stratgie de
commande

Action effectuer lorsque ShouldProcess est utilis


dans une applet de commande

$ProcessReturnPreference

Boolen

Valeur retourne par ShouldProcess

$ProgressPreference

Stratgie de
commande

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

$VerbosePreference

Stratgie de
commande

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

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

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

Introduction PowerShell

%
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

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

PS C:\>

Les fondamentaux de PowerShell

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

55

56

Partie 1

Introduction PowerShell

Dcouvrir les applets de commande relatives aux alias


Plusieurs applets de commande permettent de dfinir de nouveaux alias, dexporter, dimporter et dafficher 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 dfinis 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 dfinir 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 dfinir 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 dfinie dans le fichier 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 dfinir dans le fichier 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 profil 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 signification des commandes ou des scripts. Si les alias que nous dfinissons 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 fin 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 signifie 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

Signification

Apostrophe

`"

Guillemets

`0

Caractre nul

`a

Alarme (mission dun bip)

`b

Espace arrire

`f

Saut de page (pour les impressions)

`n

Saut de ligne

`r

Retour chariot

`t

Tabulation horizontale (8 espaces)

`v

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 fil 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 dfinies dans
la porte globale. Cependant, les portes globales ne sont pas partages entre les diffrentes
instances de PowerShell.
Lexemple suivant montre la dfinition de la variable globale $Processus dans la fonction
AfcherProcessus. Puisque la variable $Processus est dfinie 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 fixer la porte
dune variable. Par exemple, si vous souhaitez quune variable rside dans la porte globale,
dfinissez-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 filtre 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 modifier.

60

Partie 1

Introduction PowerShell

Lexemple suivant montre la variable locale $Processus dfinie dans la fonction


AfcherProcessus. Aprs la fin dAfcherProcessus, la variable $Processus ne contient plus
aucune donne car elle a t dfinie uniquement dans la fonction AfcherProcessus. Comme
vous pouvez le constater, laffichage 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 fichier 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

PS C:\> $Processus[0]
Impossible dindexer dans un tableau Null.
Au niveau de ligne : 1 Caractre : 12
+ $Processus[0 <<<< ]
PS C:\>

CPU(s)
-----0,05

Id ProcessName
-- ----------916 alg

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 affiches sur la console. En revanche,
lorsque nous essayons daccder aux informations contenues dans la variable $Processus
depuis la console, une erreur est affiche 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 fin 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 suffit de prfixer 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 dfinitions ne
sont pas hrites par les portes enfants.
Lexemple suivant montre la dfinition 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 affiche. Mme si lutilisation interactive de PowerShell est pratique pour des tches qui ne doivent tre effectues
quune seule fois, cette mthode nest pas efficace pour reproduire des tches dautomation.
Heureusement, PowerShell est capable de lire des fichiers 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 fichiers texte enregistrs avec lextension .ps1. Nous
pouvons utiliser nimporte quel diteur de texte, comme Bloc-notes, pour crer un fichier 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 fichier 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 configuration 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 configuration 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 fix 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 fichier. 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

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

Introduction PowerShell

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 affiche 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 filtrer 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 bnficier, vous devez simplement
mieux comprendre les fonctionnalits de PowerShell afin 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 difficile 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
Profils
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 modifier 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 signifie 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 afin 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 difficile 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 modifier 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 simplifie galement lusage du shell.
Plutt que de modifier 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 afin 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 lidentifiant 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 filtre 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 affich dans le bon format.
La commande ne fonctionne pas car le shell Bash nous oblige manipuler les donnes
textuelles pour afficher 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 difficiles 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 dafficher 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

Puisque nous disposons du PID du processus


(arrter) ce processus :

Prsentation avance de PowerShell

bash,

71

voyons comment nous pouvons tuer

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


PS C:\>

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

un nom de classe complet, par exemple


;

[System.DirectoryServices.ActiveDirectory

.Forest]
n

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 dfinition 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 fig 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 dfinir des variables, mais galement utiliser ou
invoquer des membres statiques dune classe .NET. Pour cela, il suffit 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

:
:
:
:
:

PS C:\>

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

74

Partie 1

Introduction PowerShell

Rflexion

La rflexion 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 affiche 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

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

75

Method
Method
Method

System.Int32 get_BasePriority()
System.ComponentModel.IContain...
System.Boolean get_EnableRaisi...

NoteProperty
Property
Property
Property
Property
Property
Property
Property
Property
Property
Property
Property
Property
Property
Property
Property

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

ScriptProperty
ScriptProperty
ScriptProperty
ScriptProperty
ScriptProperty
ScriptProperty
ScriptProperty

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

explorer
iexplore
iexplore
mobsync
notepad
notepad
notepad
notepad
OUTLOOK
powershell
WINWORD

Introduction PowerShell

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

FindOne
...
Asynchronous
AttributeScopeQuery
CacheResults
ClientTimeout
Container
DerefAlias
DirectorySynchronization
ExtendedDN
Filter
PageSize
PropertiesToLoad
PropertyNamesOnly
ReferralChasing
SearchRoot
SearchScope
SecurityMasks
ServerPageTimeLimit
ServerTimeLimit
Site
SizeLimit
Sort
Tombstone
VirtualListView

Prsentation avance de PowerShell

77

Method

System.DirectoryServices.SearchResul...

Property
Property
Property
Property
Property
Property
Property
Property
Property
Property
Property
Property
Property
Property
Property
Property
Property
Property
Property
Property
Property
Property
Property

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 filtrer les
informations renvoyes par DirectorySearcher grce la proprit Filter, qui attend une
instruction de filtre 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 identifiants
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 fixer 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

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

PS C:\>

Introduction PowerShell

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

Chapitre 3

Prsentation avance de PowerShell

81

INFO
Le paramtre MemberType demande Get-Member de retrouver un type de membre particulier.
Par exemple, pour afficher 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 difficile 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

PS C:\

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

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 afin 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 affiche 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 modifier 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 affiche 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 modifier 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 dfinir les types personnaliss dans un fichier de type, dont la
structure repose sur le fichier des types par dfaut, Types.ps1xml.
Dans ce fichier, 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 fichier 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 fichier prole.ps1.

Chapitre 3

Prsentation avance de PowerShell

85

ATTENTION
Le fichier Types.ps1xml dfinit des comportements par dfaut pour tous les objets de
PowerShell. Vous ne devez en aucun cas le modifier, 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 dfini 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 fichiers. 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 prdfinie. 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 affiche 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

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 affiche les fournisseurs PowerShell prdfinis :


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}

87

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

Get-ChildItem

89

permet ensuite dafficher 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 modifier afin 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 affiche 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

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

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

09:03
09:03
09:03

91

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

Root
----

CurrentLocation
---------------

PS C:\> get-psdrive
Name
---Alias
C
cert
D
E
Env
F
Function
G
HKCU
HKLM
PSScripts
U
Variable

Provider
-------Alias
FileSystem
Certicate
FileSystem
FileSystem
Environment
FileSystem
Function
FileSystem
Registry
Registry
FileSystem
FileSystem
Variable

C:\
\
D:\
E:\
F:\
G:\
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
D:\Dev\Scripts
U:\

software
...crosoft\windows

PS C:\>

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

Function
G
HKCU
HKLM
U
Variable

Prsentation avance de PowerShell

Function
FileSystem
Registry
Registry
FileSystem
Variable

G:\
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
U:\

93

software
...crosoft\windows

PS C:\>

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 dfini 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 efficacement.
La commande suivante affiche 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 dfinitions des proprits dErrorRecord affiches par lexemple prcdent.
Tableau 3.1 Dfinitions des proprits dErrorRecord
Proprit

Dfinition

CategoryInfo

Indique la catgorie de lerreur

ErrorDetails

Lorsquelle nest pas nulle, elle fournit des informations


supplmentaires concernant lerreur

Exception

Lerreur qui sest produite

FullyQualiedErrorId

Identifie plus prcisment une condition derreur

InvocationInfo

Lorsquelle nest pas nulle, elle dcrit le contexte dans lequel


lerreur sest produite

TargetObject

Lorsquelle nest pas nulle, elle indique lobjet cible de lopration

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 fixent 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 dfinit le comportement dune applet de commande lorsquelle rencontre une erreur non fatale. Dans lexemple prcdent, ce paramtre est fix SilentlyContinue.
Autrement dit, lapplet de commande poursuit son excution sans afficher les erreurs non fatales
qui peuvent se produire. Voici les autres options dErrorAction :
n Continue. Afficher

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 dfinit le nom de la variable pour lobjet derreur gnr par
une erreur non fatale. Dans lexemple prcdent, ErrorVariable est fix Err. Vous remarquerez que le nom de la variable ninclut pas le prfixe $. Cependant, pour accder

96

Partie 1

Introduction PowerShell

en dehors dune applet de commande, le prfixe $ est indispensable ($Err).


Par ailleurs, aprs que ErrorVariable a t dfinie, 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 prfixe + :
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 affiche par dfaut lerreur et stoppe lexcution de la
commande ou du script. Pour mettre en place une gestion personnalise des erreurs fatales,
il faut dfinir 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 affiche par dfaut lerreur et poursuit la commande ou le script.
Pour dfinir 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.

Lexcution de la porte courante est arrte et largument est


retourn, sil est prcis.

n Return

[argument].

Chapitre 3

Prsentation avance de PowerShell

Si aucun mot cl nest donn, le gestionnaire utilise Return


lobjet ErrorRecord initialement pass au gestionnaire.

[argument]

argument

97

tant

Exemples dinterception

Les deux exemples suivants montrent comment dfinir 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 fix 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 fix 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 dfini et excut au sein de la mme porte. Par exemple, nous pouvons dfinir
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 signifie 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 dfinir 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:\>

Profils
Un profil est un ensemble enregistr de paramtres qui personnalisent lenvironnement PowerShell. Il existe quatre types de profils, chargs dans un ordre prcis chaque dmarrage de
PowerShell. La section suivante explique ces types de profils, o ils doivent tre placs et
lordre de leur chargement.

Le profil Tous les utilisateurs


Ce profil se trouve dans le fichier %windir%\system32\windowspowershell\v1.0\prole.ps1.
Les paramtres qui y sont dfinis sont appliqus tous les utilisateurs PowerShell sur la
machine courante. Si vous voulez configurer PowerShell pour lensemble des utilisateurs
dune machine, vous devez modifier ce profil.

Le profil Tous les utilisateurs pour un hte spcifique


Ce profil se trouve dans le fichier %windir%\system32\windowspowershell\v1.0\IdShell_
prole.ps1. Les paramtres qui y sont dfinis 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 afin dexcuter des commandes et des scripts PowerShell. Il sagit alors dune
application hte, qui utilise un profil particulier pour contrler la configuration de PowerShell.
Le nom du profil dhte spcifique inclut lidentifiant du shell. Dans la console PowerShell,
cet identifiant est le suivant :
PS C:\> $ShellId
Microsoft.PowerShell
PS C:\>

En runissant ces noms, le profil Tous les utilisateurs pour un hte spcifique de la
console PowerShell sappelle donc Microsoft.PowerShell_prole.ps1. Pour les autres
htes, lidentifiant du shell et les noms des profils sont diffrents. Par exemple, loutil
PowerShell Analyzer (www.powershellanalyzer.com) est un hte qui offre une interface graphique labore pour PowerShell. Son identifiant de shell est PowerShellAnalyzer.
PSA et son profil Tous les utilisateurs pour un hte spcifique est PowerShellAnalyzer.PSA
_prole.ps1.

Le profil Utilisateur courant


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

Le profil Utilisateur courant pour un hte spcifique


Ce profil se trouve dans le fichier %userprole%\My Documents\WindowsPowerShell\IdShell_
prole.ps1. Comme pour le profil Tous les utilisateurs pour un hte spcifique, ce type de
profil 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 profil nest charg peut safficher. Vous pouvez changer ce
comportement en modifiant 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 fichiers de configuration 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 fichiers de configuration signs numriquement par un diteur
de confiance peuvent tre excuts ou chargs.
Stratgie AllSigned

La stratgie dexcution AllSigned est moins contraignante que Restricted. Lorsquelle est
active, seuls les scripts et les fichiers de configuration signs numriquement par un diteur
de confiance 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 fichier de configuration exige un certificat de signature de


code. Ce certificat peut provenir dune autorit de certification (CA, Certificate Authority) ou
nous pouvons en gnrer un avec loutil de cration dun certificat (Makecert.exe). Cependant,
il est gnralement prfrable dobtenir un certificat de signature de code auprs dune autorit de certification 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 fichiers de configuration risque dtre plus difficile car votre ordinateur
nest pas, par dfaut, une autorit de certification approuve.
INFO
Le Chapitre 4, "Signer du code", explique comment obtenir un certificat de signature du
code valide et digne de confiance. Nous conseillons fortement de le lire car la signature
numrique des scripts et des fichiers de configuration 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 fichiers de configuration PowerShell distants qui
nont pas t signs numriquement par un diteur de confiance. Les scripts et les fichiers de
configuration qui ont t crs localement peuvent tre chargs et excuts, mme sils nont
pas t signs.
Un script ou un fichier de configuration distant peuvent tre obtenus partir dune application de communication, comme Microsoft Outlook, Internet Explorer, Outlook Express ou
Windows Messenger. Lexcution ou le chargement dun fichier 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 fichier de configuration distant non sign, il faut
indiquer que le fichier est digne de confiance. Pour cela, cliquez du bouton droit sur le fichier
dans lexplorateur Windows et choisissez Proprits. Dans longlet Gnral, cliquez sur le
bouton Dbloquer (voir Figure 3.1).
Aprs que le fichier a t approuv, le script ou le fichier de configuration peut tre excut
ou charg. Sil est sign numriquement, mais si lditeur nest pas de confiance, PowerShell
affiche 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 confiance ou non au contenu du
fichier.
Figure 3.1
Faire confiance un
script ou un fichier de
configuration 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 fichiers de configuration. Tous
les fichiers locaux ou signs peuvent tre excuts ou chargs, mais, pour les fichiers 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 :

Set-

PS C:\> set-executionpolicy AllSigned


PS C:\>

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


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

Lors de linstallation de PowerShell, la stratgie dexcution est fixe par dfaut Restricted.
Comme vous le savez, les configurations 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 signifie 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 fichier 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 fichiers 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 configurer le fichier 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 Configuration 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 fichier PowerShellExecutionPolicy.adm. Slectionnez
ce fichier, cliquez sur Ouvrir, puis sur Fermer. Le nud PowerShell saffiche alors sous
le nud Modles dadministration.
6. Cliquez sur le nud Modles dadministration, puis sur Affichage > Filtrage dans le
menu de la MMC stratgie de groupe. Dcochez la case Afficher 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 modifier facilement. Ce manque de scurit est probablement la
raison du retrait du fichier 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 fichiers 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 fichier .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 fichier
du rpertoire courant depuis la console PowerShell, il est ncessaire de prfixer la commande
par .\ ou ./. Cela vite que des utilisateurs PowerShell lancent accidentellement une
commande ou un script sans avoir prcis explicitement son excution.
Enfin, par dfaut, il nexiste aucune mthode pour se connecter PowerShell ou linvoquer
distance. Cependant, cela ne signifie 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 spcifiques 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 profils 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 modification 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 certificat de signature du code
Signer des scripts
Vrifier des signatures numriques
Distribuer du code sign

Introduction
Pour apprendre signer les scripts et les fichiers de configuration 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 finir,
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 certificats 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 fichiers
excutables, des DLL, etc., afin de donner un certain niveau de confiance au code, laquelle
repose sur deux hypothses. Premirement, un code sign garantit quil na pas t modifi
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 fiabilit du code sign. Pour quelles soient
valides, nous avons besoin de la signature numrique et de linfrastructure qui dfinit un
mcanisme didentification 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, afin 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 modifi.
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 fixe. Le terme " sens unique" vient du fait quil est difficile 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 certificat numrique est utilis. Il est constitu de la cl publique et des
informations didentification du propritaire de la paire de cls. Pour en garantir lintgrit,
il est galement sign numriquement. Un certificat numrique peut tre sign par son
propritaire ou par un tiers de confiance appel autorit de certification (CA, Certificate
Authority).
Lassociation dun code lentit qui la cr et publi supprime lanonymat de lexcution
du code. Par ailleurs, lassociation dune signature numrique un certificat de signature du
code peut tre compare lutilisation dune marque pour tablir une relation de confiance
et de fiabilit. Pourvus de ces informations, les utilisateurs de scripts et de fichiers de configuration PowerShell peuvent faire des choix en toute connaissance de cause sur lexcution
dun script ou le chargement de fichiers de configuration. En rsum, cest pour cela que la
signature du code est importante pour la scurit dans PowerShell.

Obtenir un certificat de signature du code


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

112

Partie 1

Introduction PowerShell

configuration PowerShell sur dautres machines, votre certificat doit tre ajout en tant
quautorit principale de confiance et en tant quditeur approuv.
Bien quil soit possible de modifier les lments approuvs, il existe deux problmes.
Premirement, les entits situes hors de votre zone dinfluence peuvent dcider de ne pas
faire confiance votre certificat car rien ne leur permet de vrifier votre identit. Deuximement,
si la cl prive associe au certificat auto-sign vient tre compromise ou invalide, il est
impossible de grer la validit du certificat chez les autres entits. cause de ces inconvnients, les certificats 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 fichiers de configuration afin
de les utiliser dans une entreprise ou de les rendre publics, vous devez choisir la seconde
mthode dobtention dun certificat de signature du code : une CA depuis une PKI valide.
Une PKI valide peut tre une entreprise commerciale bien connue et digne de confiance,
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 certificat de signature du code depuis une PKI externe peut tre
rapide et simple.
Tout dabord, un certificat doit tre achet auprs du propritaire de la PKI externe. Ensuite,
puisque lachat du certificat se fait auprs de lidentit externe, cela signifie que vous
placez une grande confiance dans lintgrit de cet organisme. Cest pourquoi les certificats de signature du code acquis auprs de PKI commerciales doivent se limiter aux certificats utiliss pour signer des scripts et les fichiers de configuration destins une
distribution publique.
De ce fait, une PKI interne doit tre utilise pour les scripts et les fichiers de configuration
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 certificats auprs de PKI
commerciales ou ignorer les besoins. Une PKI commerciale napportera peut-tre pas le
niveau de confiance ncessaire votre entreprise et lapproche ad hoc est dconseille car
elle diminue le crdit des certificats 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 fichiers signs numriquement. Enfin, 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 certificat de signature du code
peut demander beaucoup de temps. Cela ne se fait pas en une nuit. Si vous avez identifi
un besoin de PKI pour vos scripts, vous en dcouvrirez probablement dautres au sein de
votre socit. Il faut dabord les identifier 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 certificats de signature du code en sachant que linfrastructure prend totalement en charge la distribution de vos scripts et de vos fichiers de configuration PowerShell signs.

Mthode 1 : certificat auto-sign


La cration dun certificat 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 certificat 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 certificat 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. Enfin, saisissez la commande PowerShell suivante pour vrifier linstallation du certificat :


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 : certificat sign par une CA


Cette mthode sappuie sur lobtention dun certificat partir dune autorit de certification
Microsoft Windows. Ces tapes supposent quune PKI a t dploye dans votre entreprise. Si ce
nest pas le cas, linstallation des services de certificats Windows pour rpondre votre besoin
immdiat est dconseille. Procdez comme suit pour obtenir un certificat de signature du code :
1. Demandez votre administrateur PKI de crer et dactiver un modle de certificat de
signature du code pour vos scripts et vos fichiers de configuration PowerShell.
2. partir dInternet Explorer, allez sur le site des services dinscription Web de lautorit
de certification ladresse https://NomServeurCA/certsrv (en remplaant NomServeurCA
par le nom de votre serveur).
3. Cliquez sur le lien Demander un certificat.
4. Sur la page Demander un certificat, cliquez sur le lien Demande de certificat avance.
5. Sur la page Demande de certificat avance, cliquez sur le lien Crer et soumettre une
demande de requte auprs de cette Autorit de certification.
6. Dans la section Modle de certificat, slectionnez le certificat de signature du code cr
par votre administrateur PKI.
7. Saisissez les informations didentification manquantes et les options de demande de
certificat 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 saffiche (voir Figure 4.2),
cliquez sur Oui pour continuer.

Chapitre 4

Signer du code

115

Figure 4.1
Exemple de demande
de certificat de
signature du code.

Figure 4.2
Bote de message
Violation de script
potentielle.

10. Ensuite, si ncessaire, fixez 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 certificats,
demandez-lui dapprouver la demande que vous venez de soumettre. Sinon, passez
directement ltape 16.
12. Aprs lapprobation de la demande de certificat, utilisez Internet Explorer pour accder
au site des services dinscription Web de lautorit de certification ladresse https://
NomServeurCA/certsrv (en remplaant NomServeurCA par le nom de votre serveur).
13. Cliquez sur le lien Afficher le statut dune requte de certificat 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 Certificat mis, cliquez sur le lien Installer ce certificat.
16. Dans la bote de message Violation de script potentielle qui saffiche (voir Figure 4.4),
cliquez sur Oui pour continuer.
Figure 4.4
Bote de message Violation
de script potentielle.

17. Enfin, le site des services dinscription Web de lautorit de certification signale que le
certificat a t install avec succs. Saisissez la commande PowerShell suivante pour
vrifier son installation :
PS C:\> get-childitem cert:\CurrentUser\My -codesign

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

Thumbprint
---------5CBCE258711676061836BC45C1B4ACA6F6C7D09E

PS C:\>

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

Chapitre 4

Signer du code

117

Loutil dimportation de fichiers de certificats


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

Pour importer la combinaison SPC+PVK, vous devez utiliser loutil de Microsoft appel
PVK Digital Certificate 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 fichiers SPC et PVK, en indiquant
vos propres fichiers :
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 fichier du script signer numriquement. Le second, certicate, dsigne le
certificat X.509 utilis pour signer le script. Pour que le certificat X.509 soit dans un

118

Partie 1

format reconnu par


Get-ChildItem :

Introduction PowerShell

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 certificat 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 filtre afin dobliger Get-ChildItem ne rcuprer
que les certificats de signature du code. Enfin, pour tre certain que lintgralit de la chane du
certificat est incluse dans la signature numrique, le paramtre includeChain est dfini.
Aprs lexcution de lapplet de commande Set-AuthenticodeSignature, le fichier sign possde
un bloc de signature valide qui contient la signature numrique. Un bloc de signature se trouve
toujours la fin du script ou du fichier de configuration PowerShell. Il est facile identifier 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 fichiers de configuration PowerShell. Comme nous lavons expliqu au Chapitre 3, les fichiers de configuration, selon la stratgie dexcution en place, peuvent galement avoir besoin dtre signs
pour tre chargs dans une session PowerShell.

Vrifier des signatures numriques


Pour vrifier la signature dun script ou dun fichier de configuration 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 fichier.
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 affiche par lexemple prcdent, le script a t modifi, falsifi ou corrompu.
Sil a t modifi par son propritaire, il doit tre nouveau sign avant de pouvoir tre utilis.
Sil a t falsifi, il doit tre supprim car sa validit et son authenticit ne sont plus garanties.

Distribuer du code sign


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

Chapitre 4

Signer du code

121

Figure 4.5
Le chemin de certification.

Figure 4.6
Magasin de certificats Autorits de certification racines de confiance.

Si un diteur est approuv, son certificat de signature du code rside dans le magasin diteurs
approuvs (voir Figure 4.7).

122

Partie 1

Introduction PowerShell

Figure 4.7
Magasin de certificats 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 signification des options disponibles :


n

[M] Ne jamais excuter. Cette option place le certificat de lditeur dans le magasin
Certificats non autoriss. Lorsque le certificat dun diteur a t dclar non digne de
confiance, PowerShell interdit tout jamais lexcution du code provenant de cet diteur,
sauf si le certificat est retir du magasin Certificats non autoriss ou si la stratgie dexcution est fixe Unrestricted ou RemoteSigned.

[N] Ne pas excuter. Cette option, par dfaut, interrompt lexcution du code non
approuv.

Chapitre 4

Signer du code

123

[O] Excuter une fois. Cette option autorise une seule excution du code non approuv.

[T] Toujours excuter. Cette option place le certificat de lditeur dans le magasin diteurs
approuvs. Par ailleurs, le certificat de lautorit de certification racine est plac dans le
magasin Autorits de certification racines de confiance, 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 confiance dans une entreprise. Si votre socit se trouve dans un environnement
Windows, la mthode classique passe par un GPO. Par exemple, vous pouvez dfinir des
diteurs approuvs en utilisant une liste de certificats de confiance (CTL, Certificate Trust
List) ou au travers de lextension Maintenance dInternet Explorer.

Distribuer du code dans le domaine public


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

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

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 spcifique, 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 afin dviter un impact ngatif sur lenvironnement. Par consquent, lors de lcriture
dun script, la porte de ses effets doit tre vrifie. 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 dfinition
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

Phases cycliques Dveloppement

Retour au
dveloppement

Test

Dploiement

Phases cycliques Apprentissage

Maintenance

128

Partie 1

Introduction PowerShell

Rassembler efficacement les contraintes du script


Comme pour nimporte quel projet, il faut dfinir les problmes rsolus par le script afin 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, identifier
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 final 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 modification, il peut avoir des effets indsirables ou ses
implications peuvent ne pas tre totalement matrises. Pire encore, lorsquil est excut afin
de vrifier son fonctionnement, sil nest pas lanc dans lenvironnement de test dfini, 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 modifier 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 planification, 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 planification 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 configuration au dbut du script


Les variables ou les paramtres qui dfinissent la configuration du script doivent toujours
tre placs au dbut. Ainsi, toute personne qui utilise, lit ou modifie 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 modification de la configuration du script. Si les informations de configuration sont rparties dans tout le script, il
risque dtre mal configur, 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 suffisamment 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 figer des informations de configuration


Figer des informations de configuration dans le code est une erreur classique. Les informations requises ne sont pas demandes aux utilisateurs, elles sont figes dans des variables ou
rparties alatoirement dans le script. Cette mthode impose aux utilisateurs dintervenir
manuellement dans les scripts pour en modifier la configuration. Cela augmente donc les
risques derreurs et des problmes dexcution. Noubliez pas que lun des objectifs est de
fournir des scripts utilisables. Les informations figes 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 fichiers de configuration, comme le montre lexemple suivant, afin que
les utilisateurs puissent configurer plus aisment le script.
param([string] $CheminRechercheADSI=$(throw "Veuillez indiquer le chemin ADSI ! "))

Si ncessaire, utiliser des variables


Si les informations de configuration ne doivent pas tre figes dans le script, elles doivent
cependant tre reprsentes par des variables. Le fait de dfinir 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 modification de cette information. Par ailleurs, le
regroupement des informations de configuration en un mme endroit, en particulier au dbut
du script, diminue galement le temps ncessaire la reconfiguration 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 fichier 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 vrification 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 fichier CSV afin de crer un tableau HTML. Au
lieu de copier et de modifier cette logique dans de nouveaux scripts, il est prfrable de crer
un script ou un fichier 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 fichiers de scripts et de bibliothque sont faciles importer, en invoquant du code rutilisable depuis une console PowerShell ou en chargeant le
fichier de script ou de bibliothque laide de linstruction point. Lexemple suivant montre
une suite de fichiers 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 difficiles 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 modifications futures seront simplifies. Si vous respectez des conventions
de nommage cohrentes et vitez des alias, la modification du script doit tre un jeu denfant.

Afficher des informations dtat


Dans un script dautomation, il est important dafficher des informations dtat afin 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 suffisamment 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 affichage personnalis.

Chapitre 5

Suivre les bonnes pratiques

135

Figure 5.2
Exemple daffichage dinformations dtat.

Utiliser les paramtres WhatIf et Confirm


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 modifications non voulues. Le paramtre WhatIf retourne des informations sur les modifications 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 affiches 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 modifications 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 afin didentifier 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 modifications.

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 fichiers de configuration


Comme nous lavons soulign au Chapitre 4, "Signer du code", les scripts et les fichiers de
configuration 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 fichiers de configuration
PowerShell. Les mmes principes sappliquent dautres lments, comme les fichiers excutables, les macros, les DLL, dautres scripts, les pilotes de priphriques, les images de micrologiciel et ainsi de suite. Tout code peut bnficier de la scurit des signatures numriques
et vous pouvez ainsi limiter les possibilits dexcution dun code illgitime dans votre environnement.

Ne jamais fixer 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
fixe RemoteSigned. Cette configuration autorise lexcution des scripts et le chargement
des fichiers de configuration 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 fichiers de configuration doivent alors tre signs par
une source de confiance 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 afin 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 infligs 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 signifie 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 modifier. 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, afin de rduire la complexit inhrente lutilisation de diffrents langages.
Deuximement, les scripts VBScript sont placs dans un fichier 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 affichs par les scripts tudis dans ce livre ont t traduits afin
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 modifier 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 certificat 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 dfinir 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 signifie 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.

Enfin, 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 fichiers de journalisation et des classes Windows
Forms.

En rsum
Au fil 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 fige.
Le vritable objectif de ce chapitre tait de vous inviter rflchir 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 fichiers
Dans ce chapitre
m

Introduction

Grer le systme de fichiers depuis WSH et PowerShell

Manipuler les autorisations

De VBScript PowerShell

Introduction
Ce chapitre sintresse la gestion du systme de fichiers 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 afin que le lecteur puisse passer
PowerShell en bnficiant 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 fichiers 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 fichiers depuis WSH et PowerShell


WSH propose plusieurs mthodes de manipulation du systme de fichiers 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 fichiers
et des dossiers. La plupart des crateurs de scripts se servent du modle FSO pour manipuler
le systme de fichiers.
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 fichiers. Il permet gnralement aux programmeurs de manipuler le systme de fichiers comme bon leur semble,
mais, dans certains cas, ses fonctionnalits ne sont pas suffisantes 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 fichiers de Windows. Ce fournisseur apporte une couche dabstraction
entre PowerShell et le systme de fichiers de Windows qui fait que ce dernier ressemble un
magasin de donnes hirarchique. Par consquent, laccs au systme de fichiers 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 fichiers. La commande
suivante affiche 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 fichiers

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 fichiers


Dans WSH, nous pouvons accder aux informations dun fichier et crer, modifier, copier,
dplacer et supprimer des fichiers 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 fichier et de manipuler des fichiers :
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 fichiers


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 fichiers prsente quelques limites. Par exemple, il nexiste aucune solution simple pour modifier les autorisations dun
fichier 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 fichiers 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 modifier les
autorisations du systme de fichiers. Il nest pas parfait, mais, en le compltant par des scripts,
il suffit gnralement cette tche. Par ailleurs, SubInACL prend en charge les fichiers, les

Chapitre 6

PowerShell et le systme de fichiers

149

rpertoires, les partages de fichiers 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

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 modifier les autorisations du systme de fichiers, 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 fichier 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 finalement 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 fichiers

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 fichiers est plus facile dans PowerShell. Cependant, Set-ACL a
besoin dun objet descripteur de scurit dfini 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 finalement 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 difficile comprendre reste la construction de la rgle daccs. Celle-ci est
constitue de trois paramtres qui dfinissent 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 fichiers avant de pouvoir dfinir 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 fichiers

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 dfinir un seul droit, comme Modify (modifier), 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
}

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 dfinies
sur les sous-objets. Par consquent, avant de linvoquer, il est prfrable que vous deveniez
le propritaire de lobjet ou que vous vrifiiez que vous avez dfini explicitement vos droits
sur lobjet du systme de fichiers racines. Si vous ntes pas certain davoir accs aux objets
du systme de fichiers, vous risquez de rencontrer des messages "accs refus" aprs avoir
effac les droits hrits.

Clear-Inherit

La fonction suivante, Set-Owner, fixe le propritaire dun objet du systme de fichiers :


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

Ensuite, la fonction
systme de fichiers :

PowerShell et le systme de fichiers

Clear-SD

155

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
fichiers dcrit plus loin, elle illustre bien la dfinition dun descripteur de scurit laide du
langage SDDL (Security Descriptor Definition 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 fix 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 fichiers. 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 fichiers

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 dfinis de manire que lACE soit applique "Ce dossier et tous les sous-dossiers
et fichiers". Autrement dit, elle est non seulement applique lobjet en cours de modification, mais elle est galement propage tous les sous-objets de cet objet. Cette propagation devrait suffire pour la plupart des tches de gestion du systme de fichiers. Si ce nest
pas le cas, vous pouvez toujours modifier la fonction afin 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 fixer les autorisations de larborescence.
Aprs plusieurs erreurs de configuration 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 dfinition
des autorisations.

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

ProvisionWebFolders.wsf

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 fichier CSV, qui dfinit 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 vrifie le chemin du dossier modle.
2. Ensuite, il ouvre et lit le contenu du fichier CSV (nouveaux utilisateurs et emplacement
du dossier) dans un tableau.

Chapitre 6

PowerShell et le systme de fichiers

159

Figure 6.1
Excution du script ProvisionWebFolders.wsf.

3. Pour chaque utilisateur dans le tableau, il invoque xcopy afin de recopier larborescence
du dossier modle dans le dossier Web du nouvel utilisateur.
4. Il utilise ensuite SubInACL pour fixer 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 fichier 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 fin du script.

Notre premier exemple de code est constitu des lments XML initiaux dun fichier WSF.
Ils dfinissent 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 vrifie que les arguments des paramtres obligatoires templatepath et
importle sont dfinis. Si ce nest pas le cas, il affiche les informations dutilisation (voir le

Chapitre 6

PowerShell et le systme de fichiers

161

code prcdent) sur la console et se termine. Si les arguments sont dfinis, il tablit son environnement en dfinissant 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 affiche son en-tte sur la console, puis vrifie que templatepath correspond un chemin valide
du systme de fichiers. 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 affichs sur la console afin 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 fichier 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, affiche 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 fichiers

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 dfinit 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 fixer 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
modifies.

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 fichiers

165

Le premier appel SubInACL modifie les autorisations sur le dossier racine, tandis que le
second modifie celles des sous-dossiers et fichiers 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 fixe pas toujours correctement les
paramtres dhritage. Certains sous-dossiers et fichiers risquent alors de ne pas hriter des
autorisations du dossier racine. En appelant une seconde fois SubInACL pour modifier les
autorisations des sous-dossiers et des fichiers 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
finale du script car ces procdures et fonctions sont suffisamment 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 fichiers

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 fichiers

169

Le script ProvisionWebFolders.ps1
ProvisionWebFolders.ps1 est une conversion en PowerShell du script ProvisionWebFolders.
wsf.

Vous en trouverez une version oprationnelle dans le dossier Scripts\Chapitre


et en tlchargement sur le site www.pearsoneducation.fr.

6\

ProvisionWebFolders

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 fichier CSV qui dfinit 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 vrifie que le chemin du dossier modle existe.
2. Ensuite, il vrifie que le chemin du fichier import existe.
3. Il importe le fichier 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 finir, le script fixe 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 dfinition dun paramtre en arrtant lexcution du script et en affichant lutilisateur des informations concernant
le paramtre requis, avec lapplet de commande Write-Host. Cette applet accepte un paramtre Foregroundcolor, qui fixe la couleur du texte affich. Cette fonctionnalit permet dattirer
lattention sur des dtails de ltat du script (voir Figure 6.3).

Chapitre 6

PowerShell et le systme de fichiers

171

Figure 6.3
Texte affich en vert et en rouge sur la console pour indiquer ltat du script.

Ensuite, le script place les fonctions de gestion du systme de fichiers 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 fichiers

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


vrifie si la chane contenue dans la variable $TemplatePath correspond un chemin de
dossier valide, puis si la variable $ImportFile dsigne un chemin de fichier valide. Pour
raliser ces tests, les instructions if...then utilisent lapplet de commande Test-Path. Cette
applet trs pratique permet de vrifier si un dossier ou un fichier (-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 affiches 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 dfinissons les autres variables employes dans le script. La premire, $Owner,
dfinit le propritaire de larborescence du dossier Web de chaque utilisateur, qui, dans ce
cas, est le groupe local Administrateurs. Ensuite, nous dfinissons la variable $Targets
laide de lapplet de commande Import-Csv, laquelle permet de lire des valeurs depuis un
fichier 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 final, 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 fichiers

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

177

Comme nous lavons mentionn prcdemment, la fonction Clear-Inherit supprime les


autorisations hrites pour le dossier racine, ses sous-dossiers et ses fichiers, ainsi que les
autorisations explicitement dfinies sur tous les sous-dossiers et les fichiers. Si le groupe
Administrateurs navait pas dfini explicitement des droits sur le dossier racine, la suite du
script ne sexcuterait pas par manque de droits.
INFO
Les autorisations dfinies explicitement sont celles qui sont spcifies directement pour un
utilisateur sur un objet. Les autorisations dfinies implicitement sont celles qui sont hrites
ou dfinies par lappartenance un groupe.

Dans le dernier exemple de code, lautorisation FullControl sur le dossier Web de lutilisateur est
donne SYSTEM et lutilisateur. Pour finir, le script signale loprateur la fin 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 fichiers de Windows quand on
utilise WSH et PowerShell. Mme si ces deux solutions de scripts disposent de mthodes de
gestion du systme de fichiers, 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 fichiers.
Vous avez pu comprendre les diffrences entre WSH et PowerShell, quant la manipulation
du systme de fichiers 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 difficile. 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 dfinie, qui vrifient 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

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 afin que vous puissiez passer PowerShell en bnficiant 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 modification 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.

cre de nouvelles cls, ajoute une nouvelle valeur nomme une cl existante
ou modifie une valeur nomme existante.

n RegWrite

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 afin de modifier
lemplacement de la racine du fournisseur Registry.

Le Chapitre 3 a galement expliqu que lutilisation du fournisseur Registry signifie 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

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

PowerShell et le Registre

Name
---AppEvents
Console
Control Panel
Environment
Identities
Keyboard Layout
Printers
Software
UNICODE Program Groups
Windows 3.1 Migration Status
SessionInformation
Volatile Environment

181

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 fichiers. 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 suffit 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 modification 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 modification des valeurs du Registre. Les
bonnes pratiques conseillent de toujours dfinir 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 modification. 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 fichiers 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
lefficacit 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 dfinition 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 suffit dinclure ou de charger le fichier 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
modifier 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 fichier 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
est un fichier VBScript qui fournit des fonctions de lecture et de
modification 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., dfinies dans le fichier inclus.

LibraryRegistry.vbs

Dans VBScript, il existe deux mthodes pour inclure un fichier de script dans un autre. La
premire ne fonctionne quavec les fichiers 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 officielle 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 fichiers dans un script. La mthode plus fiable et robuste consiste passer par un
fichier 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 fichier WSF peut parfaitement
inclure un fichier JScript. Lopration inverse est galement possible ; une tche JScript peut
inclure un fichier VBScript. Il est galement possible dincorporer les deux types de fichiers
dans un script ou de crer un seul fichier WSF qui effectue plusieurs tches en utilisant des
langages (moteurs) diffrents pour chacune. Quelle que soit la mthode choisie, aprs avoir
inclus un fichier 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

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

n strKeyPath.

Le chemin de la cl qui contient la valeur du Registre.

n strValueName.

Le nom de la valeur du Registre dont nous voulons obtenir les donnes.

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 :

HKEY_LOCAL_MACHINE.

Elle attend les

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

"." dsigne la machine locale.


n strKeyPath.

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

cre ou modifie une valeur du Registre dans la ruche


LOCAL_MACHINE. Elle attend les paramtres suivants :
CreateRegValue

HKEY_

n strComputer.

Le nom ou ladresse IP de lordinateur sur lequel nous voulons crer ou


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

n strKeyPath.

Le chemin de la cl qui contient la valeur du Registre.

n strValueName.
n strValue.

Le nom de la valeur du Registre que nous voulons crer ou modifier.

Le nouveau contenu de la valeur du Registre.

n strType.

Une chane qui reprsente le type de la valeur du Registre que nous voulons
crer ou modifier, 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 modifions. 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. Enfin, lors de la cration ou de la modification 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.

n strKeyPath.

Le chemin de la cl du Registre supprimer.

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 :

HKEY_LOCAL_MACHINE.

Elle

m strComputer.

Le nom ou ladresse IP de lordinateur sur lequel nous voulons supprimer


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

m strKeyPath.

Le chemin de la valeur du Registre.

m strValueName.

Le nom de la valeur du Registre supprimer.

Voici un exemple dutilisation de cette fonction :


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

Le script LibraryRegistry.ps1
est la version PowerShell du fichier 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 fichier. Par
exemple, . .\monScript.ps1. Ainsi, pour charger LibraryRegistry.ps1 dans une session
PowerShell, saisissez la commande suivante :

LibraryRegistry.ps1

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 fichier 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 fichier de script chaque nouvelle session.

Chapitre 7

PowerShell et le Registre

193

Pour viter ce problme, nous pouvons utiliser un profil PowerShell afin de dfinir la configuration de la console PowerShell. Grce un profil comme Prole.ps1 et en utilisant la
commande point dans ce profil, nous pouvons charger des fichiers de script dans la porte
globale chaque fois que nous dmarrons une nouvelle session de console. Voici un exemple
de fichier 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 fichier de
script. Dans ce cas, PowerShell charge le fichier 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 profil 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 dfinies dans
LibraryRegistry.ps1 ont t charges dans la session PowerShell en cours :
PS C:\> get-childitem Function:
CommandType
----------Function
Function
Function

Name
---prompt
TabExpansion
Clear-Host

Denition
---------PS + $(Get-Location) + $(...
...
$spaceType = [System.Managem...

194

Partie 2

Function
Function
Function
Function
Function
Function
Function
Function

Appliquer ses connaissances PowerShell

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,

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

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

n $KeyPath.

Le chemin de la cl qui contient la valeur du Registre.

n $ValueName.

Le nom de la valeur du Registre dont nous voulons obtenir les donnes.

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.

m $KeyPath.

Le chemin de la nouvelle cl du Registre.

Voici un exemple dutilisation de cette fonction :


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

Chapitre 7

PowerShell et le Registre

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

197

198

Partie 2

Appliquer ses connaissances PowerShell

La fonction Set-RegValue cre ou modifie 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-

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


n $KeyPath.

Le chemin de la cl qui contient la valeur du Registre.

n $ValueName.
n $Value.

Le nom de la valeur du Registre que nous voulons crer ou modifier.

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.

m $KeyPath.

Le chemin de la cl du Registre supprimer.

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 :

HKEY_LOCAL_

m $Computer. Le nom ou ladresse IP de lordinateur sur lequel nous voulons supprimer une

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


m $KeyPath.

Le chemin de la cl qui contient la valeur du Registre.

m $ValueName.

Le nom de la valeur du Registre que nous voulons supprimer.

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 dfini dans la fonction affiche 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

__PROPERTY_COUNT
__DERIVATION
__SERVER
__NAMESPACE
__PATH
ReturnValue
uValue

Appliquer ses connaissances PowerShell

:
:
:
:
:
:
:

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

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

PS C:\>

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

2
__PARAMETERS
__PARAMETERS
2
{}

0
Fin de la modication du Registre !

203

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 signifie
que la mthode WMI sest parfaitement excute.
Nous avons vrifi 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

__NAMESPACE
__PATH
ReturnValue

PowerShell et le Registre

205

:
:
: 0

PS C:\>

En rsum
Ce chapitre sest focalis sur la gestion du Registre de Windows par le biais de lutilisation
de WSH et PowerShell. Bien que ces deux interfaces de script fournissent des mthodes de
gestion du Registre, la version PowerShell est plus robuste car elle considre le Registre
comme un magasin de donnes hirarchique. Cependant, limplmentation actuelle a pour
inconvnient de ne proposer aucune mthode de gestion du Registre sur une machine distante
(cest galement le cas de WSH). Pour contourner ce problme, nous avons combin
PowerShell et WMI afin 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 fichiers 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 fichier de bibliothque.

8
PowerShell et WMI
Dans ce chapitre
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. Enfin, nous prsentons la conversion dun script VBScript en PowerShell
afin 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 lauthentification, 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 fichier 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

Enfin, 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 affichons 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 suffit 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

PS C:\>

:
:
:
:
:
:

0
Virtual Server
656
Auto
Running
OK

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

Enfin, 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
dfinition 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 dfinir 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 dfinition 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

Type

[int]

typeof(int)

[int[]]

typeof(int[])

[long]

typeof(long)

[long[]]

typeof(long[])

[string]

typeof(string)

[string[]]

typeof(string[])

[char]

typeof(char)

[char[]]

typeof(char[])

[bool]

typeof(bool)

[bool[]]

typeof(bool[])

[byte]

typeof(byte)

[double]

typeof(double)

[decimal]

typeof(decimal)

[oat]

typeof(oat)

[single]

typeof(oat)

[regex]

typeof(System.Text.RegularExpressions.Regex)

[array]

typeof(System.Array)

[xml]

typeof(System.Xml.XmlDocument)

[scriptblock]

typeof(System.Management.Automation.ScriptBlock)

[switch]

typeof(System.Management.Automation.SwitchParameter)

[hashtable]

typeof(System.Collections.Hashtable)

[type]

typeof(System.Type)

[ref]

typeof(System.Management.Automation.PSReference)

[psobject]

typeof(System.Management.Automation.PSObject)

[wmi]

typeof(System.Management.ManagementObject)

[wmisearcher]

typeof(System.Management.ManagementObjectSearcher)

[wmiclass]

typeof(System.Management.ManagementClass)

[adsi]

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

__SUPERCLASS
__DYNASTY
__RELPATH
__PROPERTY_COUNT
__DERIVATION
__SERVER
__NAMESPACE
__PATH

PowerShell et WMI

215

:
:
:
:
:

CIM_UnitaryComputerSystem
CIM_ManagedSystemElement
Win32_ComputerSystem
54
{CIM_UnitaryComputerSystem, CIM_ComputerSystem, CIM_System,
CIM_LogicalElement...}
: PLANX
: ROOT\cimv2
: \\PLANX\ROOT\cimv2:Win32_ComputerSystem

PS C:\>

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 efficace 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
est un fichier 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 dfinir 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 :

MonitorMSVS.wsf

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 afin de vrifier
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. Enfin, 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 fichier WSF. Ils
dfinissent 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 vrifie ensuite si un argument a t dfini pour le paramtre obligatoire servername.


Si ce nest pas le cas, il affiche les informations dutilisation (dfinies dans le code prcdent)

218

Partie 2

Appliquer ses connaissances PowerShell

sur la console et se termine. Lorsque largument est prcis, le script configure son environnement en dfinissant 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 affiche son
en-tte sur la console, puis vrifie 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 affich
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 affiches 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

nombre de chiffres affichs aprs la virgule ;

afficher 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 dfini dans le Panneau
de configuration.

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. Enfin, ces valeurs sont converties en units plus reprsentatives :
MonitorMSVS.wsf

n Uptime,

initialement en secondes, est affich en minutes.

n PhysicalMemoryAllocated
n DiskSpaceUsed

nest plus en octets mais en mgaoctets.

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 afin 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 dfinir 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 fichiers". Dans PowerShell, vous pouvez passer le nom complet
ou partiel des paramtres :
\MonitorMSVS.ps1 -S Jupiter

Si les arguments sont dfinis 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 afin de vrifier
que le serveur est oprationnel.
2. Puis, il se connecte au site Web dadministration de MSVS afin 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. Enfin, il affiche 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
vrifier 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 affiche "[EN LIGNE]" sur la console et
poursuit son excution. En revanche, sil nest pas oprationnel, il affiche "[HORS LIGNE]"
et se termine.

226

Partie 2

Appliquer ses connaissances PowerShell

Aprs la vrification 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 dafficher 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 vrifier 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 infinies.

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], afin 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
finale, 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 afin 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 modification
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 afficher 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 modifie les tiquettes des proprits provenant de $Servers. Loprateur de format (-f) fixe 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 difficile 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 difficults. 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

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. Enfin, 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 afin 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 dfinies 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, dfinit 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

Un objet peut tre identifi par un nom, une classe ou un ADsPath.

Le conteneur d'un objet peut grer la cration et la suppression de cet objet.

La dfinition du schma dun objet peut tre obtenue.

Les attributs d'un objet peuvent tre chargs dans le cache de proprits ADSI et les
modifications peuvent tre transmises la source de donnes originelles.

Les attributs d'un objet chargs dans le cache de proprits ADSI peuvent tre modifis.

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 modifications 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 filtres 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. Enfin, il les affiche 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 fichier 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 afficher, nous invoquons lapplet de commande Format-List :
PS C:\> $Utilisateur | format-list Name, userPrincipalName, description,
physicalDeliveryOfceName

name
userPrincipalName
description
physicalDeliveryOfceName

PS C:\>

:
:
:
:

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

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 dfinit
les attributs du nouvel objet dutilisateur laide de la mthode ADSI Put(). Enfin, ce
nouvel objet est enregistr dans Active Directory laide de la mthode ADSI SetInfo().
Un message dtat concernant la cration de lobjet est affich 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 fichier


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 dfinir les attributs de lobjet dutilisateur, puis celui-ci est enregistr dans Active Directory grce la
mthode ADSI SetInfo(). Enfin, pour vrifier 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
dfinir 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 configuration tablie sur une appartenance un groupe Active Directory.

Chapitre 9

PowerShell et Active Directory

239

Cependant, face aux milliers dutilisateurs et de groupes, la vrification 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 vrification 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 fichier VBScript dvelopp pour soccuper du processus de vrification 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 dfinir deux paramtres. Largument
de groupname doit indiquer le sAMAccountName du groupe pour lequel nous devons vrifier
lappartenance de lutilisateur. Largument dimportle doit dsigner le nom du fichier CSV
import qui contient les utilisateurs devant tre vrifis. Le paramtre facultatif exportle
doit prciser le nom du fichier dexportation dans lequel le script placera son rapport.
IsGroupMember.wsf

INFO
Le fichier CSV import doit contenir une seule colonne (sAMAccountName). Le fichier 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 fichier CSV et lit les informations dutilisateurs
dans le tableau indiqu (arrUsers). Si le fichier 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 vrifie 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. Enfin, le script affiche les informations de lobjet dictUsers sur la console. Si un fichier
dexportation a t prcis, ces mmes informations y sont crites.
Le premier extrait de code donne des lments XML initiaux dun fichier WSF. Ils dfinissent 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 vrifie ensuite si des arguments ont t dfinis pour les paramtres obligatoires
groupname et importle. Si ce nest pas le cas, il affiche les informations dutilisation (dfinies dans le code prcdent) sur la console et se termine. Lorsque les arguments sont prciss, le script configure son environnement en dfinissant les variables utilises par la suite.
Puisque les tableaux VBScript ne simplifient 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 affiche son en-tte
sur la console, se lie lobjet RootDSE et rcupre le DefaultNamingContext. Nous procdons
ainsi pour deux raisons. Dune part, le script vrifie 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 modifi afin 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 fichier 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 fixer"
(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 fichier 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 vrifier 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 affiche 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 dfinie lors de lexcution du script, le fichier dexportation


est cr laide de lobjet FSO. Puis, le script parcourt nouveau lobjet dictUsers et crit
les informations des utilisateurs dans ce fichier.

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 suffisamment 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 dfinir
deux paramtres. Largument de GroupName doit indiquer le sAMAccountName du groupe pour
lequel nous devons vrifier lappartenance de lutilisateur. Largument dImportFile doit
dsigner le nom du fichier CSV import qui contient les utilisateurs vrifier. Le paramtre
facultatif ExportFile doit prciser le nom du fichier 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 fichier dexportation soit prcis et la Figure 9.3 montre son excution avec un fichier 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 laffiche sur la console PowerShell. Si la connexion choue, le script sarrte.
2. Il vrifie 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 vrifier que le fichier 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 fichier dexportation.

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

Chapitre 9

PowerShell et Active Directory

251

4. Il invoque lapplet de commande Import-Csv pour placer le contenu du fichier CSV dans
la variable $Users.
5. Il appelle la fonction Get-ADObject pour vrifier 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 fichier dexportation a t prcis, le script utilise lapplet de commande Export-Csv
pour crer un fichier CSV partir du contenu de la variable $Users. Si ce fichier nest pas
demand, il affiche 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

# $Name :
# $Usage :

Appliquer ses connaissances PowerShell

Nom du script.
Rle du script.

function Get-ScriptHeader{
param ($Name, $Usage)
$Date = Date
$Text
$Text
$Text
$Text
$Text
$Text

= ###################################### `n
+= # Script
$Name `n
+= # Usage :
$Usage `n"
+= "# Utilisateur : $Env:username `n"
+= "# Date :
$Date `n
+= ######################################

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

Chapitre 9

PowerShell et Active Directory

253

Ces fonctions sont utilises pour afficher les informations dutilisation du script, de manire
analogue celles affiches 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

: nom du groupe vrier.


: chier CSV importer.
: [facultatif] chier CSV exporter.

Format CSV :
sAMAccountName
Exemple :
ISGroupMember.ps1 "monGroupe" "utilisateurs.csv" "resultats.csv"
PS D:\Scripts>

Un fichier 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
dfinir les paramtres requis et afficher des informations sur leur utilisation au moyen du mot
cl throw. Ce mot cl a t employ dans les scripts prcdents, mais il naffichait 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, dfinit 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 modifi chaque fois. La seconde, Get-ScriptHeader, affiche
simplement le titre du script. Elle peut servir dans dautres scripts sans grandes modifications, car les paramtres $Name et $Usage dfinissent les informations affiches.
Au final, les informations dutilisation du script affiches dans lexemple prcdent grce
ces fonctions sont comparables ce que peut produire un script WSF. Bien que la modification 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 modification dans les autres scripts. Par exemple, les informations retournes par
cette fonction peuvent sappuyer sur une chane XML dont la structure ressemble celle dun
fichier 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 vrifie la connexion au domaine et
fournit une mthode permettant dafficher 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, vrifie lexistence dun objet dans Active Directory en
fonction dun identifiant 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 lidentifiant unique de lobjet ($Name),
le type ($Item) de cet identifiant 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 fixe 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. Enfin, la mthode GetDirectoryEntry() est invoque sur lentre obtenue afin
dtablir une liaison avec lobjet Active Directory rfrenc. ce stade, soit nous avons
vrifi 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 dfinies. Elles
seront employes plus loin pour afficher 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 laffichage 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 vrification des paramtres obligatoires du script. Les exemples prcdents sappuyaient sur le mot cl throw lors de la
dfinition dun paramtre (avec le mot cl param) et indiquaient ainsi les paramtres requis.
Dans ce script, la place du mot cl throw, nous vrifions la prsence du paramtre obligatoire et, sil est absent, nous affichons aux utilisateurs un message daide leur indiquant quils
ont oubli de prciser un argument. Nous pouvons galement leur afficher des informations
propos des paramtres, de leur utilisation et des exemples darguments.
Enfin, Get-ScriptHeader affiche len-tte du script. Les utilisateurs ont ainsi la confirmation
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 vrifier 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 affiche 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 vrifions 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 vrification concerne la validit du nom du fichier 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 vrification 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 &
afin de dtruire lobjet aprs lexcution du bloc de code.
Lextrait de code suivant affiche le contenu de la collection $Users sur la console. Si un
fichier 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

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
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 afin que vous sachiez comment le dployer et lutiliser efficacement.
Cependant, nous devons commencer par prsenter les raisons de ce script.

PSShell.ps1

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 afin 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 complexifie 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, afin 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 afin 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 afin damliorer la scurit, ce qui est le cas de companyabc.com.
Les utilisateurs et les administrateurs de Windows peuvent modifier 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 modifier 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 modification 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 modification 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 efficace 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 dfinir diffrentes
configurations 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 configuration 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 configuration ordinateur.
3. Retirez les utilisateurs authentifis 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 filtrage
de scurit du GPO Bureau Kiosque PSShell.
6. Enfin, liez le GPO Bureau Kiosque PSShell lunit dorganisation (UO) de premier
niveau qui contient tous vos comptes dutilisateurs et vrifiez 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 afin dempcher que les utilisateurs ayant des autorisations de scurit leves
aient un bureau non scuris.

tape 2 : configurer le remplacement du shell de Windows

Ensuite, configurez 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 Configuration 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
fichier 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 fixant le nom du fichier dinterface cmd, nous obligeons Windows utiliser cmd.exe
comme shell de remplacement. Loption /c demande cmd dexcuter le fichier de commandes C:\PSShell\Launch.bat et de sarrter, ce qui ferme la fentre de cmd aprs la fin de
lexcution de Launch.bat.
INFO
En utilisant le chemin C:\PSShell, nous supposons que les fichiers de Kiosque PSShell ont t
copis dans ce dossier sur la machine du client. Cependant, ce choix nest en rien fig 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 afficher 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 fix Hidden.
Une fois lanc le processus PowerShell laide de la mthode Start() et des arguments
adquats, Windows naffiche pas la console PowerShell.
INFO
Une fois encore, le chemin C:\PSShell dans le code source de PSShell.exe nest quune suggestion. Si vous modifiez 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 modifier PSShell.exe afin quil prenne des arguments pour
dfinir 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 fichier dinterface saisi dans le paramtre Interface utilisateur
personnalise prcise le fichier 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 finalement le script PSShell.ps1. Tout cela est un peu compliqu mais indispensable pour rpondre une dficience 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 configur
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 configuration de lenvironnement dexcution du script. Pour
cela, nous dfinissons un ensemble de chanes de commandes qui dfinissent 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.
Enfin, nous ouvrons cet espace laide de la mthode Open() afin quil puisse tre utilis par
lobjet Windows Form.
Une fois lespace dexcution dfini, nous devons construire le formulaire (fentre) lui-mme,
comme le montre lextrait de code suivant. La section "Dfinir 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 prdfinies 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 lafficher 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).

m $MenuItem3.

Utilise lapplet de commande

Get-WmiObject

pour fermer la session

Windows.
Enfin, le script doit activer la fentre et lafficher 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 configur et prt tre appliqu aux utilisateurs,
ltape suivante consiste dployer les fichiers de Kiosque PSShell sur les systmes servant
de clients lgers scuriss :
m Launch.bat.

Le fichier de commandes qui permet de lancer PSShell.exe.

m PSShell.exe.

Lapplication C# qui sert excuter le script PSShell.ps1.

m PSShell.ps1.

Le script PowerShell qui cre le Kiosque PSShell.

Dossier Images. Le dossier qui contient les images utilises par le bureau de Kiosque
PSShell.

Comme nous lavons indiqu prcdemment, Kiosque PSShell est configur pour le chemin
C:\PSShell. Par consquent, aprs avoir dploy ces fichiers 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 modification du mot de
passe de ladministrateur local, que ce soit de manire routinire (administration planifie)
ou force (suite une attaque du rseau). Cette modification 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 modifier 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 fini par ne plus modifier 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 modifier 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 modifier 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 dfinir 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 modifi. 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 fichier 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 affiche le nom du
domaine sur la console PowerShell. Si la connexion choue, le script se termine.
5. Ensuite, le script vrifie 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

Figure 10.3
Modifier le mot de passe de ladministrateur local.

Figure 10.4
Terminaison du script ChangeLocalAdminPassword.ps1.

279

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 vrifie.
Pour les mots de passe indiqus par lutilisateur, le script emploie lapplet de commande
Read-Host avec le paramtre AsSecureString afin 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 afin 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 fix "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 fix "Hors ligne".
10. La liste des serveurs et de leur tat est enregistre dans le journal des erreurs du script
afin 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. Enfin, 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 identifiant de scurit (SID,
Security ID) qui se termine par "-500". Le script se lie ce compte laide du fournisseur
ADSI WinNT et modifie son mot de passe en utilisant la chane qui se trouve prsent
dans la variable $Password.

Chapitre 10

Utiliser PowerShell en situation relle

Voici le fichier 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
}

281

282

Partie 3

Utiliser PowerShell pour les besoins dautomation

Comme nous lavons mentionn prcdemment, ChangeLocalAdminPassword.ps1 utilise


la fonction New-RandomPassword du fichier 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 afin dobtenir des caractres alatoires. Elle prend tout dabord la longueur
indique et cre un tableau de System.Byte ($Bytes) de la mme taille. Elle dfinit 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) afin de dterminer le caractre du tableau $Chars qui doit tre ajout dans la
variable $Password. Le rsultat final 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

Le script dfinit 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)
}

283

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 confirmation 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 confirmation 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 dfinissons les variables qui seront employes par la
suite dans le script. Par ailleurs, deux fichiers 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 dfinition des variables du script et le chargement des bibliothques


consiste vrifier si lutilisateur a besoin dune aide et si le paramtre OUDN obligatoire a t
dfini :
#-------------------# 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 dfinies 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 dfinir avant de pouvoir y placer des donnes. Pour la structure de
$ServersTable, le script invoque la mthode Add() afin 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 vrifier 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 affiche le
nom de domaine sur la console. Ensuite, il appelle la fonction Get-ADObject pour vrifier
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 dfinition 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 modifier. 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 modifie 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
queffleurer 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

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 enfichable PowerShell, ce quest en ralit EMS. Enfin,
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 suffisante 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 spcifications 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 configuration et ladministration se font
avec deux nouveaux outils : EMS et EMC (Exchange Management Console). Pour accder
aux informations et aux paramtres de configuration dun environnement Exchange Server
2007 et pour les modifier, 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
configuration 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 configuration des
connecteurs et des agents de transport SMTP (Simple Mail Transport Protocol), ainsi que
la dfinition 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 modification de la configuration 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 modifications que les administrateurs peuvent effectuer, certains paramtres de
configuration 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 enfichable pour PowerShell. Par consquent, peu importe loutil employ
par les administrateurs pour crer un rapport ou modifier un paramtre, ils utilisent en ralit
PowerShell.

Un simple composant logiciel enfichable


Un composant logiciel enfichable (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 enfichables, tout comme ils permettent dtendre les
possibilits de la MMC.
Un composant logiciel enfichable 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 vrifier 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
enfichables 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 vrifi lenregistrement du composant logiciel enfichable, 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 confirmer 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 enfichable 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 enfichable 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 profil PowerShell permet de rendre persistants les alias, les fonctions et les variables. Nous pouvons galement employer un profil pour charger un composant logiciel
enfichable dans nos sessions PowerShell. Une autre mthode consiste utiliser un fichier
console PowerShell ; ce fichier de configuration a lextension .psc1. Il est constitu dinformations XML qui donnent la liste des composants logiciels enfichables chargs au dmarrage de la session PowerShell. Pour crer un fichier 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 fichier 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
enfichables conformment une configuration prcdente de sa console. Pour cela, il suffit
de lancer PowerShell en dfinissant 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 configuration 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 enfichable pour PowerShell, il suffit 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 enfichable, 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 configuration 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

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

Figure 11.1
Excution en cours du script GetDatabaseSizeReport.ps1.

Figure 11.2
Excution du script GetDatabaseSizeReport.ps1 termine.

301

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 fix "Hors ligne".
5. La liste des serveurs et de leur tat est enregistre dans le journal des erreurs du script
afin 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 afin 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.

$ReportTable

laide de la fonction

Export-

INFO
Ce script et les autres scripts de ce chapitre ne pourront tre excuts quen utilisant une
session PowerShell dans laquelle le composant logiciel enfichable Microsoft.Exchange.
Management.PowerShell.Admin a t charg.

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


##################################################
# 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 fichier ou de srialiser un document
XML. Dans ce script, $LogFile est utilis pour envoyer le contenu du DataTable dans le
fichier CSV (qui est cr en mme temps que $LogFile). Pour cela, la fonction ExportDataTable crit dans le fichier CSV les noms des colonnes du DataTable, spars par une
virgule (,). Ensuite, elle parcourt chaque ligne du DataTable et crit ses valeurs dans le
fichier CSV, en les sparant par une virgule (,).
Si Export-DataTable est invoque sans prciser le nom du fichier 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 fichier (voir Figure 11.3).
Cet exemple illustre lune des nombreuses possibilits offertes PowerShell par Windows
Forms pour collecter ou afficher 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 dfinissons 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 vrifie 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 laffichage 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 afin 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 final. 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 finir, le script affiche le rapport sur la console PowerShell laide de lapplet de
commande Format-Table et exporte les donnes dans le fichier 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 lidentifiant 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

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

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 fichiers en ligne,
la taille de ces botes a augment trs rapidement. Comprenant que des botes dune telle
taille sont coteuses et difficiles 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 identifiants 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 didentifiant 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 dfinition dun paramtre. Largument du paramtre Days doit fixer la priode (en nombre
de jours) concerne par la recherche des vnements didentifiant 1221 dans les serveurs des
botes aux lettres. Largument du paramtre facultatif ExportFile prcise le nom du fichier
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 fix "Hors ligne".
5. La liste des serveurs et de leur tat est enregistre dans le journal des erreurs du script
afin 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() afin 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 dfinie. 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

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

315

316

Partie 3

Utiliser PowerShell pour les besoins dautomation

Dans lextrait de code suivant, nous dfinissons 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 vrifie si lutilisateur a besoin dune aide. Si ce nest pas le cas, il sassure
que le paramtre Days est dfini. Sil ne lest pas, il informe loprateur du script que ce paramtre est obligatoire et affiche 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 afin 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 final. 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 afin 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 finir, le script exporte les donnes de $EventsTable dans le fichier 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 dfinies dans un fichier CSV, dont voici la structure :
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 modifi, le format du fichier CSV et les


informations qui dfinissent 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 dfinition de trois paramtres. Largument du paramtre UPNSufx indique le
suffixe 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 fichier
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 affiche le nom du
domaine sur la console PowerShell. Si la connexion choue, le script se termine.
3. Ensuite, le script vrifie 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 vrifier que le fichier 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
afin 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 fichier 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 fichier 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 dfinissons 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 vrifie si lutilisateur a besoin dune aide. Si ce nest pas le cas, il contrle si
les paramtres UPNSufx, OUDN et ImportFile sont dfinis. Sils ne le sont pas, il informe loprateur du script que ces paramtres sont obligatoires et affiche 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 vrifier 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 affiche 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 vrifions 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 vrifie ensuite la validit du fichier 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

Enfin, le script cre les nouveaux comptes dutilisateurs en utilisant lapplet de commande
New-Mailbox, les informations provenant du fichier 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 enfichables. 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 fil de ce chapitre sont une bonne dmonstration de ce que nous pouvons
accomplir laide du composant logiciel enfichable 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 fin 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 identifi 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), prfixe 49
& (esperluette), oprateur dappel 33, 62, 260
-detailed, paramtre (applet de
commande Get-Help) 44
-full, paramtre (applet de
commande Get-Help) 44
./, prfixe
excuter des scripts 107
ouvrir des fichiers 34
.\\, prfixe
excuter des scripts 107
ouvrir des fichiers 34
.NET Framework
classes/mthodes statiques 73
rfrences entre crochets 72
rflexion 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 fichiers 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
Affichage des information bloques 84

332

Aide
Get-Help, applet de commande 41
pour les applets de commande 39
Alias 53
applets de commande 56
crer 11
Definition, 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
afficher la liste 45
alias 53
conventions de nommage 38
Copy-Item 174
dfinition 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

Index

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
Definition, proprit 46
htes 100
Arguments 26
Assemblages, charger 272
Auto-signs, crer des certificats 113
Autorisations
explicites 177
implicites 177
Autorisations, gestion
VBScript vers PowerShell
ProvisionWebFolders.ps1, script 177
ProvisionWebFolders.wsf, script 168
WSH contre PowerShell 157

Index

Autorits de certification racines de


confiance, magasin de certificats 120
Autorit de certification 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 certification) 102
certificats signs, obtenir depuis 114
dfinition 111
Certificats non autoriss, magasin
de certificats 122
Certificats numriques
auto-signs, crer 113
dfinition 111
importer 117
obtenir 111
signs par une CA, obtenir 114
Chanes de commandes 10
ChangeLocalAdminPassword.ps1,
script 291

333

Chargement
assemblages 272
composants logiciels enfichables 298
de source
fichiers 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 confiance 123
public, tablir une confiance 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

Index

334

Composants logiciels enfichables


charger 298
confirmer la disponibilit 297
dfinition 295
EMS, charger 299
enregistrer 296
persistants 298
vrifier 296
Comptes dutilisateurs (Exchange 2007),
crer 328
Condensat de message 111
Confiance, tablir 123
Configuration
console PowerShell 193
minimum pour PowerShell 22
Confirm, paramtre 137
Confirmation, 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

D
DCL (Digital Command Language) 17
Definition, proprit
pour les alias 47
pour les applications 46
pour les fonctions 47
pour les scripts 47

Dfinition 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 ($), prfixe 49
DOSShell 18
Dossiers, accder aux informations 147
Drive, objet 147
Droits, principe des privilges moindres 138

E
diteurs approuvs, magasin de
certificats 123
dition au clavier 28
EMC (Exchange Management
Console) 295
Empreinte 111
EMS (Exchange Management Shell) 294
Enregistrement de composants logiciels
enfichables 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

Index

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

335

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
enfichables persistants 298
Figer les informations de
configuration 130
File, objet 148
FileSystem, fournisseur 146
FileSystemObject, objet 146
Folder, objet 147
Fonctions
Add-ACE 156
Clear-Inherit 153, 177
Clear-SD 155
dfinition 31
Definition, 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

Index

336

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

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

Get-WmiObject, applet de commande 210


GetDatabaseSizeReport.ps1, script 309
GetEvent1221Info.ps1, script 320
globale, porte 59
GPO (Group Policy Object)
fixer les stratgies dexcution 105
remplacement du shell 267
Group Policy Administrative Template
(ADM) 105
Group Policy Object (GPO)
fixer les stratgies dexcution 105
remplacement du shell 267

H
Hachage sens unique 111
Histoire
des shells 20
de PowerShell 18

Index

I
Import-Alias, applet de commande 56
Import-Csv, applet de commande 174
Importation de certificats numriques 117
Inclusion
dinstructions dans les scripts 131
de fichiers de scripts en VBScript 185
Indicateurs explicites de porte 59
Informations
bloques, afficher 84
dtat, fournir 134
de configuration
emplacement 129
figer 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 confirmation 284
IsGroupMember.ps1, script 260
IsGroupMember.wsf, script 249

J
Join-Path, applet de commande 174, 175

K
Korn, shell 17

L
Lancement de PowerShell 26
Lecteurs
accder 88, 146
dfinition 88
monter 91

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 certificats
Autorits de certification racines de
confiance 120
Certificats non autoriss 122
dfinition 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
dfinition 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

337

Index

338

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

P
Paramtres
communs
gestion des erreurs 95
liste 40
Confirm 137
dfinition 26
dterminer 39
ErrorAction 95

ErrorVariable 95
obligatoires, vrifier 132
valider 132
WhatIf, 135
Persistants
alias 56
composants logiciels enfichables 298
Ping, fonction 222
ping ICMP 222
Pipeline
dans un environnement orient objet 70
dans un environnement orient texte 68
dfinition 8
Voir aussi Commandes enchanes
PKI (Public Key Infrastructure) 111
Point (.), oprateur dappel 175
Porte
dfinition 59
de script 60
globale 59
intercepter les erreurs 98
locale 59
prive 61
PowerShell
ADSI dans 234
appeler depuis dautres shells 35, 37
configuration minimum 22
console, masquer 269
configurer 193
gestion
des autorisations 157
du Registre 184
du systme de fichiers 148
histoire 18
installer 24
lancer 26
rfrences du langage 107
scripts
tablir une confiance 123
signer 119
tlcharger 23

Index

VBScript vers
appartenance un groupe 260
gestion du Registre 205
gestion du systme de fichiers 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
Profils
dfinition 99
pour les composants logiciels enfichables
persistants 298
Tous les utilisateurs 99
Tous les utilisateurs pour un hte spcifique 99
Utilisateur courant 100
Utilisateur courant pour un hte spcifique 100
Projets, scripts en tant que 126
Proprits
dfinition 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 Certificate Files Importer 117

339

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
Rflexion 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
afficher la liste 11
utilisation du disque, dterminer 16
Restricted, stratgie dexcution 101
Rutilisabilit 133

Index

340

S
Scripts
ChangeLocalAdminPassword.ps1 291
charger le source 61
commandes 32
concevoir 137
crer 62
Definition, 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
fichiers
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 Definition


Language) 155
Scurit
bonnes pratiques 138
connexions distantes PowerShell 107
scripts, excuter 107
signature de code Voir signature
stratgies dexcution
AllSigned 101
fixer 104
RemoteSigned 102
Restricted 101
WSH 101
Security Descriptor Definition 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
dfinition 8
exemple dutilisation 11
graphiques 8
compars aux CLI 8
Windows en tant que 17

Index

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
dfinition 110
vrifier 120
Voir aussi Signature de code
Signature de code 102
bonnes pratiques 137
certificats numriques
auto-signs, crer 113
importer 117
obtenir 111
signs par une CA, obtenir 114
dfinition 110
tablir une confiance 123
importance 109
scripts PowerShell 119
vrifier 120
Somme de contrle 111
Standardisation 140
Standards professionnels pour les scripts 128
Statiques
classes 73
mthodes 73

341

StdRegProv, classe (WMI) 186


Stockage
commandes dans des scripts 62
expressions dans des variables 48
Stratgies dexcution
AllSigned 101, 138
fixer 104
RemoteSigned 102, 138
Restricted 101
Unrestricted 104, 109, 138
SubInACL, outil 148, 163
Systme de fichiers, 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, profil 99
Tous les utilisateurs pour un hte
spcifique, profil 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

Index

342

Unrestricted, stratgie dexcution 104, 109,

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 fichiers 148
problmes de scurit 101
WMI dans 208

138

Update-TypeData, applet de commande 84


Utilisateur courant, profil 100
Utilisateur courant pour un hte spcifique,
profil 100
Utilisation du disque par les rpertoires,
dterminer 16

V
Variables
conventions de nommage 49
dfinir 49
informations de configuration 131
internes 50
stocker des expressions dans 48
VBScript vers PowerShell
appartenance un groupe 260
gestion du Registre 205
gestion du systme de fichiers 177
supervision dune machine virtuelle 229
Vrification
composants logiciels enfichables 296
paramtres obligatoires 132
signatures numriques 120

Book_Powershell.indb 342

X
xcopy, outil 163

14/12/07 11:37:58

Rfrence

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

TABLE DES MATIRES

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

Niveau : Intermdiaire
Programmation Configuration : Windows XP et ultrieur

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