Recherche et collecte d'informations
Introduction
En tant qu’administrateur, vous avez souvent besoin de récolter des informations sur les postes de travail qui exécutent les scripts. Savoir collecter de l’information, mais surtout savoir où trouver l’information, est une chose primordiale, car cela sert par exemple pour la mise en place de structures conditionnelles (If, ElseIf, Else) dans un script. En effet, selon une ou plusieurs conditions, vous souhaitez peut-être que le script n’exécute pas les mêmes lignes de commandes.
La collecte d’informations peut également servir pour auditer des postes de travail, et ainsi récupérer des informations sur les différents composants matériels qui les composent. Cela peut permettre par exemple de repérer l’ensemble des ordinateurs possédant un composant qui a été déclaré comme défectueux par le fabricant, et de procéder rapidement à son changement.
À la lecture de ce chapitre, vous allez savoir comment récupérer une très grande majorité d’informations, aussi bien sur la partie matérielle que logicielle. Ceci afin de mener à bien l’ensemble des tâches que vous souhaitez effectuer en fonction de la machine qui exécute les lignes de commandes PowerShell.
Rechercher des fichiers
Windows intègre nativement l’outil de recherche de fichiers accessible depuis l’Explorateur de fichiers. Avec Windows PowerShell, il est possible de faire ce type de recherche, uniquement avec la cmdlet Get-ChildItem qui a été vue précédemment. La recherche est de plus en plus omniprésente dans Windows, et la quantité de données de plus en plus grandissante. Il convient de savoir faire des recherches approfondies avec Windows PowerShell.
1. Rechercher des fichiers en fonction de leurs propriétés
Commençons par une recherche en fonction du type de fichier, par exemple les fichiers de données Outlook, dont l’extension est .pst. Pour rechercher dans l’ensemble du disque C: la présence de ces fichiers, écrivez :
Exemple :
PS C:\Windows\system32> Get-ChildItem C:\ -Filter *.pst -Recurse
Directory: C:\Sauvegarde
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 24/03/2014 17:53 190989312 Archive2013.pst
Directory: C:\Users\Julien\Outlook
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 11/12/2011 13:45 1527792640 Archive2013.pst
-a--- 29/01/2012 15:21 1003635712 Outlook.PST
Par ce biais, vous pouvez rechercher tous les types de fichiers...
Comparer des objets
Compare-Object permet de comparer deux objets entre eux : le premier est désigné avec l’aide du paramètre -ReferenceObject, tandis que le second est indiqué avec le paramètre -DifferenceObject. Il est ainsi possible de comparer le contenu de deux fichiers texte, registres, etc. Compare-Object est adapté pour comparer le contenu de deux éléments contenant du texte, ou des propriétés d’objets.
1. Comparer deux fichiers texte
Le résultat retourné par Compare-Object est un indicateur pour chaque élément comparé. Ainsi, tout élément propre à l’objet de référence est indiqué par le symbole <=, et tout élément propre à l’objet de différence par le symbole =>. En spécifiant le paramètre -IncludeEqual, tout ce qui est commun aux deux objets de référence et de différence est affiché à l’écran avec l’indicateur ==.
Exemple 1 : comparaison de deux fichiers texte
PS C:\Windows\system32> Compare-Object -ReferenceObject (Get-Content
C:\Temp\ref.txt) -DifferenceObject (Get-Content C:\Temp\dif.txt)
InputObject SideIndicator
----------- -------------
Ce fichier est nommé dif.txt, et est l'objet de différence. =>
Ce fichier est nommé ref.txt, et est l'objet de référence. <=
Seulement une ligne différencie les deux fichiers. Ainsi, le symbole retourné par SideIndicator indique clairement quelle ligne est uniquement présente en fonction de l’objet de référence ou de différence.
Si vous reprenez l’exemple précédent, en rajoutant le paramètre...
Récupérer les informations générales de l’ordinateur
Des informations générales composant l’ordinateur peuvent être récupérées au travers de la cmdlet Get-ComputerInfo. L’ensemble des informations retournées par cette cmdlet est une consolidation de divers éléments qui peuvent être récupérés au travers de requêtes WMI : informations sur le matériel (processeur, carte réseau, etc.), le BIOS, le système d’exploitation, incluant ses paramètres système (nom, domaine, etc.), mais aussi régionaux (horloge, langue et région).
Si l’utilisation de requêtes WMI est expliqué dans la section Obtenir des informations grâce aux classes WMI, Get-ComputerInfo permet de récupérer rapidement des informations générales composant le système, et sans connaissance préalable sur les classes WMI.
Get-ComputerInfo ne permettant que d’afficher de l’information, celle-ci peut être utilisée simplement sans paramètre.
La cmdlet peut toutefois prendre un paramètre pour filtrer les propriétés retournées par la cmdlet.
Paramètre |
Description |
-Property<String[]> |
Permet la récupération des propriétés ciblées par la chaîne de caractères spécifiée. Le caractère générique * (wildcard) est autorisé. |
Voici un exemple complet des informations qu’affiche Get-ComputerInfo sur une machine Hyper-V :
PS C:\WINDOWS\system32> Get-ComputerInfo
WindowsBuildLabEx : 18362.1.amd64fre.19h1_release.190318-1202
WindowsCurrentVersion : 6.3
WindowsEditionId :...
Les variables d’environnement
Comme vous l’avez vu au chapitre Les lecteurs Windows PowerShell, il existe un lecteur de variables d’environnement (Env:). Il contient les variables d’environnement propres au système d’exploitation et à la session utilisateur en cours d’exécution.
Ces variables dynamiques, et globales au système, permettent de transmettre de l’information entre les différents processus exécutés par Windows. Elles fournissent de l’information en fonction de la configuration de Windows sur le poste de travail.
Prenons un exemple simple, avec la variable $env:USERPROFILE : celle-ci vous retourne le chemin d’accès au profil de l’utilisateur qui a sa session d’ouverte. Si vous vous authentifiez avec un autre compte utilisateur, le chemin d’accès est différent.
Ainsi, pour un script PowerShell qui risque d’être exécuté sur des postes aux configurations totalement différentes, il convient d’utiliser au maximum les variables d’environnement.
Ces variables sont autodéfinies lorsqu’une session PowerShell démarre. Pour visualiser l’ensemble des variables d’environnement, et avoir une vue d’ensemble, vous pouvez exécuter la commande suivante :
PS C:\Windows\system32> Get-ChildItem Env:
Name Value
---- -----
ALLUSERSPROFILE C:\ProgramData
APPDATA C:\Users\Admin\AppData\Roaming
CommonProgramFiles C:\Program Files\Common Files
CommonProgramFiles(x86) C:\Program Files (x86)\Common Files
CommonProgramW6432 C:\Program...
Obtenir des informations grâce aux classes WMI
Les objets WMI permettent de rechercher des informations. Informations qui peuvent être liées à la machine (BIOS, configuration matérielle, etc.), comme à Windows (configuration, logiciels installés, etc.). Et le tout accessible depuis une seule cmdlet : Get-WmiObject.
WMI (Windows Management Instrumentation) est une API (Application Programming Interface) créée en 1998 par Microsoft. Elle a pour objectif de simplifier l’administration dans un environnement distribué, pour faciliter l’échange de données dans un réseau composé d’équipements non homogènes.
La base WMI est composée de classes, représentant une famille d’éléments. Chacune de ces classes contient des informations, qu’il est facile d’exploiter avec Windows PowerShell. Il est même possible d’agir sur le système d’exploitation, le matériel et les logiciels par l’intermédiaire de WMI à l’aide des méthodes, mais ce n’est pas l’objet de ce chapitre. Vous allez voir un ensemble de classes et différentes propriétés qui les composent, afin de pouvoir récupérer des informations, puis d’exploiter ces données en fonctions de vos objectifs.
La liste des classes est longue, très longue, et pour vous donner une idée, vous pouvez exécuter la ligne de commande suivante :
PS C:\Windows\system32> Get-WmiObject -List
NameSpace : ROOT\cimv2
Name Methods Properties
---- ------- ----------
CIM_Indication {} {CorrelatedIndic...
CIM_ClassIndication {} {ClassDefinition... ...
Les mises à jour
Un autre point important sur un poste de travail est d’avoir un aperçu des mises à jour actuellement installées. Celles-ci sont toutes référencées par un numéro de KB (Knowlegde Base). Microsoft déploie majoritairement les correctifs de sécurité le deuxième mardi de chaque mois (Patch Tuesday), ceci afin que les administrateurs IT puissent tester et valider ces correctifs avant un déploiement plus généralisé au sein de l’entreprise. Cependant, Microsoft peut être amené à sortir des correctifs de sécurité en dehors de ce créneau prédéfini si ceux-ci sont déjà exploités.
Enfin, sachez que des mises à jour proposées par Windows Update ne concernent pas seulement le système d’exploitation Windows. Des correctifs pour la suite Office peuvent être déployés par exemple, ainsi que pour d’autres produits.
1. Lister les mises à jour installées
Grâce à PowerShell, récupérer la liste des mises à jour installées est facile. Avec une seule commande, plusieurs données sont listées : identifiant du correctif (numéro du KB), le compte utilisateur ayant effectué la mise à jour, ainsi que la date d’installation. La cmdlet à utiliser est Get-HotFix. Voici les paramètres :
Paramètre |
Description |
-ComputerName <String[]> |
Spécifie un ou plusieurs ordinateurs distants. |
-Credential <PSCredential> |
Spécifie un compte d’utilisateur qui a l’autorisation d’exécuter cette action. La valeur par défaut est l’utilisateur actuel. |
-Description <String[]> |
Obtient uniquement les correctifs logiciels ayant les descriptions spécifiées. Les caractères génériques sont autorisés. |
-Id <String[]> |
Obtient uniquement les correctifs logiciels portant les ID de correctif logiciel spécifiés. |
Exemple : récupération de la liste des KB installés sur l’ordinateur local
PS C:\Windows\system32> Get-HotFix
Source Description HotFixID InstalledBy InstalledOn ...