La dimension objet
Introduction
Avant l’apparition de Windows PowerShell, les environnements connus, tels que Korn Shell ou Bourne Again Shell, reposaient, et reposent toujours, sur un paradigme dit « texte » - chaque composant effectuant une tâche spécifique communique avec le composant suivant à travers des flux standards. Le paradigme de composition fonctionnelle est aujourd’hui le plus répandu, et PowerShell ne déroge pas à cette règle.
En effet, Windows PowerShell contient une syntaxe très inspirée des environnements que nous venons de citer (BASH, KSH, etc.), mais se distingue cependant de ceux-ci en étant basé sur le paradigme objet. La conséquence est que la manière dont il doit être pensé par les utilisateurs est logiquement différente et que cela constitue en quelque sorte une révolution. Cette partie de l’ouvrage traitera donc de la nécessité de comprendre cette dimension nouvelle qu’a apportée Windows PowerShell, ainsi que de différentes modalités d’actions possibles dans la manipulation des objets.
La notion d’objet comme concept central
Windows PowerShell repose sur le paradigme objet. Donc, avant de voir comment les objets sont manipulés dans cet écosystème, il est absolument fondamental de comprendre ce qu’est un objet et de saisir sa réalité dans Windows PowerShell.
1. Décrire ce qu’est un objet
Avant toute démarche consistant à manier un objet quelconque, nous devons comprendre que toute opération, quelle que soit sa nature, est réalisée dans un cadre englobant des objets. Cette remarque est essentielle, voire préliminaire : un processus, un service, un fichier ou un répertoire sont accessibles via PowerShell en tant qu’objets.
Un objet représente une collection d’informations structurées et formant un tout identifiant un élément particulier. À ce titre, sa composition se divise en plusieurs parties, trois pour être précis. Le tableau ci-dessous décrit l’ensemble de ces parties :
Partie |
Description |
Type |
Il s’agit du type de l’objet. |
Propriétés |
Les propriétés d’un objet décrivent des informations d’état de l’objet. |
Méthodes |
Les méthodes désignent des actions pouvant être effectuées sur l’objet. |
Tableau 8-1. Structure d’un objet
Les parties d’un objet constituent le moyen d’agir sur lui-même. La section suivante nous permettra de mieux comprendre la réalité des objets existant dans l’environnement de PowerShell.
2. La réalité des objets sous Windows PowerShell
Pour mieux concevoir ce que recouvre la notion d’objet dans Windows PowerShell, nous prendrons deux exemples ; tout d’abord, celui d’un service Windows :
PS> Get-Service -Name WinRM
Status Name DisplayName
------ ---- -----------
Running winrm Gestion à distance de Windows (Gest...
Le service interrogé à l’aide de la cmdlet Get-Service se nomme WinRM. Nous savons, grâce à la propriété Status, que le service est en cours d’exécution....
Créer un objet
Vous l’aurez sans doute deviné, la notion d’objet est au centre de l’écosystème de Windows PowerShell. Partant de ce constat, un utilisateur pourrait se demander comment créer ses propres objets. Cette question est évidemment légitime, car les objets existants ne répondent pas forcément à certaines problématiques posées. Donc, un utilisateur doit pouvoir créer ses propres structures pour concrétiser ses objectifs. Dans cette partie, nous verrons deux méthodes de création d’objets dans PowerShell :
-
La méthode utilisant la cmdlet New-Object ;
-
La méthode utilisant les dictionnaires.
1. Créer un objet avec New-Object
La commande New-Object est un formidable moyen de créer des objets de manière rapide et efficace ; elle est en effet très adaptée pour les administrateurs ne maîtrisant pas la programmation. Deux types d’objets peuvent être créés avec cette commande, à savoir les objets .NET ainsi que les objets COM. Ici, nous créerons un objet .NET parce qu’ils représentent l’essentiel de l’utilisation des objets d’une manière générale.
Créer un objet à l’aide de la cmdlet New-Object est très simple. Voici un exemple :
PS> $obj...
Agir sur les objets
Lors de la manipulation d’objets, il est très fréquent de réaliser des actions spécifiques sur eux. Dans ce type de situations, la cmdlet Foreach-Object est un outil important.
1. La cmdlet Foreach-Object
Le principe de Foreach-Object est qu’une ou des actions sont effectuées pour chaque objet. De plus, Foreach-Object repose sur le principe des blocs de script :
-
chaque objet est traité dans un bloc de script (paramètre -Process) et est symbolisé par la variable $_ ;
-
au sein des blocs de script, tout type d’élément de langage peut être utilisé.
Il existe trois paramètres importants de la commande Foreach-Object ayant comme valeur des blocs de script. Ces paramètres sont listés dans le tableau 8-2 :
Paramètre |
Description |
-Begin |
Indique les actions à exécuter avant le traitement du premier objet. |
-Process |
Indique les actions à exécuter pour chaque objet. |
-End |
Indique les actions à exécuter une fois que tous les objets ont été traités. |
Tableau 8-2. Paramètres importants de la cmdlet Foreach-Object
Foreach-Object n’a pas de restrictions particulières en fonction de la nature des objets, et les marges de manœuvre sont grandes :
PS> (1..10) | ForEach-Object -Process {$_ * 3}
3
6
9 ...
Trier les objets
Windows PowerShell permet aux utilisateurs de trier les objets sur la base de critères. En outre, un tri d’objets peut prendre plusieurs formes. Cette section nous donnera davantage d’éclaircissements sur la façon dont le tri des objets est effectué avec PowerShell.
1. Trier les objets dans l’ordre croissant
Une commande très intéressante, Sort-Object, trie les objets qu’elle reçoit à partir de certains critères. Le premier critère est celui des propriétés :
PS> Get-Service | Sort-Object -Property 'Status'
Status Name DisplayName
------ ---- -----------
Stopped sacsvr Application d'assistance de la Cons...
Stopped SCardSvr Carte à puce
Stopped RSoPProv Fournisseur d'un jeu de stratégie r...
Stopped RemoteAccess Routage et accès distant
Stopped RpcLocator Localisateur d'appels de procédure ...
Stopped SCPolicySvc Stratégie de retrait de la carte à ...
Stopped SNMPTRAP Interruption SNMP
Stopped sppuinotify Service de notification SPP
Stopped SharedAccess Partage de connexion Internet (ICS)
Stopped seclogon Ouverture de session secondaire
Stopped SessionEnv Configuration des services Bureau à...
Stopped Netlogon Netlogon
Stopped NetMsmqActivator Adaptateur d'écouteur Net.Msmq
Stopped napagent ...
Sélectionner les objets
Nous l’avons vu, les objets sont des entités composées d’un certain nombre d’éléments. Ces éléments sont des informations formant un tout identifiant un objet. Si nous considérons les informations composant un objet comme importantes, alors l’importance de celles-ci est à relativiser selon des contextes bien précis. Autrement dit, nous avons parfois besoin d’interroger toutes les informations d’un objet donné parce que le contexte l’exige, mais dans d’autres situations, nous pouvons avoir une approche sélective des informations mises en évidence ; à ce moment-là, il doit exister un moyen de sélectionner les informations que nous considérons comme utiles. Windows PowerShell facilite le processus de sélection des informations à l’aide de la cmdlet Select-Object, moyen de sélection puissant s’il en est.
1. Avoir une approche sélective
Select-Object est une commande existant depuis les origines de PowerShell. Son principe est simple : aider l’utilisateur à choisir des informations provenant d’un ou de plusieurs objets, pour en faciliter la lecture. Commençons par sélectionner, parmi un flux d’objets, certaines propriétés plutôt que d’autres :
PS> Get-Service | Select-Object -Property 'Name', 'Status'
Name Status
---- ------
AeLookupSvc Stopped
ALG Stopped
AppHostSvc Running
AppIDSvc ...
Organiser les objets en groupes
La gestion de flux d’objets peut nécessiter des étapes. En effet, avant d’agir sur des objets donnés, leur organisation en divers groupes constitue dans certains cas un préalable. La commande Group-Object permet d’atteindre ce but et donc de tendre vers une meilleure gestion des objets.
1. Utiliser les propriétés comme base de référence de groupement
Le groupement d’objets à partir de propriétés est une possibilité offerte par la cmdlet Group-Object. Essayons d’organiser les processus d’un système d’exploitation Windows par leur nom :
PS> Get-Process | Group-Object -Property 'ProcessName'
Count Name Group
----- ---- -----
1 conhost {System.Diagnostics.Process (conhost)}
2 csrss {System.Diagnostics.Process (csrss), Syst
1 dwm {System.Diagnostics.Process (dwm)}
1 explorer {System.Diagnostics.Process (explorer)}
1 Idle {System.Diagnostics.Process (Idle)}
1 lsass {System.Diagnostics.Process (lsass)}
1 lsm {System.Diagnostics.Process (lsm)}
1 mmc {System.Diagnostics.Process...
Filtrer les objets
Filtrer les objets à partir de critères simples ou complexes est aussi une possibilité offerte par Windows PowerShell. La commande Where-Object autorise la définition de filtres puissants sur la base desquels un objet sera retenu ou non. Cette cmdlet a subi, au même titre que d’autres cmdlets, un certain nombre de changements, mais nous nous bornerons dans cette partie à une utilisation classique de la commande Where-Object, utilisation restant néanmoins la plus répandue.
1. La cmdlet Where-Object
Le principe de Where-Object est de retenir un objet uniquement si l’exécution d’une ou de plusieurs instructions a pour résultat la valeur True. Si, au contraire, le résultat de l’exécution d’un bloc de script renvoie la valeur False, alors l’objet est ignoré. En effet, Where-Object exécute un bloc de script (« script block ») pour effectuer le processus de filtrage des objets. Essayons de lister les processus systèmes dont le nom commence par svc :
PS> Get-Process | Where-Object -FilterScript {
$_.ProcessName -match 'ˆsvc*' }
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
300 34 9976 12360 57 0,17 12 svchost
344 14 3272 8004 46 0,16 580 svchost
222 15 2592 6156 34 0,16 704 svchost
291 15 9008 11872 47 0,22 792 svchost
846 41 20164 27588 147 0,64 824 svchost
221 17 4684 9036 43 0,09 872 svchost
217 16 3452 9300...