177 Chapitre 4 La recherche et la collecte d informations 1. Introduction La recherche et la collecte d'informations 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.
178 Windows PowerShell (version 4) Administration de postes clients Windows 2. 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. 2.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 : PS C:\Windows\system32> Get-ChildItem C:\ -Filter *.pst Recurse Directory: C:\Sauvegarde -a--- 24/03/2014 17:53 190989312 Archive2013.pst Directory: C:\Users\Julien\Outlook -a--- 11/12/2011 13:45 1527792640 Archive2013.pst -a--- 29/01/2012 15:21 1003635712 Outlook.PST Editions ENI - All rights reserved
La recherche et la collecte d'informations Chapitre 4 179 Par ce biais, vous pouvez rechercher tous les types de fichiers, et ce depuis un point de l'arborescence que vous avez choisi. En effet, inutile de rechercher dans une partition entière les données si vous savez où se trouvent celles-ci : cela permet un gain de temps considérable. Il est bien entendu possible d effectuer une recherche de tous les fichiers faisant plus de 100 Mo. PS C:\> Get-ChildItem Path. Recurse Where-Object {$_.Length -gt 104857600} Directory: C:\Archives\Windows 7\Service Pack 1 -a--- 23/11/2010 02:49 947070088 windows6.1-kb976932-x64.exe Directory: C:\Archives\Windows 7\XPmode -a--- 27/03/2011 13:45 492597008 WindowsXPMode_en-us.exe [...] Remarque La valeur exprimée par Length est en octets (bytes). 1 024 octets = 1 Ko, 1 024 * 1 024 octets = 1 Mo, 1024 * 1024 * 100 octets = 100 Mo. Il est également possible de rechercher des fichiers en fonction de la date de dernière modification. Dans l'exemple suivant, le résultat retourne tous les fichiers qui n'ont pas été modifiés depuis plus d'un an par rapport à la date du jour.
180 Windows PowerShell (version 4) Administration de postes clients Windows PS C:\> $date = Get-Date -Year (((Get-Date).Year)-1) PS C:\> Get-ChildItem Path. Recurse Where-Object {$_. LastWriteTime -lt $date} Directory: C:\Archives\Windows 7\Service Pack 1 -a--- 23/11/2010 02:49 947070088 windows6.1-kb976932-x64.exe Directory: C:\Archives\Windows 7\XPmode -a--- 27/03/2011 13:45 492597008 WindowsXPMode_en-us.exe [...] 2.2 Agir sur le résultat de la recherche La recherche est en général utilisée pour deux choses : Soit pour essayer de retrouver un fichier. Soit pour effectuer une action sur un ensemble de fichiers. C'est ce deuxième point que nous allons voir maintenant. Vous pouvez agir directement sur la liste de fichiers retournée par Get-ChildItem. En effet, il est possible de transmettre ce flux directement à une autre cmdlet qui définiral'action que vous souhaitez effectuer sur tous ces fichiers. Par exemple, pour supprimer l ensemble des fichiers temporaires présents dans un dossier et ses sous-dossiers, une seule commande est nécessaire. PS C:\Temp> Get-ChildItem Path. Filter *.tmp Recurse Remove-Item Editions ENI - All rights reserved
La recherche et la collecte d'informations Chapitre 4 181 Pour une copie de fichiers, écrivez : PS C:\Dossier2014> Get-ChildItem -Path. Recurse Copy-Item -Destination \\server01\backup$ -Recurse -Force 2.3 Rechercher dans le contenu des fichiers Mais la recherche peut encore aller plus loin, avec la recherche de l information directement dans des fichiers de type ASCII, c'est-à-dire l'ensemble des fichiers texte, des scripts, des fichiers de configuration divers, etc. Cela peut s avérer pratique pour retrouver un fichier où est enregistrée une chaîne de caractères bien spécifique. Pour cela, utilisez la cmdlet Select-String qui effectue la recherche de l'expression qui lui est fournie. Paramètre -CaseSensitive -Path <String[]> -Pattern <String[]> Description Recherche sensible à la casse. Par défaut, la recherche n'est pas sensible à la casse. Indique le chemin d'accès aux fichiers où la recherche est effectuée. L'utilisation du caractère générique "*" est autorisée. Spécifie le texte à rechercher. Celui-ci peut être une chaîne de caractères, ou une expression régulière. PS C:\Temp> Select-String -Pattern "Win32_" -Path.\serial.vbs serial.vbs:8:set colitems = objwmiservice.execquery("select * from Win32_BIOS",,48) serial.vbs:59:set colitems = objwmiservice.execquery("select * from Win32_ComputerSystem",,48) serial.vbs:107:set IPConfigSet = objwmiservice.execquery("select * from Win32_NetworkAdapterConfiguration Where IPEnabled=TRUE") Le résultat de Select-String retourne alors, pour chaque expression trouvée, le nom du fichier, et la ligne correspondante.
182 Windows PowerShell (version 4) Administration de postes clients Windows Remarque Par défaut, la recherche de l'expression fournie au paramètre -Pattern n'est pas sensible à la casse. Pour que la recherche soit sensible à la casse, il faut rajouter le paramètre -CaseSensitive. En associant les cmdlets Get-ChildItem et Select-String, vous opérez une recherche plus élargie. L'exemple suivant scrute le contenu des fichiers d'extension.txt,.vbs, et.ps1 présents dans le répertoire C:\Temp et ses sousdossiers, et vérifie si le mot "Annecy" est présent. PS C:\Temp> Get-ChildItem.\* -Include *.txt,*.vbs,*.ps1 -Recurse Select-String -Pattern "Annecy" -CaseSensitive PXE.txt:5:# Site Annecy SetQuota.ps1:If ($site -eq "Annecy") La cmdlet Get-ChildItem est plus qu'une simple commande dir. Bien utilisé, Get-ChildItem devient un véritable moteur de recherche, aussi bien dans l arborescence de vos fichiers que dans la base de registre Windows. Couplée avec d autres cmdlets, une action peut être effectuée en une seule ligne de commande sur l ensemble des fichiers résultant de la commande Get-ChildItem. 3. 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. Editions ENI - All rights reserved