Salut à tous c'est Florian d'IT Connect, aujourd'hui nous allons parler de PowerShell
puisque je vais vous présenter 10 commandes à connaître pour administrer Windows, que ce soit
un poste de travail sous Windows ou un serveur sous Windows Server, vous devez connaître ces 10
commandes qui sont vraiment très pratiques et très utiles lorsque l'on utilise la console
PowerShell et surtout elle peut vous faire gagner un gain de temps au quotidien si vous avez
l'habitude de gérer un parc informatique sous Windows ou des serveurs sous Windows. Avant de
passer à la démo j'en profite pour vous parler de mon livre PowerShell, donc débutez avec le
langage PowerShell qui est disponible dès maintenant sur tous les sites Amazon et vous
retrouvez l'intégralité de ce livre en libre accès sur itconnect.fr, vous avez le cours en ligne avec
plus de 50 chapitres en libre accès comme vous pouvez le voir à l'écran et tout ça est disponible
gratuitement, vous avez tout ce qu'il vous faut pour vous former à PowerShell, y compris ce que
je vais vous montrer aujourd'hui, c'est inclus dans ce cours et dans ce livre. Commençons par nous
intéresser à la première commande qui est get-computerinfo qui va nous permettre de récupérer
des informations sur la machine locale, cette commande qui prend un petit peu de temps �
s'exécuter va en fait aller lire différentes classes WMI comme nous pourrions le faire avec
get-wmiobject ou get-siminstance, sauf que là on a une commande qui nous permet de résumer ça et
qui fait qu'on n'a pas besoin d'aller lire les classes WMI par nous même. Ce qu'on va avoir en
termes d'informations, par exemple on aura le numéro de build exact du système qui est installé
on voit ici que c'est une édition professionnelle, si on descend un petit peu on a aussi le répertoire
d'installation de Windows, nous avons également des informations sur le processeur de la
machine, quel est le modèle et combien il y a de processeurs, ici on voit que c'est une VM et du
coup il y a deux processeurs sur cette VM, on a un certain nombre d'informations sur la machine
locale, alors ça ne permettrait pas de faire un inventaire matériel mais ça permet d'avoir accès
à des informations utiles très facilement. Nous avons également ici le logon server, c'est �
dire auprès de quel serveur je me suis authentifié pour ouvrir ma session, en l'occurrence ici c'est
une session locale donc je me suis authentifié en local, mais je pourrais également avoir ici le nom
d'un serveur contrôleur de domaine Active Directory. La seconde commande que vous devez
absolument connaître c'est restart-computer et comme son nom l'indique cette commande va
permettre de redémarrer la machine, elle va permettre de redémarrer la machine locale
mais également une machine distante voire même plusieurs machines distantes, donc ça c'est très
puissant puisque si vous avez besoin de redémarrer plusieurs serveurs à distance, vous exécutez
cette commande, vous mettez le paramètre au-computername et derrière vous venez mettre
le nom des serveurs, voilà srv1, srv2, etc. On pourra redémarrer plusieurs serveurs à condition
que notre machine puisse contacter ces machines-là via WinRM qui est le protocole de gestion �
distance utilisé par défaut via PowerShell, mais en tout cas ça ouvre des possibilités très
intéressantes. Nous pourrions également utiliser le paramètre computername pour forcer le redémarrage
d'une machine à distance, puis attendre que cette machine redémarre tout en ayant un timeout de
180 secondes, c'est à dire on va attendre pendant trois minutes que la machine redémarre et on va
en faire toutes les trois secondes aller vérifier si elle est redémarrée ou non. Le tirer force ici
permet de forcer le redémarrage de la machine même s'il y a des utilisateurs qui sont connectés
donc en gros ça peut être intéressant dans un script d'avoir une formulation comme celle-ci si
on veut exécuter une action, redémarrer la machine à distance et avant d'exécuter la suite du script
on va temporiser, on va attendre que la machine redémarre, donc ça permet de faire cette
temporisation de manière assez intelligente. Ensuite vous devez connaître le commandlet rename-computer qui va tout simplement, comme son nom l'indique, permettre de renommer la
machine locale. Donc ici on va mettre new name, on met le nom qui est là et ça va permettre de
renommer la machine. Ici si je fais un hostname je vois que la machine s'appelle pc-formation
si je lance cette commande ça va redémarrer la machine et lui changer son nom et ça sera
ensuite pc-windows11. L'avantage de ces petites commandes, c'est vrai que je ne l'ai pas forcément
précisé, c'est qu'elles vont fonctionner sur du Windows 10, du Windows 11 et les différentes
versions récentes de Windows Server. Ce qui fait que vous n'avez pas besoin de vous perdre dans
l'interface graphique en vous disant, dans Windows 11 où est-ce que c'est pour renommer la machine
Où est-ce que c'est dans Windows 10 ? Là vous avez des commandes PowerShell, vous pouvez les
exécuter de la même façon sur les différentes machines, ça va fonctionner et donc c'est quand
même plutôt pratique en tant qu'administrateur système d'avoir connaissance de ces différentes
commandes pour ne pas perdre du temps à naviguer dans les menus. Nous pourrions aussi agir �
distance avec cette commande en rajoutant le paramètre computerName qui est ici sur le même
principe qu'avec restart-computer. Parlons maintenant du commande let add-computer qui permet d'ajouter un ordinateur dans un domaine Active Directory ou à l'inverse de quitter un
domaine Active Directory pour passer en workgroup. Alors ça c'est vraiment ultra pratique parce
qu'à un moment donné Microsoft n'arrêtait pas de faire évoluer les interfaces graphiques de
Windows 10 et Windows 11, ce qui fait qu'on ne savait même plus où il fallait aller pour intégrer une machine au domaine. Grâce à cette commande, peu importe la version
j'insiste vraiment sur le fait que PowerShell va être très intéressant pour pouvoir faire des
actions identiques sur différentes versions indépendamment de l'organisation de l'interface graphique. Là on va pouvoir intégrer la machine locale au domaine itconnect.local. Ce paramètre
là va me permettre de demander les identifiants. Si je lance la commande, on me demande ici un nom
d'utilisateur puis un mot de passe. Là forcément ça va me renvoyer une erreur
parce que le domaine est injoignable et les identifiants sont incorrects. Mais avec cette
commande là, je pourrais joindre une machine dans un domaine Active Directory et je pourrais même
ajouter derrière le paramètre restart pour forcer le redémarrage de la machine après
avoir effectué la jonction au domaine. Voyons maintenant comment nous pourrions lister les fonctionnalités facultatives et les installer, que ce soit sur un Windows Server ou
un Windows 10 ou Windows 11. Alors là on a des petites subtilités quand même sur les commandes
puisque pour installer une fonctionnalité supplémentaire sur un Windows Server, on va installer la commande install Windows Feature, alors que sur un Windows Poste de
Travail ce sera enable-WindowsOptionalFeature. Même si globalement les commandes fonctionnent à peu près de la même façon, là il y a une petite subtilité entre du Windows Server et du
Windows. Pour ça je vous ai mis les différentes commandes à l'écran. Donc là on récupère la
liste des fonctionnalités qui sont déjà installées et ensuite ici par exemple on installe le rôle
Hyper-V sur le serveur. De la même façon on va récupérer la liste des fonctionnalités qui sont
installées sur la machine locale. J'ai la liste de toutes les fonctionnalités facultatives avec
leur statut et je pourrais ensuite décider d'installer une fonctionnalité. En l'occurrence
ici je vais installer la fonctionnalité Hyper-V avec les différents outils de gestion. C'est
aussi très pratique pour gérer les fonctionnalités de Windows en ligne de commande et pourquoi pas
faire des scripts d'installation de serveurs ou de postes de travail en ajoutant tel ou tel
fonctionnalité. Get-Process est une commande PowerShell qui va nous permettre d'obtenir des
informations sur les processus en cours d'exécution sur la machine. C'est à dire à tout ce qu'on va
retrouver ici dans le gestionnaire des tâches quand on va dans la partie de détails, à tous
les processus que l'on a là. On va pouvoir les explorer avec PowerShell, notamment avec la
commande donc Get-Process. On voit ici qu'on a un paramètre intéressant qui est tiré Include
Username qui permet d'afficher une information importante. C'est quel est le compte utilisateur
qui est à l'origine de la création du processus ? Ce qui permettrait de voir tel processus a ét�
lancé par tel utilisateur. Pour faire éventuellement une investigation particulière sur un processus
ça peut permettre d'avoir des détails supplémentaires. On pourrait aussi même aller
plus loin pour avoir les processus actuels qui consomment plus de 100 MB de RAM sur la machine
Je vous ai mis la commande à l'écran, j'ai la liste des processus qui consomment plus de 100
MB de RAM sur ma machine actuellement. On voit notamment les processus liés à Visual Studio Code
Pour aller un petit peu plus loin avec le commande Let Get-Process, on pourrait nous intéresser à la propriété Start Time qui permet de savoir à quel moment a été exécuté ou démarr�
un processus. Pour essayer de se renseigner sur l'origine d'un processus, ça peut être intéressant
en plus du nom d'utilisateur de savoir quand est-ce qu'il a été lancé. On a la date et l'heure
à la seconde près. C'est listé ici directement en retour de la commande. Toujours sur la thématique
des processus, nous pourrions utiliser la commande Stop-Process pour forcer la fermeture de tous les
processus qui vont correspondre aux filtres qu'on a mis avant. En l'occurrence ici, on va cibler le
processus Notepad correspondant au blocknote. Le fait d'exécuter cette ligne-là va me permettre
de fermer tous les processus blocknote sur la machine. Notamment s'il y a une application qui
est figée, ça peut être intéressant pour forcer son arrêt à l'aide de PowerShell. On pourrait
même aller plus loin et coupler ça avec le fait d'aller rechercher tous les processus qui consomment
un certain nombre de RAM, qui ont été lancés par un utilisateur spécifique, etc. Derrière, via le
pipeline, on envoie ça à Stop-Process et on va pouvoir arrêter massivement ces processus ou ce
processus en fonction de nos besoins. On voit bien la puissance de PowerShell grâce à des petits
filtres comme ceux-là. Intéressons-nous maintenant à l'historique des mises à jour installées sur une
machine Windows, c'est-à-dire à tout ce que l'on va pouvoir retrouver normalement dans Windows
Update. Il y a bien une commande intégrée à Windows qui s'appelle Get-Hotfix, et qui quand
on va l'installer, va nous retourner les mises à jour qui ont été installées. Comme on peut le
voir ici, on a la date d'installation, le numéro de KB du Hotfix, qui l'a installé, sur quel
ordinateur, etc. Le problème de ça, c'est qu'en fait c'est incomplet. Si j'irais voir dans l'historique
des mises à jour de la machine dans Windows Update, je verrais que j'aurais plus de choses que ce que
j'ai là. Alors du coup, comment on peut faire pour avoir un historique exhaustif et complet ? La
réponse, c'est d'installer le module communautaire PSWindowsUpdate. Ce module contient un ensemble
de commandes qui vont nous permettre de gérer le client Windows Update sur Windows. Que ce soit
pour installer des mises à jour, pour consulter l'historique, pour même configurer Windows Update
vraiment c'est ultra complet, voire même indispensable comme module PowerShell. Microsoft n'a même pas proposé d'alternative, c'est un module qui est vraiment une référence en PowerShell
Du coup, une fois qu'on a installé ce module, comment on va pouvoir lister l'historique des
mises à jour ? On va utiliser la commande get-wu-history. On va pouvoir même classer les
mises à jour installées par date pour avoir un historique cohérent. Donc là, je vais pouvoir
avoir la liste de toutes les mises à jour. On voit que c'est beaucoup plus complet que ce que j'avais tout à l'heure. Je les ai triées par date, de celles qui ont été installées le plus récemment, et
ensuite on remonte dans le temps. J'ai aussi l'état, est-ce que ça a été un succès, est-ce que ça a
été en échec ? Et donc ici, je vois que j'ai une mise à jour qui a été installée le 4 juin
le 24 mai, etc. Ce qui pourrait me permettre de savoir très facilement, est-ce qu'il y a une
mise à jour bien précise qui a été installée ou non sur ma machine. On pourrait même affiner
un petit peu cette commande-là, puisque pour avoir une sortie un peu plus propre, un peu plus épurée, on peut utiliser cette syntaxe-là, de manière à avoir une sortie avec OutgridView, de la liste des
KB, de la date d'installation et le titre de la mise à jour. L'avantage, c'est qu'ici avec le
filtre, on peut taper un numéro de KB et ensuite ça filtre en temps réel. On peut facilement y
notifier une mise à jour et voir si elle a été installée ou non. On pourrait même rajouter ici
dans la sélection des propriétés, le statut pour savoir vraiment si l'installation a échoué ou si
elle a réussi. Autre cas de figure intéressant, toujours basé sur la même commande-lettre
c'est de voir quelles sont les mises à jour qui ont été installées sur les 31 derniers jours
sur le dernier mois. Simplement en utilisant le paramètre maxDate de cette commande-là
on va pouvoir faire un calcul sur la date. On va prendre la date actuelle, on va soustraire 31 jours
et avoir le résultat ici. J'ai bien les mises à jour qui ont été installées sur les 31 derniers
jours, ce qui m'évite d'avoir un historique relativement conséquent, comme c'était le cas
ici lorsque j'ai exécuté la commande tout à l'heure. Bien entendu, nous pouvons faire un filtre avec
WearObject pour cibler un numéro de KB spécifique. Si on veut vraiment avoir des informations sur
cette KB précisément, c'est la mise à jour cumulative de mars 2024 par exemple, je vois
qu'elle est bien présente sur cette machine, elle a été installée tel jour à telle heure, et on voit bien le résultat, c'est un succès
GetChildItem est également une commande à connaître puisqu'elle va nous permettre
d'aller lister le contenu d'un répertoire, mais au-delà d'aller pouvoir lister tout simplement
le contenu d'un répertoire d'une arborescence, on va pouvoir faire différents filtres pour par
exemple rechercher tous les fichiers qui correspondent à une extension particulière, ou tous les fichiers les plus volumineux, etc. On va pouvoir vraiment appliquer des filtres qui
vont faire en sorte que cette commande soit très puissante et qu'elle aille beaucoup plus loin que
ce que l'on pourra avoir avec l'explorateur de fichiers de Windows. Tout ça sans installer
d'application tiers. Là par exemple je viens de lister le contenu de ce répertoire, si je veux
lister le contenu de ce répertoire plus tous les sous-répertoires, il faut ajouter le paramètre
tiré recurse pour la récursivité, donc là il n'y a pas forcément de sous-répertoires
mais en gros ce paramètre est quand même important en fonction des besoins. Nous pourrions
ajouter un filtre pour lister uniquement les fichiers .exe, on voit ici que j'ai différents
fichiers, j'ai qu'un seul .exe, donc si je rajoute le filtre il ne me sort bien que le .exe. Ça peut
être intéressant si vous recherchez toutes les photos dans une arborescence, ou tous les pdf
tous les exécutables, peut-être même aussi. Vraiment vous faites une recherche, PowerShell
va être très efficace là-dessus. Voici également un moyen d'obtenir la liste des dix fichiers les
plus volumineux situés dans le répertoire C2.users, enfin dans l'arborescence C2.users. Donc l�
PowerShell va faire une recherche et nous indiquer que ce sont les dix fichiers les plus
volumineux présents sous cette arborescence qui a été ciblée. Donc là ça me permet de faire une
recherche très rapide et d'avoir une information relativement précise et précieuse pour le coup
Ça peut vraiment être utile ce type de commande si vous voulez faire du tri, notamment sur un serveur
de fichiers Windows, voire même sur votre pc. Pour être un peu plus précis, parce que ici la
taille n'est pas exprimée dans une valeur facilement lisible pour nous les humains
du coup on va faire ce que l'on appelle une propriété calculée. Ici on va venir exprimer
la valeur, comme c'est le cas là, en giga. Je pourrais le faire aussi en méga, là c'est en giga
donc je vois en gros ce fichier là il fait à peu près 100 méga. Alors c'est peut-être pas
cohérent d'avoir utilisé les giga par rapport aux fichiers que j'ai sur ma machine, mais si
on a vraiment des très gros fichiers ce sera bien d'avoir la taille en giga. D'ailleurs voici un
autre exemple où là on va exprimer cette fois-ci la taille en méga, comme on le voit ici c'est
beaucoup plus précis. En plus j'ai rajouté la propriété Directory Names, ce qui me permet de
savoir où est-ce qu'il est ce fameux fichier, parce que c'est bien j'ai le nom, mais si je ne sais
pas où il est ça ne me donne pas grand chose. Donc là non seulement j'ai le nom du fichier
et en plus j'ai son emplacement, ce qui va me permettre de le localiser très précisément
Pour finir nous allons nous intéresser aux journaux Windows, c'est à dire à tout ce que
l'on va retrouver en termes de logs dans l'observateur d'événements, dans les journaux Windows ici ou dans les journaux des applications et des services. Cette première commande va nous
permettre déjà de dresser la liste de tous les journaux présents sur la machine locale
puisque au-delà des journaux natifs dans Windows on peut créer des journaux personnalisés
on a des applications qui peuvent créer leurs propres journaux, donc ça permet d'avoir la
liste. Ici dans cette liste on va avoir à chaque fois le nom complet du journal, ainsi que le
nombre d'éléments actuels, donc le nombre de logs qu'il y a dans chaque journal. Ce que l'on
pourrait faire par exemple c'est lister les événements qui sont présents dans le journal System. Il y a deux commandes pour aller consulter les journaux Windows, il y a Get-EventLog et Get-WinEvent
qui s'utilisent plus ou moins de la même façon, et ça permet d'aller lire les journaux Windows
Alors là ça me retourne vraiment tout et quand forcément je cible un journal aussi conséquent
que System, le retour dans la console est énorme. Comment faire pour aller affiner un petit peu ça
Typiquement on pourrait utiliser le paramètre New West sur la commande Get-EventLog, ce qui
permettrait de récupérer les dix derniers journaux les plus récents dans le journal System de ma
machine Windows. Là déjà c'est beaucoup plus intéressant puisque je ne récupère que les
dix derniers au niveau des logs, et donc la sortie est beaucoup plus rapide à être générée. Une
autre approche consisterait plutôt à aller lire les dernières erreurs. Peut-être qu'il y a beaucoup
de messages de type informations, mais est-ce qu'il y a vraiment des erreurs ? En fait là on va pouvoir
aller faire un filtre sur les erreurs et avoir vraiment que les erreurs dans la console
et donc peut-être avoir les messages clés qui vont nous intéresser. De la même façon on pourrait
aussi cibler un ID spécifique, puisque chaque journal, chaque type d'événement a un ID spécifique
Du coup en faisant ça je vais aller cibler tous les événements dont l'ID est 107. Là ça me
permettrait vraiment de savoir combien j'ai d'événements avec l'ID 107 sur ma machine
quand ils ont été générés, etc. Ça permet vraiment d'effectuer des recherches, des
investigations précises via PowerShell. Même si là il faudrait aussi peut-être faire un
outgridview derrière, ou formater un petit peu la sortie de la commande pour que ce soit plus
facilement lisible dans la console. En même temps là je suis dans Visual Studio Code. La dernière
syntaxe que je voulais vous montrer c'est celle-ci, on va pouvoir aller directement rechercher dans le
message du journal en intégrant ici un mot clair. Il faut bien penser à mettre les astérisques
donc un astérisque avant, un astérisque après, pour vraiment rechercher le mot clé, qu'il soit au
début, à la fin ou en plein milieu du message. Ça c'est pareil, ça va être très puissant pour
aller faire des recherches dans les journaux Windows. Cette vidéo est à présent terminée
nous avons vu 10 commandes PowerShell indispensables pour administrer Windows. On pourrait
même dire qu'on a vu plus de 10 commandes à travers de tous ces exemples. Je pourrais même
vous montrer encore beaucoup plus de commandes, mais voilà je me suis arrêté sur cette liste
ce qui me permet d'aller voir pas mal de choses différentes avec PowerShell sur une machine
que ce soit un poste de travail ou un serveur, et de se faire des scripts sympas pour aller
collecter des informations, lire des informations, faire du reporting de manière beaucoup plus facile
que ce que l'on pourrait faire avec l'interface graphique de Windows. Surtout ça fonctionnerait
bien sûr sur les différents systèmes, différentes versions de Windows. J'espère que ça vous a plu
n'hésitez pas à aller lire le cours complet sur itconnect.fr, n'hésitez pas à me dire ce que
vous en pensez en commentaire, et je vous dis à très vite ! Ciao