Académique Documents
Professionnel Documents
Culture Documents
Windows Power Shell
Windows Power Shell
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.
75010 PARIS
Tl. : 01 72 74 90 00
Ralisation pao : La B.
ISBN : 978-2-7440-4015-3
Copyright 2009 Pearson Education France
Tous droits rservs
Aucune reprsentation ou reproduction, mme partielle, autre que celles prvues larticle
L. 122-5 2 et 3 a) du code de la proprit intellectuelle ne peut tre faite sans lautorisation
expresse de Pearson Education France ou, le cas chant, sans le respect des modalits prvues
larticle L. 122-10 dudit code.
1
1
2
2
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
Windows 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
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Grer le systme de fichiers depuis WSH et PowerShell . . . . . . . . . . . . . . . . . . . .
Manipuler les autorisations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
De VBScript PowerShell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
En rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
145
145
146
148
158
178
Windows PowerShell
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
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 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
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
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
drwxrwxr-x
5 root
admin
drwxrwxr-x
30 root
admin
drwxrwxr-x
102 root
admin
drwxrwxr-x
3 root
admin
lrwxr-xr-x
1 root
admin
drwxrwxr-x
3 root
admin
drwxrwxr-x
13 root
admin
drwxrwxr-x
3 root
admin
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
drwxrwxr-x
5 root
admin
drwxrwxr-x
30 root
admin
drwxrwxr-x
102 root
admin
drwxrwxr-x
3 root
admin
drwxrwxr-x
3 root
admin
drwxrwxr-x
13 root
admin
drwxrwxr-x
3 root
admin
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
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.
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
Chapitre 1
13
$ big_directory.sh
17988
apache2
5900
bin
72
etc
2652
include
82264
lib
libexec
sbin
35648
share
166768
var
PRINT_DIR_MIN=35000
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
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
done
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
17
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
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 ;
Chapitre 2
23
Si .NET Framework 2.0 nest pas install sur votre machine, vous pouvez tlcharger son
module dinstallation depuis le centre de tlchargement de Microsoft ladresse http://www
.microsoft.com/downloads/Search.aspx?displaylang=fr (voir Figure 2.2).
Figure 2.2
Le Centre de tlchargement de Microsoft.
Aprs avoir install .NET Framework 2.0, vous devez tlcharger le module dinstallation de
PowerShell partir de www.microsoft.com/windowsserver2003/technologies/management/powershell/download.mspx (voir Figure 2.3).
Sur cette page, choisissez le module correspondant votre version de Windows, en mode
x86 ou x64. Cliquez sur le lien intitul "Localized Package" pour slectionner la version
franaise de PowerShell. Ensuite, lancez linstallation de PowerShell en cliquant sur Ouvrir
dans la bote de tlchargement ou en double-cliquant sur le 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
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.
26
Partie 1
Introduction PowerShell
Figure 2.5
Ouverture de la console PowerShell depuis linvite de commande.
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
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
Opration ddition
Insr.
Suppr.
Espace arrire
F7
Tab
Chapitre 2
29
La compltion automatique peut galement tenir compte des caractres gnriques, comme
le montre lexemple suivant :
PS C:\> cd C:\Doc*
<tab>
PS C:\> cd C:\Documents and Settings
PS C:\Documents and Settings>
La compltion automatique de PowerShell concerne galement les commandes. Par exemple, nous pouvons saisir un nom de commande partiel et appuyer sur la touche Tab 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(
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
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
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
33
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.
cd,
nous
Dans PowerShell, il est important de prter attention aux autorisations de scurit des scripts.
Par dfaut, leur excution est interdite. Il sagit l dune mthode de protection contre les
scripts malveillants. Cette stratgie peut tre 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.
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:\>
"TTL"
temps<1ms
temps<1ms
temps<1ms
temps<1ms
TTL=126
TTL=126
TTL=126
TTL=126
Chapitre 2
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
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
Chapitre 2
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
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
Debug
Boolean
ErrorAction
Enum
ErrorVariable
String
OutVariable
String
OutBuffer
Int32
WhatIf
Boolean
Conrm
Boolean
Chapitre 2
41
INFO
Les deux derniers paramtres du Tableau 2.2, WhatIf et Conrm, sont particuliers, car ils exigent que lapplet de commande prenne en charge la mthode .NET ShouldProcess, ce qui
nest peut-tre pas le cas de toutes les applets de commande. La mthode ShouldProcess
demande une confirmation de lopration lutilisateur, en lui indiquant le nom de la ressource concerne par la modification.
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
Provider
Provider
Provider
Provider
Provider
Provider
Provider
Donne accs
Donne accs
Fournisseur
Donne accs
Donne accs
Donne accs
Donne accs
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
...
HelpFile
HelpFile
HelpFile
HelpFile
HelpFile
HelpFile
HelpFile
HelpFile
HelpFile
HelpFile
HelpFile
HelpFile
HelpFile
HelpFile
HelpFile
43
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.
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
Rsum
Description dtaille
Syntaxe
Paramtres
Type dentre
Type de retour
Erreurs fatales
Si cette rubrique est prsente, elle identifie les erreurs qui conduisent
larrt prmatur de lapplet de commande
Chapitre 2
45
Description
Remarques
Exemples
Liens connexes
Get-Command
Get-Command est galement trs utile, car elle affiche la liste de toutes les applets de commande
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
47
Name
---prompt
Denition
---------Write-Host ("PS " + $(Get-Lo...
PS C:\>
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:\>
Chapitre 2
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.
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
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:\>
m $Error
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.
Valeur accepte
Description
$DebugPreference
Stratgie de
commande
$ErrorActionPreference
Stratgie de
commande
$MaximumAliasCount
Entier
$MaximumDriveCount
Entier
$MaximumErrorCount
Entier
$MaximumFunctionCount
Entier
$MaximumVariableCount
Entier
$MaximumHistoryCount
Entier
$ShouldProcessPreference
Stratgie de
commande
$ProcessReturnPreference
Boolen
$ProgressPreference
Stratgie de
commande
$VerbosePreference
Stratgie de
commande
Chapitre 2
53
Elle est plutt longue saisir. Heureusement, comme la plupart des shells, PowerShell prend
en charge les alias dapplets de commande et dexcutables. Ainsi, pour viter de saisir une
commande aussi longue, nous pouvons utiliser les alias par dfaut de PowerShell. Dans ce
cas, lexemple Get-Process devient :
PS C:\> gps | ? {$_.Company -match .*Microsoft*} | ft Name, ID, Path Autosize
Lconomie nest pas norme, mais les alias peuvent faire gagner du temps et viter les fautes
de frappe. Pour obtenir la liste des alias 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:\>
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
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.
Chapitre 2
57
Bien que lconomie de saisie soit attirante, nous vous dconseillons dabuser des alias. En
effet, ils ne sont pas trs portables. Par exemple, si nous employons de nombreux alias dans
un script, nous devons inclure une suite de commandes Set-Alias au dbut du script pour
tre certain de lexistence de ces alias, quel que soit le 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
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:\>
Signification
Apostrophe
`"
Guillemets
`0
Caractre nul
`a
`b
Espace arrire
`f
`n
Saut de ligne
`r
Retour chariot
`t
`v
Chapitre 2
59
Porte globale
Comme limplique son nom, une porte globale sapplique lintgralit dune instance
PowerShell. Les donnes de la porte globale sont hrites par toutes les portes enfants. Par
consquent, nimporte quel script, commande ou fonction a accs aux variables 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
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
61
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
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"}
AfcherServicesArretes.ps1
Chapitre 2
63
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
PS C:\>
Bien que ce script dune ligne soit simple, il illustre parfaitement lcriture et lutilisation
dun script dans PowerShell. Si ncessaire, nous pouvons inclure dautres commandes pour
quil effectue une tche dautomation. En voici un exemple :
param ([string] $DemarrerAvec)
$ServicesArretes = get-service | where-object {$_.Status -eq "Stopped"}
write-host Les services $DemarrerAvec suivants sont arrts sur" `
"$Env:COMPUTERNAME : -Foregroundcolor Yellow
$ServicesArretes | where-object {$_.Name -like $DemarrerAvec} | `
format-table Name, DisplayName
Chapitre 2
65
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
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
bash,
71
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
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
[System.DirectoryServices.ActiveDirectory
.Forest]
n
une classe de l'espace de noms System, par exemple [string], [int], [boolean], etc. ;
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
73
ReadAttributes
WriteAttributes
Write
Delete
ReadPermissions
Read
ReadAndExecute
Modify
ChangePermissions
TakeOwnership
Synchronize
FullControl
PS C:\>
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
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
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
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
PS C:\>
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
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
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:\>
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
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.
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
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
PS C:\>
Mme si le membre scriptProperty nest pas particulirement utile, il montre bien comment
tendre un objet. Cette capacit dextension des objets est extrmement utile, que ce soit
pour lcriture dun script ou le dveloppement dune applet de commande.
86
Partie 1
Introduction PowerShell
Chapitre 3
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:\>
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:\>
Chapitre 3
Get-ChildItem
89
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>
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
:
:
:
:
:
:
:
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
-------------
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
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:\>
Provider
-------Alias
FileSystem
Certicate
FileSystem
FileSystem
Environment
FileSystem
Root
---C:\
\
D:\
E:\
F:\
CurrentLocation
---------------
Chapitre 3
Function
G
HKCU
HKLM
U
Variable
Function
FileSystem
Registry
Registry
FileSystem
Variable
G:\
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
U:\
93
software
...crosoft\windows
PS C:\>
:
:
:
:
:
:
Get-ChildItem
1
-2147483648
dir z:
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
ErrorDetails
Exception
FullyQualiedErrorId
InvocationInfo
TargetObject
Chapitre 3
95
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
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
PS C:\>
PS C:\>
PS C:\>
Lecteur
PS C:\>
Lecteur
PS C:\>
La premire partie, ExceptionType, prcise le type derreur accept par linterception. Sil
nest pas prcis, toutes les erreurs sont interceptes. La partie code, facultative, peut tre une
commande ou un ensemble de commandes qui sont excutes une fois lerreur envoye au
gestionnaire. La dernire partie, mot-cl, prcise si linterception autorise la poursuite de
lexcution du bloc de code o lerreur sest produite ou bien si elle doit tre stoppe.
Voici les mots cls reconnus :
n Break.
n Continue.
n Return
[argument].
Chapitre 3
[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"
Portes dinterception
Chapitre 3
99
Voici le script :
param([string]$MonParam = $(throw write-host "Le paramtre MonParam na pas
t dni" -Foregroundcolor Red))
write-host $MonParam
Et sa sortie :
PS C:\> .\MonParam.ps1
Le paramtre MonParam na pas t dni
ScriptHalted
Au niveau de C:\MonParam.ps1 : 1 Caractre : 34
+ param([string]$MonParam = $(throw <<<< write-host "Le paramtre MonParam
na pas t dni" -Foregroundcolor Red))
PS C:\>
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.
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.
Chapitre 3
101
Comprendre la scurit
Lorsque WSH est arriv avec Windows 98, il a t accueilli comme une aubaine par les
administrateurs Windows qui souhaitaient disposer des mmes possibilits dautomation que
leurs homologues UNIX. Dans le mme temps, les crateurs de virus ont rapidement dcouvert que WSH constituait galement un vecteur dattaque des systmes Windows.
Il est possible dautomatiser et de contrler pratiquement lintgralit dun systme Windows
laide de WSH, ce qui constitue un grand avantage pour les administrateurs. En revanche, WSH
napporte aucune scurit dans lexcution des scripts. Lorsquon lui dsigne un script,
WSH lexcute. Lorigine du script et son rle nont aucune importance. Cest pourquoi WSH
sest rapidement fait connatre comme un trou de scurit et non comme un outil dautomation.
Stratgies dexcution
cause des critiques concernant la scurit de WSH, lquipe de dveloppement de PowerShell a dcid dinclure une stratgie dexcution qui rduit les menaces potentielles dun
code malveillant. Une stratgie dexcution contraint lexcution des scripts et le chargement
des 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
Stratgie RemoteSigned
Chapitre 3
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 ) :
Set-
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
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.
Chapitre 3
107
Contrler la stratgie dexcution par le biais dun paramtre de prfrence de GPO ne semble
sans doute pas une solution parfaite. En effet, un paramtre de prfrence noffre pas le mme
niveau de scurit quun paramtre de stratgie dexcution et les utilisateurs disposant des
droits adquats peuvent le 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.
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
Chapitre 4
Signer du code
111
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.
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.
114
Partie 1
Introduction PowerShell
Directory: Microsoft.PowerShell.Security\Certicate::CurrentUser\My
Thumbprint
---------944E910757A862B53DE3113249E12BCA9C7DD0DE
Subject
------CN=Mon autorite de signature du code
PS C:\>
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.
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
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"
118
Partie 1
Introduction PowerShell
Set-AuthenticodeSignature,
PS C:\Scripts> set-authenticodesignature lePath ScriptSigne.ps1 certicate @(get-childitem cert:\CurrentUser\My -codeSigningCert)[0] includeChain "All"
Rpertoire : C:\Scripts
SignerCerticate
----------------661BC0A2A11850CEF4862F97D7335B40FCCCCF06
Status
-----Valid
Path
---ScriptSigne.ps1
PS C:\>
Pour obtenir le 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.
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.
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.
[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.
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
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
Chapitre 5
127
Par ailleurs, le pseudo-code permet de saffranchir du langage et peut tre crit de manire
que dautres personnes, en particulier celles qui doivent commenter la conception de scripts,
puissent le lire et le comprendre facilement. En voici un exemple :
Param domaine
Param chier CSV de comptes de ressources
Se lier au domaine
Ouvrir et lire le chier CSV
Pour chaque compte de ressource dans le chier CSV:
- crer un nouveau compte dans lUO indique ;
- xer le mot de passe (14 caractres gnrs alatoirement) ;
- journaliser le mot de passe dans larchive des mots de passe ;
- xer les attributs du compte dutilisateurs en fonction des
informations donnes par le chier CSV ;
- activer le courrier lectronique sur le compte ;
- ajouter lutilisateur au groupe adquat en fonction des informations
donnes par le chier CSV.
Suivant
Analyse
Figure 5.1
Les tapes dun
projet de script.
Conception
Architecture
Retour au
dveloppement
Test
Dploiement
Maintenance
128
Partie 1
Introduction PowerShell
Chapitre 5
129
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.
Chapitre 5
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 ! "))
132
Partie 1
Introduction PowerShell
Description :
Ce script permet ajouter des adresses de proxy secondaires aux utilisateurs,
conformment au chier CSV import. Avant dajouter ces adresses, il vrie
les conditions suivantes :
Lutilisateur existe-t-il ?
Dispose-t-il de courrier lectronique ?
Ladresse du proxy existe-t-elle dj ?
Ce script cre un journal chacune de ses excutions.
Format du chier CSV :
[NomCompteSAM],[AdressesProxy]
tyson,tyson@cco.com;tyson@taosage.net
maiko,maiko@cco.com
bob,bob@cco.com
erica,erica@cco.com
Pour placer plusieurs adresses de proxy dans la colonne AdressesProxy,
utilisez le caractre ; comme sparateur.
Chapitre 5
133
Pour viter ce problme, tous les paramtres requis doivent tre valids, comme le montre
lexemple suivant :
param([string] $CheminModele = $(throw write-host `
Veuillez prciser le chemin du modle source de la structure de dossiers" `
" copier. -Foregroundcolor Red), [string] $FichierImport = $(throw `
write-host Veuillez prciser le nom du chier CSV importer." `
-Foregroundcolor Red))
write-host "Vrication du chemin du modle" -NoNewLine
if (!(test-path $CheminModele)){
throw write-host `t $CheminModele nest pas un dossier valide !" `
-Foregroundcolor Red
}
else {
write-host `t "[OK]" -Foregroundcolor Green
}
write-host Vrication du chier dimportation" -NoNewLine
if (!(test-path $FichierImport)){
throw write-host `t $FichierImport nest pas un chier valide !" `
-Foregroundcolor Red
}
else {
write-host `t "[OK]" -Foregroundcolor Green
}
134
Partie 1
Introduction PowerShell
La rutilisabilit est une bonne pratique importante. Dans PowerShell, le concept de rutilisabilit prend tout son sens car les 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
Chapitre 5
135
Figure 5.2
Exemple daffichage dinformations dtat.
136
Partie 1
Introduction PowerShell
Dans cet exemple, lobjet de processus retourn par Get-Process correspond explorer.
exe. Normalement, si un objet de processus est envoy lapplet de commande Stop-Process,
le processus correspondant est arrt. Cependant, lorsque le paramtre WhatIf est pass
lapplet Stop-Process, la commande retourne des informations sur les changements qui se
seraient produits si elle avait t rellement excute. Par exemple, supposons que nous
saisissions la commande suivante :
ATTENTION
Nexcutez pas la commande suivante. Il sagit dun exemple quil ne faut pas suivre.
Sans le paramtre WhatIf, cette commande arrterait la console PowerShell, ainsi que le
systme. Parce que WhatIf a t ajout, les informations 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:
la
la
la
la
la
la
la
la
la
la
la
la
cible
cible
cible
cible
cible
cible
cible
cible
cible
cible
cible
cible
alg (1048) .
ati2evxx (1400) .
ati2evxx (1696) .
atiptaxx (3644) .
BTSTAC~1 (2812) .
BTTray (3556) .
btwdins (1652) .
csrss (1116) .
ctfmon (1992) .
eabservr (3740) .
explorer (2172) .
googletalk (1888) .
Chapitre 5
137
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.
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.
Chapitre 5
139
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.
Chapitre 5
141
ATTENTION
Les scripts fournis avec ce livre sont oprationnels. Ils ont t tests et doivent se comporter
comme nous lexpliquons. Cependant, cela ne 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
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
Chapitre 6
147
Dans PowerShell, nous pouvons obtenir des informations sur un lecteur laide des applets
de commande Get-PSDrive et Get-Item. Cependant, comme nous lavons expliqu au
Chapitre 3, PowerShell traite les lecteurs diffremment de WSH. Par consquent, si nous
voulons les mmes informations que celles fournies par lobjet FSO Drive, nous devons
utiliser la classe .NET approprie, comme le montre lexemple suivant, ou WMI :
PS
PS
PS
PS
La
PS
Dans PowerShell, les applets de commande principales ralisent les mmes tches :
PS C:\> get-item C:\outils | select LastAccessTime
LastAccessTime
-------------06/10/2007 14:03:20
PS C:\>
148
Partie 2
Dans PowerShell, les applets de commande principales permettent daccder aux informations dun 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>
Chapitre 6
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 ;
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
150
Partie 2
Chapitre 6
151
152
Partie 2
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
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
154
Partie 2
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
Chapitre 6
Ensuite, la fonction
systme de fichiers :
Clear-SD
155
#------------------------------------------------# 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
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
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
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"
Chapitre 6
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
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
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
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
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
Chapitre 6
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
Chapitre 6
167
templeinfo = vbNullString
Do While objFile.AtEndOfStream <> True
templeinfo = templeinfo & objFile.Readline
Loop
ParseTempFile = templeinfo
objFile.Close()
Set objFile = Nothing
End Function
Function SetOwner(path, account)
Fixer le propritaire dun dossier ou de sous-dossiers.
On Error Resume Next
strCommand = subinacl /verbose /output=log.temp _
& "/subdirectories """ & path & """ /setowner=""" & account & """"
ErrorCode = objWS.Run(strCommand, 0, TRUE)
If ErrorCode <> 0 Then
StdOut.Write(" " & account & ":" _
& [chec de SetOwner] sur " & path)
Else
return = inStr(1, ParseTempFile("log.temp"), "ne sera pas examin")
If Not return = 0 Then
StdOut.Write(" " & account & ":" _
& [chec de SetOwner] sur " & path)
Else
StdOut.Write(" " & account & ":" _
& [Succs de SetOwner] sur " & path)
End If
End If
ErrorCode = vbNullString
End Function
Function DumpPerm(path)
Effacer les autorisations dun dossier ou de sous-dossiers.
On Error Resume Next
strCommand = subinacl /verbose /output=log.temp _
& "/subdirectories """ & path & """ /perm"
168
Partie 2
Chapitre 6
169
Le script ProvisionWebFolders.ps1
ProvisionWebFolders.ps1 est une conversion en PowerShell du script ProvisionWebFolders.
wsf.
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
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
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
#------------------------------------------------# Set-Owner
#------------------------------------------------# Usage :
Fixer le propritaire dun dossier ou dun chier.
# $Object :
Le chemin du dossier ou du chier ("c:\monDossier" ou
#
"c:\monFichier.txt").
# $Identity :
Nom dutilisateur ou de groupe ("Administrateurs" ou
#
"monDomaine\utilisateur1").
function Set-Owner{
param ($Object,
[System.Security.Principal.NTAccount]$Identity)
# Obtenir llment modier.
$Item = get-item $Object
# Fixer son propritaire.
$SD = $Item.GetAccessControl()
$SD.SetOwner($Identity)
$Item.SetAccessControl($SD)
}
#------------------------------------------------# Add-ACE
#------------------------------------------------# Usage :
Accorder des droits un dossier ou un chier.
# $Object :
Le chemin du dossier ou du chier ("c:\monDossier" ou
#
"c:\monFichier.txt").
# $Identity :
Nom dutilisateur ou de groupe ("Administrateurs" ou
#
"monDomaine\utilisateur1").
# $AccessMask : Les droits utiliser pour la cration de la rgle daccs
#
("FullControl", "ReadAndExecute, Write", etc.).
# $Type :
Accorder ou refuser les droits ("Allow" ou "Deny").
function Add-ACE{
param ($Object,
[System.Security.Principal.NTAccount]$Identity,
[System.Security.AccessControl.FileSystemRights]$AccessMask,
[System.Security.AccessControl.AccessControlType]$Type)
$InheritanceFlags = `
[System.Security.AccessControl.InheritanceFlags]`
"ContainerInherit, ObjectInherit"
Chapitre 6
173
$PropagationFlags = `
[System.Security.AccessControl.PropagationFlags]"None"
# Obtenir le descripteur de scurit de lobjet.
$SD = get-acl $Object
# Ajouter les rgles daccs.
$Rule = new-object `
System.Security.AccessControl.FileSystemAccessRule($Identity, `
$AccessMask, $InheritanceFlags, $PropagationFlags, $Type)
$SD.AddAccessRule($Rule)
set-acl $Object $SD
}
174
Partie 2
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
175
Vous vous demandez peut-tre pourquoi le code de Set-Owner est plac lintrieur dun
bloc de script. Loprateur dappel point (.) qui prcde le bloc de script demande
PowerShell dexcuter ce bloc au sein de la porte courante. Sil ntait pas utilis, PowerShell
nexcuterait pas le bloc de script. En crant un bloc de script indpendant pour grer lappel
176
Partie 2
Set-Owner, nous nous assurons que la porte de linstruction trap est limite ce bloc de
code. Cette technique de contrle de la porte de trap sera souvent employe dans ce livre.
.{
trap{write-host "[ERREUR] Impossible dajouter des droits !" `
-Foregroundcolor Red;
$Script:Err = $True;
Continue}
# Ajouter le groupe Administrateurs.
write-host " AddACE pour Administrateurs " -NoNewLine
Add-ACE $Path "Administrateurs" "FullControl" "Allow"
if ($Err -eq $False){
write-host "[OK]" -Foregroundcolor Green
}
else{
# Arrter la boucle.
Continue
}
}
.{
trap{write-host "[ERREUR] Impossible deffacer les
autorisations hrites !" -Foregroundcolor Red;
$Script:Err = $True;
Continue}
# Effacer les autorisations hrites.
write-host " ClearInherit " -NoNewLine
Clear-Inherit $Path
if ($Err -eq $False){
write-host "[OK]" -Foregroundcolor Green
}
else{
# Arrter la boucle.
Continue
}
}
Chapitre 6
177
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
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
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.
180
Partie 2
WshShell
offre
cre de nouvelles cls, ajoute une nouvelle valeur nomme une cl existante
ou modifie une valeur nomme existante.
n RegWrite
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...
: 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:\>
182
Partie 2
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)
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")
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
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
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
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
n strKeyPath.
n strValueName.
n strType.
Une chane qui reprsente le type de la valeur du Registre dont nous voulons
obtenir les donnes, comme BIN (REG_BINARY), DWORD (REG_DWORD), EXP (REG_EXPAND_SZ),
MULTI (REG_MULTI_SZ) et STR (REG_SZ).
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
HKEY_LOCAL_MACHINE.
La fonction CreateRegValue :
Function CreateRegValue(strComputer, strKeyPath,_
strValueName, strvalue, strType)
On Error Resume Next
const HKEY_LOCAL_MACHINE = &H80000002
Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" &_
strComputer & \root\default:StdRegProv)
If strType = BIN Then
objReg.SetBinaryValue HKEY_LOCAL_MACHINE, strKeyPath,_
strValueName, strValue
End If
If strType = DWORD Then
objReg.SetDWORDValue HKEY_LOCAL_MACHINE, strKeyPath,_
strValueName, strValue
End If
If strType = EXP Then
objReg.SetExpandedStringValue HKEY_LOCAL_MACHINE, strKeyPath,_
strValueName, strValue
190
Partie 2
End If
If strType = MULTI Then
objReg.SetMultiStringValue HKEY_LOCAL_MACHINE, strKeyPath,_
strValueName, strValue
End If
If strType = STR Then
objReg.SetStringValue HKEY_LOCAL_MACHINE, strKeyPath,_
strValueName, strValue
End If
End Function
La fonction
HKEY_
n strComputer.
n strKeyPath.
n strValueName.
n strValue.
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
n strKeyPath.
INFO
La suppression dune cl supprime galement toutes les sous-cls et leurs valeurs.
La fonction DeleteRegValue :
Function DeleteRegValue(strComputer, strKeyPath, strValueName)
On Error Resume Next
const HKEY_LOCAL_MACHINE = &H80000002
192
Partie 2
HKEY_LOCAL_MACHINE.
Elle
m strComputer.
m strKeyPath.
m strValueName.
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
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.
n $KeyPath.
n $ValueName.
n $Type. Une chane qui reprsente le type de la valeur du Registre dont nous voulons obte-
nir les donnes, comme BIN (REG_BINARY), DWORD (REG_DWORD), EXP (REG_EXPAND_SZ), MULTI
(REG_MULTI_SZ) et STR (REG_SZ).
196
Partie 2
La fonction Set-RegKey :
#------------------------------------------------# Set-RegKey
#------------------------------------------------# Usage :
Crer ou xer une cl dans la ruche HKLM sur une machine
#
locale ou distante.
# $Computer :
Nom de lordinateur.
# $KeyPath :
Chemin de la cl du registre
#
("SYSTEM\CurrentControlSet\Control").
function Set-RegKey{
param ($Computer, $KeyPath)
$HKEY_LOCAL_MACHINE = 2147483650
trap{write-host "[ERREUR] $_" -Foregroundcolor Red; Continue}
$Reg = get-wmiobject -Namespace Root\Default -computerName `
$Computer -List | where-object `
{$_.Name -eq "StdRegProv"}
return $Reg.CreateKey($HKEY_LOCAL_MACHINE, $KeyPath)
}
HKEY_LOCAL_MACHINE.
Elle
m $KeyPath.
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
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-
n $ValueName.
n $Value.
n $Type. Une chane qui reprsente le type de la valeur du Registre dont nous voulons obte-
nir les donnes, comme BIN (REG_BINARY), DWORD (REG_DWORD), EXP (REG_EXPAND_SZ), MULTI
(REG_MULTI_SZ) et STR (REG_SZ).
Voici comment utiliser cette fonction :
PS C:\> $Multi = "PowerShell", "est", "super !
PS C:\> set-regvalue Arus SOFTWARE\Voltron Lion_Statement $Multi MULTI
La fonction Remove-RegKey :
#------------------------------------------------# Remove-RegKey
#------------------------------------------------# Usage :
Supprimer une cl dans la ruche HKLM, sur une machine
#
locale ou distante.
# $Computer :
Nom de lordinateur.
# $KeyPath :
Chemin de la cl du registre
#
("SYSTEM\CurrentControlSet\Control").
function Remove-RegKey{
param ($Computer, $KeyPath)
$HKEY_LOCAL_MACHINE = 2147483650
trap{write-host "[ERREUR] $_" -Foregroundcolor Red; Continue}
$Reg = get-wmiobject -Namespace Root\Default -computerName `
$Computer -List | where-object `
{$_.Name -eq "StdRegProv"}
return $Reg.DeleteKey($HKEY_LOCAL_MACHINE, $KeyPath)
}
Chapitre 7
PowerShell et le Registre
199
m $KeyPath.
La fonction Remove-RegValue :
#------------------------------------------------# Remove-RegValue
#------------------------------------------------# Usage :
Supprimer une valeur dans la ruche HKLM, sur une machine
#
locale ou distante.
# $Computer :
Nom de lordinateur.
# $KeyPath :
Chemin de la cl du registre
#
("SYSTEM\CurrentControlSet\Control").
# $ValueName :
Nom de la valeur ("CurrentUser").
function Remove-RegValue{
param ($Computer, $KeyPath, $ValueName)
$HKEY_LOCAL_MACHINE = 2147483650
trap{write-host "[ERREUR] $_" -Foregroundcolor Red; Continue}
$Reg = get-wmiobject -Namespace Root\Default -computerName `
$Computer -List | where-object `
{$_.Name -eq "StdRegProv"}
return $Reg.DeleteValue($HKEY_LOCAL_MACHINE, $KeyPath, $ValueName)
}
HKEY_LOCAL_
m $Computer. Le nom ou ladresse IP de lordinateur sur lequel nous voulons supprimer une
m $ValueName.
200
Partie 2
Utiliser la bibliothque
__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
{}
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
:
:
:
:
:
:
:
2
{}
0
{101, 118, 105, 108...}
__GENUS
__CLASS
__SUPERCLASS
__DYNASTY
__RELPATH
__PROPERTY_COUNT
__DERIVATION
__SERVER
__NAMESPACE
__PATH
ReturnValue
uValue
:
:
:
:
:
:
:
:
:
:
:
:
2
__PARAMETERS
__PARAMETERS
2
{}
0
1
__GENUS
__CLASS
__SUPERCLASS
__DYNASTY
__RELPATH
__PROPERTY_COUNT
__DERIVATION
__SERVER
__NAMESPACE
__PATH
ReturnValue
sValue
:
:
:
:
:
:
:
:
:
:
:
:
2
__PARAMETERS
__PARAMETERS
2
{}
0
C:\WINDOWS\system32\Turtle_Hacker.dll
Chapitre 7
PowerShell et le Registre
__GENUS
__CLASS
__SUPERCLASS
__DYNASTY
__RELPATH
__PROPERTY_COUNT
__DERIVATION
__SERVER
__NAMESPACE
__PATH
ReturnValue
sValue
:
:
:
:
:
:
:
:
:
:
:
:
2
__PARAMETERS
__PARAMETERS
2
{}
0
{PowerShell, est, super !}
__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
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:\>
__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
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.
208
Partie 2
Il existe deux mthodes pour se connecter un objet WMI. La premire consiste crer un
objet SWbemServices laide de la mthode CreateObject() correspondante, puis se
connecter lobjet WMI en prcisant son chemin. Cependant, dans notre description, nous
nous limitons la seconde mthode. Elle sappuie sur le moniker "winmgmts:" (mcanisme
COM standard pour encapsuler lemplacement et la liaison avec un autre objet COM). Ces
deux mthodes sont similaires, mais la premire est souvent choisie pour des raisons lies
la gestion des erreurs et de lauthentification, tandis que la seconde est prfre pour des
raisons pratiques car une seule instruction permet dtablir une connexion.
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
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
210
Partie 2
:
:
:
:
:
:
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
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:\>
Chapitre 8
PowerShell et WMI
213
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
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.
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:\>
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
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
Figure 8.1
Excution du script MonitorMSVS.wsf.
Chapitre 8
PowerShell et WMI
217
218
Partie 2
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
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
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,
n PhysicalMemoryAllocated
n DiskSpaceUsed
Lextrait de code suivant est constitu des procdures utilises tout au long du script :
===================================================================
Procdures.
===================================================================
------------------- Procdure gnrale pour les messages.
-------------------Sub Mess(Message)
crire sur la console.
StdOut.WriteLine(Message)
End Sub
------------------- Procdure gnrale pour le dbut dun message.
-------------------Sub StatStart(Message)
crire sur la console.
StdOut.Write(Message)
End Sub
Chapitre 8
PowerShell et WMI
221
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
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
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
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
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
`
`
`
`
`
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.
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
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.
232
Partie 2
Pour utiliser ADSI dans vos scripts, vous devez comprendre quelques concepts essentiels.
Premirement, ADSI est constitu dun ensemble de fournisseurs : LDAP (Lightweight
Directory Access Protocol), NDS (Novell Directory Services), NWCOMPAT (Novell NetWare
3.x) et WinNT (Windows NT). Ces fournisseurs permettent aux programmes externes et aux
scripts de grer diffrents annuaires rseau et rfrentiels de donnes, comme Active
Directory, Novell NetWare 4.x NDS et NetWare 3.x Bindery, ainsi que toute infrastructure
de service dannuaire compatible LDAP (LDAP V2 et ultrieure). Cependant, il est possible
de dvelopper des fournisseurs ADSI supplmentaires 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
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
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.
La seconde mthode passe par ADO (ActiveX Data Objects). ADO permet aux applications
et aux scripts daccder des donnes provenant de diffrentes sources en utilisant des fournisseurs OLE DB (Object Linking and Embedding Database). Lun deux est un fournisseur
ADODB (ADSI OLE DB), qui permet dutiliser ADO et sa prise en charge de SQL (Structured
Query Language) ou de LDAP pour effectuer des recherches rapides dans Active Directory.
Lexemple suivant montre comment rechercher un compte dutilisateur dans Active Directory
en utilisant LDAP :
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open("Active Directory Provider")
objCommand.ActiveConnection = objConnection
objCommand.Properties("Page Size") = 1000
objCommand.CommandText = _
"<LDAP://companyabc.com>;(&(objectCategory=user)" _
& "(sAMAccountName=tyson));sAMAccountName,distinguishedName;subtree"
Set objRecordSet = objCommand.Execute
234
Partie 2
Si lutilisateur existe, le jeu denregistrements ADO obtenu est constitu de son sAMAccountName et de son distinguishedName. Cependant, cet exemple ne montre que la partie visible
de liceberg. En utilisant SQL ou LDAP, nous pouvons crire des recherches plus labores
et retrouver des informations complexes 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.
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"
Chapitre 9
235
La seconde, System.DirectoryServices.DirectorySearcher, est une classe qui permet deffectuer des recherches LDAP :
PS C:\> $Chercheur = new-object DirectoryServices.DirectorySearcher
PS C:\> $Chercheur.Filter = "(&(objectCategory=person)(objectClass=user)
(samAccountName=garett))"
PS C:\> $Utilisateur = $Chercheur.FindOne().GetDirectoryEntry()
Les mthodes dutilisation dADSI dans PowerShell sont comparables celles dans WSH.
Comme WSH, PowerShell dispose dune mthode directe impliquant la classe System.
DirectoryServices.DirectoryEntry ou le type abrg [ADSI] pour se connecter des objets
Active Directory et les grer. Par ailleurs, comme WSH, PowerShell propose une deuxime
mthode qui sappuie sur la classe System.DirectoryServices.DirectorySearcher pour
effectuer des recherches dans Active Directory et obtenir des informations en lecture seule
propos des objets.
Par consquent, la gestion dActive Directory est pratiquement identique dans PowerShell et
dans WSH. Mme si PowerShell utilise pour cela .NET Framework, les classes System.
DirectoryServices.DirectoryEntry et System.DirectoryServices.DirectorySearcher ne
sont que des interfaces .NET pour ADSI. Les diffrences entre WSH et PowerShell se situent
uniquement dans les fonctions et les mthodes de gestion dActive Directory, ainsi que dans
leur syntaxe. Les deux sections suivantes examinent ces similitudes en expliquant comment
retrouver des informations sur un objet et comment crer un objet en utilisant VBScript et
PowerShell.
236
Partie 2
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
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()
createuserinfo.vbs
C:\>cscript createuserinfo.vbs
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. Tous droits rservs.
Le compte dutilisateur dlightman a t cr.
C:\>
Pour raliser la mme tche dans PowerShell, nous utilisons le type abrg [ADSI]. Les
commandes rsultantes ont une logique et une syntaxe analogues celles de lexemple
VBScript. Par exemple, pour crer lobjet dutilisateur, nous tablissons une liaison avec
lUO Accounts, puis nous crons un nouvel objet nomm David Lightman en invoquant la
mthode ADSI Create(). Ensuite, la mthode ADSI Put() nous permet de 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
C:\>
C:\>
C:\>
C:\>
C:\>
C:\>
C:\>
C:\>
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
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"
240
Partie 2
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
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
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
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
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
245
246
Partie 2
Pour chaque utilisateur, le script lance une recherche LDAP dans le domaine douverture de
session courant en utilisant lobjet ADO. Les utilisateurs qui nexistent pas sont ajouts
lobjet dictUsers avec la valeur "Inexistant". En revanche, lorsquun utilisateur existe, le
script prend son distinguishedName dans le jeu denregistrements retourn par la recherche
LDAP et, par une comparaison, dtermine si cet utilisateur existe dans lobjet dictGroup.
Pour effectuer cette comparaison, le script utilise la mthode Exists() de lobjet Dictionary.
Elle permet de 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
Chapitre 9
247
Le dernier extrait de code est constitu des procdures et fonctions utilises par le script, ainsi
que des lments XML qui le terminent. Il est inutile de revenir sur cette partie du script car ces
procdures et fonctions sont 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
End Sub
------------------- Procdure gnrale pour la n dun message.
-------------------Sub StatDone
crire sur la console.
StdOut.Write(vbTab & vbTab)
StdOut.WriteLine("[OK]")
End Sub
------------------- Procdure gnrale pour Xerror.
-------------------Sub Xerror
If Err.Number <> 0 Then
crire sur la console.
StdOut.WriteLine(" Erreur fatale : " & CStr(Err.Number) _
& " " & Err.Description)
WScript.Quit()
End If
End Sub
===================================================================
Fonctions.
===================================================================
Function ParseFile(le, arrname)
Analyser un chier et retourner son contenu dans un tableau
(la premire ligne est saute !!!)
On Error Resume Next
count = -1
Ouvrir le chier en lecture.
Set objFile = FSO.OpenTextFile(le, ForReading)
objFile.SkipLine Note : cette ligne contient les en-ttes de colonnes.
Xerror
Lire chaque ligne du chier et la placer dans un tableau.
Do While objFile.AtEndOfStream <> True
count = count + 1
If count > UBound(arrname) Then ReDim Preserve arrname(count)
arrname(count) = objFile.Readline
Chapitre 9
249
Loop
Xerror
Fermer le chier.
objFile.Close()
Set objFile = Nothing
count = 0
End Function
]]>
</script>
</job>
</package>
Le script IsGroupMember.ps1
est une version PowerShell du script IsGroupMember.wsf. Vous en trouverez une copie dans le dossier Scripts\Chapitre 9\IsGroupMember et en tlchargement
depuis le site www.pearsoneducation.fr. Pour excuter ce script, il est ncessaire de 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
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
Figure 9.2
Excution du script IsGroupMember.ps1 sans fichier dexportation.
Figure 9.3
Excution du script IsGroupMember.ps1 avec fichier dexportation.
Chapitre 9
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)
252
Partie 2
# $Name :
# $Usage :
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
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
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
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
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
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
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
258
Partie 2
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
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
}
260
Partie 2
else{
add-member -inputObject $User -membertype noteProperty `
-name IsMember -value Non
}
}
else{
# Et si utilisateur nexiste pas ?
add-member -inputObject $User -membertype noteProperty `
-name "IsMember" -value "Inexistant"
}
}
}
Au cours des chapitres prcdents, nous avons expliqu que loprateur dappel & excute un
bloc de code du script dans sa propre porte. Lorsquil se termine, sa porte est dtruite avec
tout ce quelle contient.
Dans lexemple de code prcdent, loprateur & nous permet de rutiliser les noms de variables sans nous proccuper des anciennes donnes. Par exemple, lorsque nous sortons de la
boucle For, les noms de variables $sAMAccountName et $ADUser restent des objets valides.
Pour ne pas nous servir par mgarde ces anciens objets, nous utilisons loprateur dappel &
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
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
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
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
267
comme shell de base, et un script PowerShell, qui sappuie sur Windows Forms pour prsenter un bureau scuris de type Explorateur Windows aux utilisateurs. Les sections suivantes
dtaillent les composants de PSShell.ps1 (nomm Kiosque PSShell).
268
Partie 3
Chapitre 10
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
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
271
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 ;
Le premier extrait de code contient len-tte du script PSShell.ps1. Il fournit des informations sur le rle du script, sa date de dernire mise jour et son auteur :
##################################################
# PSShell.ps1
# Ce script est un shell de remplacement pour explorer.exe.
#
# Cr le : 17/10/2006
# Auteur : Tyson Kopczynski
##################################################
272
Partie 3
Le code suivant contient deux longues instructions complexes qui font intervenir la classe
.NET System.Reection.Assembly :
$Null=[System.Reection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$Null=[System.Reection.Assembly]::LoadWithPartialName("System.Drawing")
Ces deux instructions sont indispensables car PowerShell charge uniquement quelques
assemblages (assembly) dans son AppDomain. Par exemple, si nous essayons de crer un objet
Windows Forms avec lapplet de commande New-Object, nous obtenons lerreur suivante :
PS C:\> $Form = new-object System.Windows.Forms.Form
New-Object : Le type [System.Windows.Forms.Form] est introuvable : vriez que
lassembly dans lequel il se trouve est charg.
Au niveau de ligne : 1 Caractre : 19
+ $Form = new-object <<<< System.Windows.Forms.Form
PS C:\>
Pour pouvoir utiliser la classe System.Windows.Forms.Form, nous devons tout dabord charger lassemblage dans PowerShell laide de la mthode LoadWithPartialName(). Les
assemblages des DLL de type .NET incluses avec les SDK Microsoft, celles des fournisseurs
tiers ou nos propres DLL doivent galement tre chargs dans PowerShell. Par exemple,
supposons que nous ayons dvelopp une DLL .NET pour grer lapplication xyz. Pour utiliser cette DLL dans PowerShell, nous utilisons la mthode LoadFrom() ou LoadFile() de la
classe System.Reection.Assembly :
PS C:\> [System.Reection.Assembly]::LoadFrom("C:\Outils\maPremiere.dll")
0
PS C:\>
INFO
Microsoft a dclar la mthode LoadWithPartialName() obsolte. Elle est remplace par la
mthode Load(), qui est conue pour viter des liaisons partielles lors du chargement dassemblages .NET. Lutilisation de la mthode Load() demande un travail plus important.
Cependant, si les implications dune liaison partielle (comme lchec de votre script) ne vous
proccupent pas, vous pouvez toujours utiliser LoadWithPartialName() jusqu ce quelle
soit retire de .NET Framework.
Chapitre 10
273
prsent que les assemblages ncessaires aux objets Windows Forms ont t chargs, ltape
suivante consiste terminer la 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}
Ce code montre un espace dexcution PowerShell, qui est reprsent par lespace de noms
System.Management.Automation.Runspaces. Un espace dexcution est une abstraction de
lenvironnement dexcution de PowerShell qui permet une application hte dexcuter des
commandes PowerShell. Mme si powershell.exe est une application hte qui utilise son
propre espace dexcution pour traiter les commandes, les espaces dexcution sont dautant
plus intressants lorsquils sont employs dans des applications en dehors de PowerShell.
Les espaces dexcution sont indispensables PowerShell, mais ils ont t dvelopps principalement pour donner aux autres applications un moyen simple dappeler lenvironnement
dexcution PowerShell et dexcuter des commandes. En un sens, lobjet Windows Form cr
par PSShell.ps1 est une application, et son interaction avec un espace dexcution PowerShell
274
Partie 3
pour effectuer des tches est donc sense. En exploitant les espaces dexcution de PowerShell,
nous navons pas besoin dajouter une logique lobjet Windows Form pour quil ralise des
tches pour le compte des utilisateurs.
La cration dun espace dexcution ($Runspace) pour lobjet Windows Form consiste
simplement invoquer la mthode CreateRunspace() de la classe PowerShell System.Management.Automation.Runspaces.RunspaceFactory. Ensuite, nous crons un objet RunspaceInvoke
qui permet au Windows Form dexcuter des commandes par le biais de lespace dexcution.
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
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
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.
m $MenuItem3.
Get-WmiObject
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.
m PSShell.exe.
m PSShell.ps1.
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
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
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"
Chapitre 10
Figure 10.3
Modifier le mot de passe de ladministrateur local.
Figure 10.4
Terminaison du script ChangeLocalAdminPassword.ps1.
279
280
Partie 3
Chapitre 10
$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
Chapitre 10
283
284
Partie 3
PowerShell demande parfois deffectuer un choix avant de poursuivre une commande. Par
exemple, comme nous lavons vu au Chapitre 4, "Signer du code", il peut demander une 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 ) :
Chapitre 10
285
286
Partie 3
Ensuite, le script cre un objet DataTable. Il sagit dun concept nouveau qui sappuie sur un
objet .NET DataTable (il provient de la classe System.Data.DataTable, qui fait partie de
larchitecture ADO.NET) :
#-------------------# Dnir le DataTable.
#-------------------$ServersTable = new-object System.Data.DataTable
$ServersTable.TableName = "Servers"
[Void]$ServersTable.Columns.Add("Name")
[Void]$ServersTable.Columns.Add("Status")
Les objets DataTable sont quivalents aux tables dune base de donnes, except quils se
trouvent en mmoire. Les scripts peuvent se servir de ces tables pour conserver les donnes
obtenues depuis dautres sources ou celles 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
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
}
288
Partie 3
Chapitre 10
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
}
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
291
292
Partie 3
En rsum
Au cours de ce chapitre, nous avons tudi deux scripts PowerShell qui ont t dvelopps
pour rpondre des besoins dautomation trs forts. Dans le premier, nous avons dcouvert
que PowerShell tait capable de sortir de son rle doutil dautomation et de rpondre un
besoin scuritaire critique en remplaant le shell de Windows. Dans le second, nous avons vu
quil pouvait tre un outil dautomation performant. Les deux scripts nont cependant fait
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
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
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
295
296
Partie 3
nous voulons lutiliser dans PowerShell. Avant toute chose, nous devons lenregistrer dans
linstallation de PowerShell laide de loutil .NET Framework Installer (installutil.exe) :
PS C:\Dev> set-alias IntUtil $Env:windir\Microsoft.NET\Framework\v2.0.50727\
installutil.exe
PS C:\Dev> IntUtil MonPremierSnapin.dll
Microsoft (R) .NET Framework Installation utility Version 2.0.50727.832
Copyright (c) Microsoft Corporation. Tous droits rservs.
Excution dune installation traite avec transaction.
...
Linstallation traite avec transaction est termine.
PS C:\Dev>
Pour une version 64 bits de Windows, voici le chemin de loutil .NET Framework Installer :
PS C:\Dev> set-alias IntUtil $Env:windir\Microsoft.NET\Framework64\
v2.0.50727\installutil.exe
Une fois le composant logiciel enregistr, nous pouvons 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
297
PS C:\Dev>
298
Partie 3
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
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:\>
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
300
Partie 3
Toute information concernant notre environnement rseau est utile. Cependant, lorsque nous
utilisons Exchange, connatre la taille des bases de donnes des botes aux lettres, leur croissance, lespace disponible sur le lecteur hte et le comportement gnral des bases de donnes
dans lenvironnement rseau peut permettre dviter certains problmes.
Ce script a t dvelopp pour companyabc.com, une petite socit dont le rseau est compos
de plusieurs centaines dutilisateurs et de deux serveurs Exchange. Les contraintes budgtaires nautorisent quune seule personne dans le service informatique. Elles nont galement
pas permis lachat et linstallation dun logiciel de surveillance et de compte-rendu sur les
systmes informatiques. Par consquent, le seul employ du service informatique ne disposait que de mthodes manuelles pour sassurer du fonctionnement des systmes et navait pas
souvent le temps deffectuer une surveillance proactive.
Les bases de donnes des botes aux lettres dExchange ont donc grossi jusqu empcher toute
maintenance hors ligne et les disques hbergeant ces bases de donnes manquaient despace.
Aprs avoir vit de justesse plusieurs dsastres, la direction de companyabc.com a demand au
service informatique de trouver une solution pour amliorer la surveillance des bases de donnes
Exchange. Ayant besoin dun moyen rapide, souple et bon march, lunique dveloppeur sest
tourn vers les scripts et a demand le dveloppement de GetDatabaseSizeReport.ps1.
Vous en trouverez une copie dans le dossier Scripts\Chapitre 11\GetDatabaseSizeReport
et en tlchargement depuis le site www.pearsoneducation.fr. Lexcution de ce script ne
ncessite aucun paramtre. Cependant, un paramtre facultatif, ExportFile, peut prciser le
nom du 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
Chapitre 11
Figure 11.1
Excution en cours du script GetDatabaseSizeReport.ps1.
Figure 11.2
Excution du script GetDatabaseSizeReport.ps1 termine.
301
302
Partie 3
$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
303
304
Partie 3
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
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
Le code suivant cre les deux objets DataTable. Le premier se trouve dans $ServersTable et
contient les informations sur le serveur. Le second est plac dans $ReportTable et contient
les informations du rapport :
#-------------------# Dnir les DataTable.
#-------------------$ServersTable = new-object System.Data.DataTable
$ServersTable.TableName = "Servers"
[Void]$ServersTable.Columns.Add("Name")
[Void]$ServersTable.Columns.Add("Status")
$ReportTable = new-object System.Data.DataTable
$ReportTable.TableName = "Servers"
[Void]$ReportTable.Columns.Add("Server")
[Void]$ReportTable.Columns.Add("Database")
[Void]$ReportTable.Columns.Add("Drive")
[Void]$ReportTable.Columns.Add("FreeSpace")
[Void]$ReportTable.Columns.Add("Size")
Puis, lapplet de commande Out-File cre un journal des erreurs et y crit des informations
den-tte. Ensuite, la fonction Get-ScriptHeader signale loprateur du script que la partie
automation a dmarr :
#-------------------# Dbut du script.
#-------------------# Commencer le journal des erreurs.
$ScriptName + " Excut le : " + $Date | out-le $ErrorLogName
write-host
Get-ScriptHeader $ScriptName $ScriptUsage
write-host
Chapitre 11
307
Aprs 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
Toutes ces informations sont ensuite ajoutes dans une nouvelle ligne de lobjet $ReportTable
(un DataTable) :
#------------------# Obtenir les informations pour le rapport.
#------------------write-host "Obtention des informations pour le rapport" -NoNewLine
$OnlineServers = $ServersTable.Select("Status = En ligne")
foreach ($Server in $OnlineServers) {
&{
trap{"[ERREUR] de cration du rapport : " + $Server.Name + " $_" | `
out-le $ErrorLogName -Append; Continue}
write-progress `
-Activity Obtention des informations des bases de donnes
- $($Server.Name)" `
-Status "Veuillez patienter..."
$Databases = get-mailboxdatabase -Server $Server.Name | `
select Name, StorageGroupName, EdbFilePath
foreach ($Database in $Databases){
&{
write-progress `
-Activity Obtention des informations sur le lecteur " + `
- $($Server.Name) `
-Status Veuillez patienter...
$DBDriveName = $Database.EdbFilePath.DriveName
$DBDrive = `
get-wmiobject Win32_PerfRawData_PerfDisk_LogicalDisk `
-Computer $Server.Name -Filter "Name = $DBDriveName"
write-progress -Activity `
Obtention des informations sur la taille du lecteur " + `
- $($Server.Name) `
-Status Veuillez patienter...
# \ doit tre remplac par \\.
$DBPath = $Database.EdbFilePath.PathName.Replace("\","\\")
$DBFile = get-wmiobject CIM_DataFile -Computer $Server.Name `
-Filter Name = $DBPath
$DBName = $Database.StorageGroupName + \ + $Database.Name
Chapitre 11
309
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
310
Partie 3
Chapitre 11
311
mentation hors connexion. Par exemple, une base de donnes a atteint 12 Go, mais les
utilisateurs ont supprim 3 Go de messages. Aprs une dfragmentation en ligne, les 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
312
Partie 3
Figure 11.4
Excution au cours du script GetEvent1221Info.ps1.
Figure 11.5
Excution du script GetEvent1221Info.ps1 termine.
Chapitre 11
313
$EventsTable
laide de la fonction
Export-
314
Partie 3
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 :
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
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
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
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
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
319
Pour chaque message dvnement 1221, une nouvelle ligne contenant ces informations
mises en forme est ajoute lobjet DataTable dans $EventsTable :
#------------------# Obtenir les informations dvnement.
#------------------write-host "Obtention des informations vnements" -NoNewLine
$OnlineServers = $ServersTable.Select("Status = En ligne")
foreach ($Server in $OnlineServers){
&{
trap{"[ERREUR] pour les informations dvnement : `
+ "$Server.Name + " $_" | `
out-le $ErrorLogName -Append; Continue}
$Events = Get-RemoteEventLog $Server.Name "Application"
# Linstruction suivante peut demander beaucoup de temps
# en fonction du nombre de serveurs.
write-progress -Activity Collecte des vnements depuis `
+ "- $($Server.Name)" `
-Status "Veuillez patienter..."
$1221Events = $Events.Entries | where {$_.EventID -eq "1221" -and `
$_.TimeWritten -ge $Date.AddDays(-$Days)}
foreach ($1221Event in $1221Events){
&{
$Message = $1221Event | select Message
$TimeWritten = $1221Event.get_timewritten()
# Cette expression rgulire extrait du message le nom
# de la base de donnes.
$Database = [Regex]::Match($Message, "[^"\r\n]*")
$Database = $Database.Value.Replace(", "")
# Cette expression rgulire extrait la quantit
# despace vide.
$MB = [Regex]::Match($Message, [0-9]+)
[Void]$EventsTable.Rows.Add($Server.Name, $TimeWritten, `
$Database, $MB)
320
Partie 3
}
}
write-progress -Activity Collecte des vnements depuis `
+ " - $($Server.Name)" `
-Status "Termin -completed $True
}
}
write-host `t [OK] -Foregroundcolor Green
Pour 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 ;
Chapitre 11
321
En voici un exemple :
Prenom,Nom,Alias,BaseDonnees
Stu,Gronko,sgronko,SFEX01\SG1\DB1
Caelie,Hallauer,challauer,SFEX02\SG2\DB2
Duane,Putnam,dputnam,SFEX02\SG2\DB2
Essie,Fea,efea,SFEX02\SG1\DB1
Rona,Trovato,rtrovato,SFEX01\SG1\DB2
Gottfried,Leibniz,gleibniz,SFEx01\SG1\DB1
322
Partie 3
Figure 11.6
Excution au cours du script ProvisionExchangeUsers.ps1.
Figure 11.7
Excution du script ProvisionExchangeUsers.ps1 termine.
Chapitre 11
323
324
Partie 3
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
325
if (!$UPNSufx){
write-host
write-host "Veuillez prciser le sufxe UPN ! -Foregroundcolor Red
write-host
Get-ScriptHeader $ScriptName $ScriptUsage
Show-ScriptUsage $ScriptCommand $ScriptParams $ScriptExamples
Return
}
if (!$OUDN){
write-host
write-host Veuillez prciser lUO o crer les utilisateurs !" `
-Foregroundcolor Red
write-host
Get-ScriptHeader $ScriptName $ScriptUsage
Show-ScriptUsage $ScriptCommand $ScriptParams $ScriptExamples
Return
}
if (!$ImportFile){
write-host
write-host Veuillez prciser le chier CSV importer !" `
-Foregroundcolor Red
write-host
Get-ScriptHeader $ScriptName $ScriptUsage
Show-ScriptUsage $ScriptCommand $ScriptParams $ScriptExamples
Return
}
Puis, lapplet de commande Out-File cre un journal des erreurs et y crit des informations
den-tte. Ensuite, la fonction Get-ScriptHeader signale loprateur du script que la partie
automation a dmarr :
#------------------# Dbut du script.
#------------------# Commencer le journal des erreurs.
$ScriptName + " Excut le : " + $Date | out-le $ErrorLogName
write-host
Get-ScriptHeader $ScriptName $ScriptUsage
write-host
write-host Connexion au domaine NoNewLine
326
Partie 3
Le script doit ensuite 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
327
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
$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
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
Index
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
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
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
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
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
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
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
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
138
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
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
ISBN : 978-2-7440-4015-3