Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici

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