# Powershell

Powershell est le successeur de cmd dans l'administration de Windows à la ligne de commande. Plutôt que d'utiliser des exécutables individuels ayant tous des structures différentes, Microsoft a tenté d'unifier la structure des commandes ainsi que les résultats de ces commandes.  
  
https://learn.microsoft.com/fr-ca/powershell/

# Base

# Types d'objets de base

### History

D'abord et avant tout, je vous suggère fortement de vous familiariser avec le type d'objet History. Il s'agit de l'historique des commandes que vous avez saisi au cours d'une session Powershell. Ces objets vous aideront à créer des scritps, à réviser vos commandes, etc.

Ces commandes sont écrites dans le fichier "%AppData%\\Microsoft\\Windows\\PowerShell\\PSReadLine"

Ces objets sont consultables à l'aide de la commande "Get-History" et sont composés des propriétés suivantes :

```
Id                 : 7
CommandLine        : $mon_message = "Hello world!"
ExecutionStatus    : Completed
StartExecutionTime : 2025-01-18 4:20:04 PM
EndExecutionTime   : 2025-01-18 4:20:04 PM

Id                 : 8
CommandLine        : Write-Host $mon_message
ExecutionStatus    : Completed
StartExecutionTime : 2025-01-18 4:20:10 PM
EndExecutionTime   : 2025-01-18 4:20:10 PM
```

Vous pourriez donc facilement à partir de cet historique créer un script basé sur les manipulations que vous avez fait lors de votre session si vous sélectionnez seulement la ligne de commande comme ceci :

```
PS C:\Users\alexa> Get-History | Select-Object -Property CommandLine

CommandLine
-----------
clear-history
$mon_message = "Hello world!"
Write-Host $mon_message
Get-History
Get-History | Select-Object -Property *
```

#### ID

L'identifiant de l'objet détermine l'ordre dans lequel les commandes ont été exécutées.

#### CommandLine

La commande exécutée.

#### ExecutionStatus

L'état de la commande à savoir si elle est en cours d'exécution (ex. un ping continu), si elle a échoué ou si elle a été complétée.

#### StartExecutionTime

La date et l'heure de l'exécution de la commande.

#### EndExecutionTime

La date et l'heure de la fin d'exécution de la commande, qu'elle ait été annulée, qu'elle ait échouée ou qu'elle se soit complétée.

### Item et ChildItem

Un ChildItem peut représenter plusieurs types d'information. Ce type d'objet est généralement utilisé pour manipuler des fichiers sur un espace de stockage mais peut aussi être utilisé pour modifier des clés de registre.

On peut déduire du nom des types d'objets qu'un Item sélectionne seulement l'objet demandé tandis qu'un ChildItem sélectionnera les objets situés à l'intérieur de l'objet. Ces deux types d'objets possèdent les mêmes propriétés et peuvent être manipulés de la même façon.

```
PS C:\Users\alexa> Get-Item D:\Item | Select-Object -Property *


PSPath            : Microsoft.PowerShell.Core\FileSystem::D:\Item
PSParentPath      : Microsoft.PowerShell.Core\FileSystem::D:\
PSChildName       : Item
PSDrive           : D
PSProvider        : Microsoft.PowerShell.Core\FileSystem
PSIsContainer     : True
Mode              : d-----
BaseName          : Item
Target            : {}
LinkType          :
Name              : Item
FullName          : D:\Item
Parent            :
Exists            : True
Root              : D:\
Extension         :
CreationTime      : 2025-01-18 4:35:18 PM
CreationTimeUtc   : 2025-01-18 9:35:18 PM
LastAccessTime    : 2025-01-18 4:35:27 PM
LastAccessTimeUtc : 2025-01-18 9:35:27 PM
LastWriteTime     : 2025-01-18 4:35:26 PM
LastWriteTimeUtc  : 2025-01-18 9:35:26 PM
Attributes        : Directory
```

Lorsque l'on récupère les "ChildItem", il est aussi possible d'ajouter le paramètre "-recurse" pour sélectionner récursivement les objets dans les sous-dossiers ou sous-clés de registre.

```
PS C:\Users\alexa> Get-ChildItem D:\Item

    Directory: D:\Item

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        2025-01-18   4:40 PM                Subdirectory
-a----        2025-01-18   4:35 PM              0 ChildItem-1.txt
-a----        2025-01-18   4:38 PM              0 ChildItem-2.txt


PS C:\Users\alexa> Get-ChildItem D:\Item -Recurse

    Directory: D:\Item

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        2025-01-18   4:40 PM                Subdirectory
-a----        2025-01-18   4:35 PM              0 ChildItem-1.txt
-a----        2025-01-18   4:38 PM              0 ChildItem-2.txt

    Directory: D:\Item\Subdirectory

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2025-01-18   4:40 PM              0 SubChildItem.txt
```

L'exemple suivant servirait à consulter le registre HKEY\_CURRENT\_USER.

```
PS C:\Users\alexa> Get-ChildItem HKCU:/Item

    Hive: HKEY_CURRENT_USER\Item

Name                           Property
----                           --------
ChildItem                      Value : Content
```

### Content

Tout comme en Linux la commande "cat" nous permet de lire le contenu d'un fichier et la redirection de sortie &gt; et &gt;&gt; nous permet d'ajouter ou modifier le contenu du fichier, le type d'objet "Content" en Powershell nous permet de poser des actions similaires. Ce sont ici les commandes Get-Content, Clear-Content, Add-Content et Set-Content qui nous intéressent.

```
# Contenu initial du fichier
PS C:\Users\alexa> Get-Content D:\Item\ChildItem-1.txt
Hello world!

# Contenu vidé du fichier
PS C:\Users\alexa> Clear-Content D:\Item\ChildItem-1.txt
PS C:\Users\alexa> Get-Content D:\Item\ChildItem-1.txt

# Contenu ajouté au fichier
PS C:\Users\alexa> Add-Content -Path D:\Item\ChildItem-1.txt -Value "Bonjour le monde!"
PS C:\Users\alexa> Get-Content D:\Item\ChildItem-1.txt
Bonjour le monde!

# Contenu du fichier remplacé
PS C:\Users\alexa> Set-Content -Path D:\Item\ChildItem-1.txt -Value "Goodbye world!"
PS C:\Users\alexa> Get-Content D:\Item\ChildItem-1.txt
Goodbye world!
```

### ACL

Les ACL ou "Access Control List" sont les permissions d'accès assignée à différents fichiers. Ces listes peuvent être consultées ou modifiées en Powershell à l'aide des commandes "Get-ACL" et "Set-ACL". Contrairement à "chmod" sous Linux nous permettant seulement de modifier les autorisations du fichier pour son propriétaire, son groupe propriétaire et les autres, la manipulation des ACL avec Powershell nous permet de gérer les ACLs avancées (ex. groupes et utilisateurs supplémentaires) tout comme "setfact" et "getfacl" sous Linux.

Les propriétés les plus intéressantes de ce type d'objet sont le propriétaire, le groupe propriétaire et la propriété "AccessToString" déterminant quel utilisateur a accès au fichier.

```
# Vérification initiale des ACL (Les propriétés non pertinentes ont été retirées de l'affichage)
PS C:\Users\alexa> Get-ACL D:\Item\ChildItem-1.txt | Select-Object -Property *

Path                    : Microsoft.PowerShell.Core\FileSystem::D:\Item\ChildItem-1.txt
Owner                   : PC\alexa
Group                   : PC\alexa
AccessToString          : BUILTIN\Administrators Allow  FullControl
                          NT AUTHORITY\SYSTEM Allow  FullControl
                          NT AUTHORITY\Authenticated Users Allow  Modify, Synchronize
                          BUILTIN\Users Allow  ReadAndExecute, Synchronize

# Ajout d'une permission
#
# Récupérer les permissions actuelles
PS C:\Users\alexa> $acl = Get-ACL D:\Item\ChildItem-1.txt
# Créer une nouvelle permission et la traduire en objet de règle
PS C:\Users\alexa> $permission = "PC\Invité","Modify","None",'None','Allow'
PS C:\Users\alexa> $rule = New-Object System.Security.AccessControl.FileSystemAccessRule $permission
# Ajouter la règle à l'objet de permissions
PS C:\Users\alexa> $acl.AddAccessRule($rule)
# Appliquer le nouvel objet de permissions au fichier
PS C:\Users\alexa> Set-ACL -Path D:\Item\ChildItem-1.txt -AclObject $acl

# Valider les nouvelles permissions, observer que "Invité" a été ajouté aux permissions (Les propriétés non pertinentes ont été retirées de l'affichage)
PS C:\Users\alexa> Get-ACL -Path D:\Item\ChildItem-1.txt | Select-Object -Property *

Path                    : Microsoft.PowerShell.Core\FileSystem::D:\Item\ChildItem-1.txt
Owner                   : PC\alexa
Group                   : PC\alexa
AccessToString          : PC\Invité Allow  Modify, Synchronize
                          BUILTIN\Administrators Allow  FullControl
                          NT AUTHORITY\SYSTEM Allow  FullControl
                          NT AUTHORITY\Authenticated Users Allow  Modify, Synchronize
                          BUILTIN\Users Allow  ReadAndExecute, Synchronize
```

Comme on peut l'observer ici, il arrive souvent que les objets deviennent rapidement complexes à créer et intégrer.

### Service

Un autre objet pertinent à savoir manipuler dans un contexte d'automatisation est un service. À l'aide des commandes Start, Stop, Restart et Set, vous pourrez manipuler les différents services en exécution sur votre machine. Il est important pour ce type d'objet de faire la différence entre le nom du service et son nom d'affichage pour bien manipuler ces objets.

```
PS C:\Users\alexa> Get-Service | Where-Object Name -like wuauserv | Select-Object -Property *

Name                : wuauserv
RequiredServices    : {rpcss}
CanPauseAndContinue : False
CanShutdown         : False
CanStop             : False
DisplayName         : Windows Update
DependentServices   : {}
MachineName         : .
ServiceName         : wuauserv
ServicesDependedOn  : {rpcss}
ServiceHandle       :
Status              : Stopped
ServiceType         : Win32OwnProcess, Win32ShareProcess
StartType           : Manual
Site                :
Container           :
```

On peut observer ici le service de Windows Update et son type de démarrage qui est manuel. Ce service démarre seulement lorsqu'une recherche ou installation de mises à jour soit déclenchée, que ce soit manuellement ou par tâche planifiée.

# Manipulation d'objets et commandes communes

### Get-Help

La commande Get-Help peut vous permettre au même titre que "man" en Linux de voir tous les paramètres qu'une commande Powershell peut accepter. À sa première exécution, l'aide sera téléchargée pour une panoplie de modules et sera ensuite disponible même hors ligne.

```
PS C:\WINDOWS\system32> Get-Help Get-Help

NOM
    Get-Help

RÉSUMÉ
    Displays information about PowerShell commands and concepts.

SYNTAXE
    Get-Help [[-Name] <System.String>] [-Category {Alias | Cmdlet | Provider | General | FAQ | Glossary | HelpFile |
    ScriptCommand | Function | Filter | ExternalScript | All | DefaultHelp | Workflow | DscResource | Class |
    Configuration}] [-Component <System.String[]>] -Detailed [-Functionality <System.String[]>] [-Path <System.String>]
    [-Role <System.String[]>] [<CommonParameters>]

    Get-Help [[-Name] <System.String>] [-Category {Alias | Cmdlet | Provider | General | FAQ | Glossary | HelpFile |
    ScriptCommand | Function | Filter | ExternalScript | All | DefaultHelp | Workflow | DscResource | Class |
    Configuration}] [-Component <System.String[]>] -Examples [-Functionality <System.String[]>] [-Path <System.String>]
    [-Role <System.String[]>] [<CommonParameters>]

    Get-Help [[-Name] <System.String>] [-Category {Alias | Cmdlet | Provider | General | FAQ | Glossary | HelpFile |
    ScriptCommand | Function | Filter | ExternalScript | All | DefaultHelp | Workflow | DscResource | Class |
    Configuration}] [-Component <System.String[]>] [-Full] [-Functionality <System.String[]>] [-Path <System.String>]
    [-Role <System.String[]>] [<CommonParameters>]

    Get-Help [[-Name] <System.String>] [-Category {Alias | Cmdlet | Provider | General | FAQ | Glossary | HelpFile |
    ScriptCommand | Function | Filter | ExternalScript | All | DefaultHelp | Workflow | DscResource | Class |
    Configuration}] [-Component <System.String[]>] [-Functionality <System.String[]>] -Online [-Path <System.String>]
    [-Role <System.String[]>] [<CommonParameters>]

    Get-Help [[-Name] <System.String>] [-Category {Alias | Cmdlet | Provider | General | FAQ | Glossary | HelpFile |
    ScriptCommand | Function | Filter | ExternalScript | All | DefaultHelp | Workflow | DscResource | Class |
    Configuration}] [-Component <System.String[]>] [-Functionality <System.String[]>] -Parameter <System.String> [-Path
    <System.String>] [-Role <System.String[]>] [<CommonParameters>]

    Get-Help [[-Name] <System.String>] [-Category {Alias | Cmdlet | Provider | General | FAQ | Glossary | HelpFile |
    ScriptCommand | Function | Filter | ExternalScript | All | DefaultHelp | Workflow | DscResource | Class |
    Configuration}] [-Component <System.String[]>] [-Functionality <System.String[]>] [-Path <System.String>] [-Role
    <System.String[]>] -ShowWindow [<CommonParameters>]
```

La commande peut aussi vous présenter des exemples d'utilisation de la commande recherchée :

```
PS C:\WINDOWS\system32> Get-Help Get-Help -examples

NOM
    Get-Help

RÉSUMÉ
    Displays information about PowerShell commands and concepts.


    --- Example 1: Display basic help information about a cmdlet ---

    Get-Help Format-Table
    Get-Help -Name Format-Table
    Format-Table -?

    `Get-Help <cmdlet-name>` is the simplest and default syntax of `Get-Help` cmdlet. You can omit the Name parameter.

    The syntax `<cmdlet-name> -?` works only for cmdlets.
```

### New-Object

La commande New-Object est généralement utilisée pour déclarer un objet et le stocker dans une variable. On peut considérer les objets en Powershell comme une instanciation de classe en programmation. Un bon exemple de ceci est présent dans [la section ACL](https://cours.alexarsenault.cf/books/powershell/page/types-dobjets-de-base#bkmrk-acl) des types d'objets.

Un autre cas d'utilisation commun de cette commande est pour créer un objet de type crédentiels pour éviter de redemander à l'utilisateur ses informations à chaque commande qui les nécessite. Quoi qu'il soit possible de les récupérer avec la commande Get-Credential, si on désire rester dans l'invite de commande ou charger ce type d'objet depuis un fichier, il devient plus simple d'utiliser la commande New-Object de la façon suivante :

```
# Lecture des informations d'authentification
$uname = Read-Host -Prompt "Nom d'utilisateur"
$pwd = Read-Host -Prompt "Mot de passe" -AsSecureString

# Création de l'objet
$credential = New-Object System.Management.Automation.PSCredential($uname,$pwd)
```

<p class="callout danger">Quoi qu'il soit possible d'inscrire directement des informations d'authentification dans le script, ces scripts sont généralement lisible par les postes de travail et voir même les utilisateurs. Ceci est fortement déconseillé!</p>

### New

D'autres commandes "New" servent à créer des objets à pour système d'exploitation tel que des utilisateurs locaux, des groupes locaux, des entrées dans le journal d'évènement, etc.

Par exemple, la commande New-User ajouterait un utilisateur local à votre système :

```
PS C:\WINDOWS\system32> Get-LocalUser

Name               Enabled Description
----               ------- -----------
Administrateur     False   Compte d’utilisateur d’administration
Bob                True
DefaultAccount     False   Compte utilisateur géré par le système.
Invité             False   Compte d’utilisateur invité
WDAGUtilityAccount False   Compte d’utilisateur géré et utilisé par le système pour les scénarios Windows Defender A...

PS C:\WINDOWS\system32> $pwd = ConvertTo-SecureString "Soleil123" -AsPlainText -Force
PS C:\WINDOWS\system32> New-LocalUser -FullName "Ta mère" -Name "rita" -Password $pwd -PasswordNeverExpires -AccountNeverExpires

Name Enabled Description
---- ------- -----------
rita True

PS C:\WINDOWS\system32> Get-LocalUser

Name               Enabled Description
----               ------- -----------
Administrateur     False   Compte d’utilisateur d’administration
Bob                True
DefaultAccount     False   Compte utilisateur géré par le système.
Invité             False   Compte d’utilisateur invité
rita               True
WDAGUtilityAccount False   Compte d’utilisateur géré et utilisé par le système pour les scénarios Windows Defender A...
```

### Add

Les commandes débutant par Add servent généralement à ajouter des entrées à des systèmes existants. Il peut s'agir de créer des fichiers, des entrées de registre, des utilisateurs dans un domaine Active Directory, des fonctionnalités Windows, des périphériques réseau, etc.

Une de ces commandes pourrait servir à ajouter un utilisateur à un groupe.

```
PS C:\WINDOWS\system32> Get-LocalGroupMember -Group "Administrateurs"

ObjectClass Name                           PrincipalSource
----------- ----                           ---------------
Utilisateur DESKTOP-D67ERFV\Administrateur Local
Utilisateur DESKTOP-D67ERFV\Bob            Local

PS C:\WINDOWS\system32> Add-LocalGroupMember -Group "Administrateurs" -Member rita
PS C:\WINDOWS\system32> Get-LocalGroupMember -Group "Administrateurs"

ObjectClass Name                           PrincipalSource
----------- ----                           ---------------
Utilisateur DESKTOP-D67ERFV\Administrateur Local
Utilisateur DESKTOP-D67ERFV\Bob            Local
Utilisateur DESKTOP-D67ERFV\rita           Local
```

### Set

Les commandes "Set" sont utilisées pour modifier ou définir un ou des paramètres liés à un objet. Ces commandes remplacent la valeur mentionnée.

Une de ces commandes pourrait servir à modifier le mot de passe d'un utilisateur.

```
PS C:\WINDOWS\system32> $pwd = ConvertTo-SecureString "123Soleil" -AsPlainText -Force
PS C:\WINDOWS\system32> Set-LocalUser -Name rita -Password $pwd
```

### Get

Les commandes "Get" servent à consulter les objets système ou les objets de scripts comme les variables. Elles sont souvent utilisées conjointement aux commandes "Select-Object", "Where-Object" et à des commandes d'action telles que les commandes "Set" par du "pipelining".

En voici quelques exemples :

```
# Afficher seulement certaines propriétés déterminées par Select-Object de certains objets correspondant à un critère déterminé par Where-Object
PS C:\Users\alexa> Get-ChildItem -Path D:\Item | Where-Object Name -like "*.txt" | Select-Object -Property FullName,LastWriteTime

FullName                LastWriteTime
--------                -------------
D:\Item\ChildItem-1.txt 2025-01-18 4:58:47 PM
D:\Item\ChildItem-2.txt 2025-01-18 4:38:23 PM

# Renommer les fichiers correspondants à ceux correspondant à la requête Where-Object à l'aide de la commande Rename-Item
PS C:\Users\alexa> Get-ChildItem -Path D:\Item | Where-Object Name -like "*.txt" | Rename-Item -NewName {$_.name -replace 'ChildItem','ObjetEnfant'}
PS C:\Users\alexa> Get-ChildItem -Path D:\Item | Where-Object Name -like "*.txt" | Select-Object -Property FullName,LastWriteTime

FullName                  LastWriteTime
--------                  -------------
D:\Item\ObjetEnfant-1.txt 2025-01-18 4:58:47 PM
D:\Item\ObjetEnfant-2.txt 2025-01-18 4:38:23 PM

# Supprimer les fichiers correspondant au filtre Where-Object
PS C:\Users\alexa> Get-ChildItem -Path D:\Item | Where-Object Name -like "*.txt" | Remove-Item
PS C:\Users\alexa> Get-ChildItem -Path D:\Item

    Directory: D:\Item

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        2025-01-18   4:40 PM                Subdirectory
```

### Where-Object

La commande Where-Object généralement utilisée avec une commande de type "Get" permet de filtrer les résultats affichés en fonction d'un ou plusieurs paramètres de l'objet ainsi que les objets résultants sur lesquels la commande "pipelinée" suivante sera appliquée. Dans l'exemple précédent, le filtre récupérait uniquement les fichiers texte donc l'action de retrait n'a pas affecté la structure de dossiers.

Dans l'exemple suivant, seulement

### Select-Object

La commande Select-Object permet de déterminer quels paramètres récupérer ou afficher d'un objet. Dans l'exemple précédent, Seulement le nom complet du fichier ainsi que la dernière date de modification étaient sélectionnés et affichés.

### Read-Host/Write-Host

Ces commandes sont généralement utilisées pour questionner l'utilisateur et stocker la réponse dans une variable et pour écrire de la journalisation dans la console.

# Session Powershell à distance

Depuis que Microsoft a ajouté le support pour SSH dans Windows, la fonctionnalité de session à distance Powershell est moins pertinente mais toujours utile si on veut éviter de déployer SSH sur un serveur.

Ceci est généralement utilisé pour accéder à des machines jointes à un domaine Active Directory.

Le support pour PSRemoting peut être activé avec la commande suivante exécutée en tant qu'administrateur :

```
Enable-PSRemoting -SkipNetworkProfileCheck -Confirm -Force
```

# Manipulation de chemins d'accès pour objets Powershell

Par défaut, une session Powershell a accès aux disques locaux (ex. C:\\), aux ruches de registres HKLM (*HKEY\_LOCAL\_MACHINE*), HKCU (*HKEY\_CURRENT\_USER*), aux partages réseaux accessibles dans le contexte d'exécution de la session ou du script, aux variables d'environnement (<span style="text-decoration: underline;">*$env:*</span>) et quelques autres ressources.

#### Get-PSDrive

La commande Get-PSDrive permet de lister l'ensemble des ressources accessibles par la session/script powershell :

```
PS C:\Users\alexa> Get-PSDrive

Name           Used (GB)     Free (GB) Provider      Root                                                                                  
----           ---------     --------- --------      ----                                                                                  
A                 486.59        530.63 FileSystem    \\10.4.20.69\arsenaultja
Alias                                  Alias
C                 877.85         52.87 FileSystem    C:\                                                                                   
Cert                                   Certificate   \
D                 183.83         39.14 FileSystem    D:\
E                1510.09        352.93 FileSystem    E:\
Env                                    Environment
Function                               Function
HKCU                                   Registry      HKEY_CURRENT_USER
HKLM                                   Registry      HKEY_LOCAL_MACHINE
M                3705.20        757.75 FileSystem    \\10.4.20.69\Media
Variable                               Variable
WSMan                                  WSMan
```

#### New-PSDrive

La commande New-PSDrive permet de gagner accès à des ressources supplémentaires, qu'il s'agisse d'un lecteur réseau, d'une ruche de registre ou d'une clé USB, la commande New-PSDrive nous permet d'ajouter un chemin pour accéder à cette ressources à partir d'un script ou d'une session Powershell.

##### Connexion d'une ruche de registre

Dans l'exemple suivant, la commande New-PSDrive nous permettra d'accéder à la ruche de registre HKEY\_USERS

```
PS C:\Users\alexa> Get-PSDrive | Where-Object Provider -like *Registry*

Name           Used (GB)     Free (GB) Provider      Root                                               CurrentLocation
----           ---------     --------- --------      ----                                               ---------------
HKCU                                   Registry      HKEY_CURRENT_USER
HKLM                                   Registry      HKEY_LOCAL_MACHINE

PS C:\Users\alexa> New-PSDrive -Name HKU -PSProvider Registry -Root HKEY_USERS

Name           Used (GB)     Free (GB) Provider      Root                                               CurrentLocation
----           ---------     --------- --------      ----                                               ---------------
HKU                                    Registry      HKEY_USERS

PS C:\Users\alexa> Get-PSDrive | Where-Object Provider -like *Registry*

Name           Used (GB)     Free (GB) Provider      Root                                               CurrentLocation
----           ---------     --------- --------      ----                                               ---------------
HKCU                                   Registry      HKEY_CURRENT_USER
HKLM                                   Registry      HKEY_LOCAL_MACHINE
HKU                                    Registry      HKEY_USERS
```

##### Ajout d'un PSDrive référant à un stockage

Tout comme un raccourci, il est possible de créer un PSDrive faisant référence à un stockage existant. Dans l'exemple suivant, nous créons un PSDrive faisant référence au dossier de l'utilisateur nommé "USRDIR". Celui-ci nous permettra d'interagir avec le contenu de C:\\Users\\\[mon utilisateur\] en poitant USRDIR:\\ plutôt que le chemin complet.

```
PS C:\Users\alexa> Get-PSDrive | Where-Object Provider -like *FileSystem*

Name           Used (GB)     Free (GB) Provider      Root                    
----           ---------     --------- --------      ----                    
A                 486.59        530.63 FileSystem    \\10.4.20.69\arsenaultja
C                 877.96         52.76 FileSystem    C:\                     
D                 183.83         39.14 FileSystem    D:\
E                1510.09        352.93 FileSystem    E:\

PS C:\Users\alexa> New-PSDrive -Name USRDIR -PSProvider FileSystem -Root C:\Users\$env:UserName

Name           Used (GB)     Free (GB) Provider      Root                                               CurrentLocation
----           ---------     --------- --------      ----                                               ---------------
USRDIR              0.00         52.98 FileSystem    C:\Users\alexa

PS C:\Users\alexa> Get-ChildItem -Path USRDIR:


    Directory: C:\Users\alexa


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        2023-12-28  10:24 PM                .android
d-----        2023-05-02   7:59 PM                .arduinoIDE
d-----        2023-12-13  11:13 AM                .cache
d-----        2025-01-25   4:26 PM                .config
d-----        2024-11-13   1:33 PM                .dbus-keyrings
d-----        2025-01-13   3:37 PM                .espressif
d-----        2024-05-17  10:25 AM                .ms-ad
d-----        2025-01-26   8:06 PM                .ssh
d-----        2025-02-05   3:56 PM                .VirtualBox
d-----        2023-06-11  12:15 PM                .vscode
d-----        2024-12-30  10:25 PM                .zenmap
d-r---        2023-11-18  10:05 PM                Contacts
d-----        2023-03-12   8:12 PM                Documents
d-r---        2025-02-08  12:14 AM                Downloads
d-r---        2023-11-18  10:05 PM                Favorites
d-----        2023-08-06   1:44 PM                GNS3
d-r---        2023-11-18  10:05 PM                Links
d-r---        2024-07-15   4:02 PM                Music
d-----        2024-09-21   2:29 PM                node_modules
dar---        2023-11-18  10:00 PM                OneDrive
d-r---        2024-09-25  10:01 PM                Saved Games
d-----        2023-03-12   8:27 PM                scoop
d-r---        2025-01-22   9:16 PM                Searches
d-----        2024-05-13   7:11 AM                Sync
d-r---        2025-01-01   5:57 PM                Videos
d-----        2025-01-26   5:12 PM                VirtualBox VMs
-a----        2024-09-22   1:24 AM    15093960192 gns3.ova
-a----        2024-08-15  10:24 AM      131138940 Templates.gns3project
```

##### Retrait d'un PSDrive

Il est aussi possible par la même logique de retirer un PSDrive.

```
PS C:\Users\alexa> Get-PSDrive | Where-Object Provider -like *FileSystem*

Name           Used (GB)     Free (GB) Provider      Root                    
----           ---------     --------- --------      ----                    
A                 486.59        530.63 FileSystem    \\10.4.20.69\arsenaultja
C                 877.67         53.05 FileSystem    C:\                     
D                 183.83         39.14 FileSystem    D:\
E                1510.09        352.93 FileSystem    E:\
F                  43.70         15.18 FileSystem    F:\
G                   0.02          0.01 FileSystem    G:\
H                3471.56        254.42 FileSystem    H:\
J                1471.71        391.29 FileSystem    J:\
M                3705.20        757.75 FileSystem    \\10.4.20.69\Media
USRDIR              0.00         53.05 FileSystem    C:\Users\alexa


PS C:\Users\alexa> Get-PSDrive | Where-Object Name -like USRDIR | Remove-PSDrive

PS C:\Users\alexa> Get-PSDrive | Where-Object Provider -like *FileSystem*

Name           Used (GB)     Free (GB) Provider      Root                    
----           ---------     --------- --------      ----                    
A                 486.59        530.63 FileSystem    \\10.4.20.69\arsenaultja
C                 877.67         53.05 FileSystem    C:\                     
D                 183.83         39.14 FileSystem    D:\
E                1510.09        352.93 FileSystem    E:\
F                  43.70         15.18 FileSystem    F:\
G                   0.02          0.01 FileSystem    G:\
H                3471.56        254.42 FileSystem    H:\
J                1471.71        391.29 FileSystem    J:\
M                3705.20        757.75 FileSystem    \\10.4.20.69\Media
```

# Administration de Windows

Par défaut, Powershell vient avec la majorité des commandes nécessaires à l'administration de Windows. À quelques exceptions près (entre autres la gestion de Windows Updates)

# Paramètres généraux et identité du système

### Récupération d'information sur le système

#### Get-ComputerInfo

La commande Get-ComputerInfo nous permet de récupérer une panoplie d'information sur l'ensemble du système, allant de la version détaillée de Windows au fureau horaire en passant par les paramètres de langue, la taille du fichier de pagination, etc.

Avec une commande comme la suivante, il est facile de prendre l'inventaire d'un parc informatique :

```
PS C:\WINDOWS\system32> Get-ComputerInfo -Property CsPrimaryOwnerName,CsName,CsDomain,OSName,OSDisplayVersion,OsLanguage,CsManufacturer,CsModel,CsProcessors,TimeZone,OsInstallDate,OsUptime

CsPrimaryOwnerName : Info
CsName             : VIDANGE-WINDOSE
CsDomain           : WORKGROUP
OsName             : Microsoft Windows 11 Professionnel
OSDisplayVersion   : 24H2
OsLanguage         : fr-CA
CsManufacturer     : VMware, Inc.
CsModel            : VMware20,1
CsProcessors       : {Intel(R) Core(TM) i7-4790K CPU @ 4.00GHz, Intel(R) Core(TM) i7-4790K CPU @ 4.00GHz}
TimeZone           : (UTC-05:00) Est (É.-U. et Canada)
OsInstallDate      : 2025-01-07 18:24:53
OsUptime           : 00:21:25.7467775
```

#### Get-Hotfix

Quoi qu'il soit plus facile de manipuler Windows Update avec le module PSWindowsUpdate, la commande Get-Hotfix nous permet de consulter les mises à jour installées.

```
PS C:\WINDOWS\system32> Get-Hotfix

Source        Description      HotFixID      InstalledBy          InstalledOn
------        -----------      --------      -----------          -----------
VIDANGE-WI... Update           KB5049622     NT AUTHORITY\SYSTEM  2025-01-19 00:00:00
VIDANGE-WI... Update           KB5048779     NT AUTHORITY\SYSTEM  2025-01-07 00:00:00
VIDANGE-WI... Security Update  KB5050009     NT AUTHORITY\SYSTEM  2025-01-19 00:00:00
VIDANGE-WI... Security Update  KB5049685     NT AUTHORITY\SYSTEM  2025-01-08 00:00:00
VIDANGE-WI... Security Update  KB5050387     NT AUTHORITY\SYSTEM  2025-01-19 00:00:00
```

#### Get-Process

La commande Get-Process permet de consulter l'ensemble des processus en exécution sur le système et d'afficher une panoplie de détails à leur sujet. La commande suivante énumèrerait tous les processus système utilisant plus de 10% de temps d'utilisation d'un coeur de processeur. Tout comme en Linux, le temps de processeur doit être divisé par le nombre de coeur pour évaluer sa charge réelle si le processus est multithread.

```
PS C:\WINDOWS\system32> Get-Process | Where-Object { $_.CPU -gt 10 }

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
    278      15     8208      26100      33,09   2900   1 conhost
   1000      46    57076      76528      32,25    900   1 dwm
    685      73   174128       3628      16,59   6900   1 msedgewebview2
    878     207   250068     153772      63,83   3144   0 MsMpEng
   1343      50   139912     172616      42,28   2692   1 powershell
   2825       0       40        120      39,59      4   0 System
    512      29    22868      36940      14,38   5364   1 vmtoolsd
```

Il est aussi possible de creuser plus en détail pour explorer un processus en particulier.

```
PS C:\WINDOWS\system32> Get-Process -IncludeUserName | Where-Object ProcessName -like powershell | Select-Object -Property UserName,MainWindowTitle,CPU,Name,Id,StartTime


UserName        : Vidange-Windose\Info
MainWindowTitle : Administrateur : Windows PowerShell
CPU             : 42,6875
Name            : powershell
Id              : 2692
StartTime       : 2025-01-19 18:09:00
```

# Utilisateurs et groupes

### Récupération d'information sur les utilisateurs et groupes locaux

#### Get-LocalUser

Une commande simple comme la suivante nous permettrait de vérifier quel utilisateur a un profil local sur une machine ainsi que sa dernière date de connexion. Ce genre d'information est souvent utilisé pour nettoyer les profils locaux d'utilisateurs Active Directory inactifs.

```
PS C:\WINDOWS\system32> Get-LocalUser | Select-Object -Property Name,Enabled,LastLogon

Name               Enabled LastLogon
----               ------- ---------
Administrateur       False
DefaultAccount       False
Info                  True 2025-01-19 19:36:18
Invité               False
WDAGUtilityAccount   False
```

Les informations récupérables par cette commande sont toutefois limitées comme le démontre la commande suivante.

```
PS C:\WINDOWS\system32> Get-LocalUser | Where-Object Name -like Info | Select-Object -Property *

AccountExpires         :
Description            :
Enabled                : True
FullName               :
PasswordChangeableDate :
PasswordExpires        :
UserMayChangePassword  : True
PasswordRequired       : False
PasswordLastSet        :
LastLogon              : 2025-01-19 19:36:18
Name                   : Info
SID                    : S-1-5-21-2716239665-1816042345-2264835360-1001
PrincipalSource        : Local
ObjectClass            : Utilisateur
```

Les dates d'expiration et de changement de mot de passe sont habituellement utilisées pour soit alerter les utilisateurs de l'expiration imminente de leur mot de passe ou encore pour effectuer des recommendations en terme de pratique de cybersécurité.

#### Get-Process

Quoi que Get-Process soit en lien avec l'administration du système plutôt que de ses utilisateurs, elle peut être utilisée pour déterminer quel utilisateur a une session active sur un poste de travail en regardant quelles instances d'un processus commun à tous tel que explorer.exe sont en exécution!

```
PS C:\WINDOWS\system32> Get-Process -IncludeUserName | Where-Object Name -like explorer* | Select-Object -Property UserName,StartTime

UserName                       StartTime
--------                       ---------
Vidange-Windose\Administrateur 2025-01-19 19:59:14
Vidange-Windose\Info           2025-01-19 18:08:00
```

#### Get-LocalGroup

La commande Get-LocalGroup nous permet d'interroger le système au sujet des groupes locaux mais tout comme Get-LocalUsers, la commande n'est pas très bavarde.

```
PS C:\WINDOWS\system32> Get-LocalGroup -Name "Administrateurs" | Select-Object -Property *

Description     : Les membres du groupe Administrateurs disposent d’un accès complet et illimité à l’ordinateur et au
                  domaine
Name            : Administrateurs
SID             : S-1-5-32-544
PrincipalSource : Local
ObjectClass     : Groupe
```

#### Get-LocalGroupMember

C'est plutôt la commande Get-LocalGroupMember qui nous permet de voir l'association entre les utilisateurs et les groupes.

```
PS C:\WINDOWS\system32> Get-LocalGroupMember -Name "Administrateurs" | Select-Object -Property *

Name                           SID                                            PrincipalSource ObjectClass
----                           ---                                            --------------- -----------
Vidange-Windose\Administrateur S-1-5-21-2716239665-1816042345-2264835360-500            Local Utilisateur
Vidange-Windose\Info           S-1-5-21-2716239665-1816042345-2264835360-1001           Local Utilisateur
```

Pour vérifier la liste des groupes auxquels un utilisateur appartient, il faut boucler dans tous les utilisateurs et tous les groupes avec un script tel que celui-ci.

```
PS C:\WINDOWS\system32> Get-LocalUser | ForEach-Object {
>>   $user = $_
>>   return [PSCustomObject]@{
>>     "User" = $user.Name
>>     "Groups" = Get-LocalGroup | Where-Object {
>>       $user.SID -in ($_ | Get-LocalGroupMember | Select-Object -ExpandProperty "SID") | Select-Object -Property "Name"
>>     }
>>   }
>> }

User               Groups
----               ------
Administrateur     {Administrateurs, Administrateurs Hyper-V, Duplicateurs, IIS_IUSRS...}
DefaultAccount     {Administrateurs, Administrateurs Hyper-V, Duplicateurs, IIS_IUSRS...}
Info               {Administrateurs, Administrateurs Hyper-V, Duplicateurs, IIS_IUSRS...}
Invité             {Administrateurs, Administrateurs Hyper-V, Duplicateurs, IIS_IUSRS...}
WDAGUtilityAccount {Administrateurs, Administrateurs Hyper-V, Duplicateurs, IIS_IUSRS...}
```

Si un utilisateur était mentionné, la première boucle ne serait pas nécessaire.

### Gestion des utilisateurs et des groupes locaux

Puisque les objets sont simples, leur création et leur gestion l'est aussi.

#### New-LocalUser

En se fiant à la commande Get-LocalUser mentionnée plus haut, on peut déterminer les paramètres à saisir pour créer un nouvel utilisateur à l'aide de la commande New-LocalUser.

Si un mot de passe doit être précisé, il doit être mentionné sous forme d'une "SecureString". Pour faciliter la structure de ces commandes, on peut stocker le mot de passe dans une variable plutôt que de faire un "one-liner" mais il est aussi possible de tout effectuer dans la même commande.

```
PS C:\WINDOWS\system32> Get-LocalUser

Name               Enabled Description
----               ------- -----------
Administrateur     True    Compte d’utilisateur d’administration
DefaultAccount     False   Compte utilisateur géré par le système.
Info               True
Invité             False   Compte d’utilisateur invité
WDAGUtilityAccount False   Compte d’utilisateur géré et utilisé par le système pour les scénarios Windows Defender Applic...

PS C:\WINDOWS\system32> $pwd = ConvertTo-SecureString -String "bobettes" -AsPlainText -Force
PS C:\WINDOWS\system32> New-LocalUser -Name "bob" -FullName "Bobby" -Password $pwd

Name Enabled Description
---- ------- -----------
bob  True

PS C:\WINDOWS\system32> Get-LocalUser

Name               Enabled Description
----               ------- -----------
Administrateur     True    Compte d’utilisateur d’administration
bob                True
DefaultAccount     False   Compte utilisateur géré par le système.
Info               True
Invité             False   Compte d’utilisateur invité
WDAGUtilityAccount False   Compte d’utilisateur géré et utilisé par le système pour les scénarios Windows Defender Applic...
```

#### Set-LocalUser

La commande "Set-LocalUser" fonctionne de la même façon que la commande "New-LocalUser" à l'exception que le paramètre "-Name" qui sera mentionné représentera le compte à modifier.

```
PS C:\WINDOWS\system32> Get-LocalUser bob

Name Enabled Description
---- ------- -----------
bob  True


PS C:\WINDOWS\system32> Set-LocalUser -Name bob -Description "Ta mère"
PS C:\WINDOWS\system32> Get-LocalUser bob

Name Enabled Description
---- ------- -----------
bob  True    Ta mère
```

#### New-LocalGroup

Encore une fois, en se fiant à Get-LocalGroup, on peut déterminer l'ensemble des paramètres qui seront à mentionner à la création d'un groupe.

```
PS C:\WINDOWS\system32> Get-LocalGroup

Name                                        Description
----                                        -----------
Administrateurs                             Les membres du groupe Administrateurs disposent d’un accès complet et illimit...
Utilisateurs                                Les utilisateurs ne peuvent pas effectuer de modifications accidentelles ou i...
Utilisateurs de gestion à distance          Les membres de ce groupe ont accès aux ressources WMI via des protocoles de g...
Utilisateurs du Bureau à distance           Les membres de ce groupe disposent des droits nécessaires pour ouvrir une ses...
Utilisateurs OpenSSH                        Les membres de ce groupe peuvent se connecter à cet ordinateur à l’aide de SSH.


PS C:\WINDOWS\system32> New-LocalGroup -Name "Yo Les Jeunes" -Description "Le club secret à Bob"

Name          Description
----          -----------
Yo Les Jeunes Le club secret à Bob


PS C:\WINDOWS\system32> Get-LocalGroup

Name                                        Description
----                                        -----------
Yo Les Jeunes                               Le club secret à Bob
Administrateurs                             Les membres du groupe Administrateurs disposent d’un accès complet et illimit...
Utilisateurs                                Les utilisateurs ne peuvent pas effectuer de modifications accidentelles ou i...
Utilisateurs de gestion à distance          Les membres de ce groupe ont accès aux ressources WMI via des protocoles de g...
Utilisateurs du Bureau à distance           Les membres de ce groupe disposent des droits nécessaires pour ouvrir une ses...
Utilisateurs OpenSSH                        Les membres de ce groupe peuvent se connecter à cet ordinateur à l’aide de SSH.
```

#### Set-LocalGroup

Tout comme pour Set-LocalUser, Set-LocalGroup utilise le paramètre "Name" pour déterminer le groupe à modifier.

```
PS C:\WINDOWS\system32> Get-LocalGroup -Name "Yo Les Jeunes"

Name          Description
----          -----------
Yo Les Jeunes Le club secret à Bob


PS C:\WINDOWS\system32> Set-LocalGroup -Name "Yo Les Jeunes" -Description "Le club plus tant secret à Bob"
PS C:\WINDOWS\system32> Get-LocalGroup -Name "Yo Les Jeunes"

Name          Description
----          -----------
Yo Les Jeunes Le club plus tant secret à Bob
```

#### Add-LocalGroupMember

Pour attribuer des utilisateurs ou des groupes à un groupe (oui, on peut imbriquer des groupes), la commande Add-LocalGroupMember est aussi simple que de mentionner le nom du membre qui peut être le nom d'un utilisateur ou d'un groupe et de mentionner le groupe auquel assigner le membre.

On assigne ici l'utilisateur "bob" à son groupe

```
PS C:\WINDOWS\system32> Get-LocalGroupMember "Yo Les Jeunes"
PS C:\WINDOWS\system32> Add-LocalGroupMember -Group "Yo Les Jeunes" -Member "bob"
PS C:\WINDOWS\system32> Get-LocalGroupMember "Yo Les Jeunes"

ObjectClass Name                PrincipalSource
----------- ----                ---------------
Utilisateur Vidange-Windose\bob Local
```

Le principe est le même pour imbriquer un groupe dans un autre

```
PS C:\WINDOWS\system32> Add-LocalGroupMember -Group "Yo Les Jeunes" -Member "Invités"
PS C:\WINDOWS\system32> Get-LocalGroupMember "Yo Les Jeunes"

ObjectClass Name                PrincipalSource
----------- ----                ---------------
Groupe      BUILTIN\Invités     Local
Utilisateur Vidange-Windose\bob Local
```

#### Remove-LocalGroupMember

Le principe ici est le même que pour l'ajout!

```
PS C:\WINDOWS\system32> Get-LocalGroupMember "Yo Les Jeunes"

ObjectClass Name                PrincipalSource
----------- ----                ---------------
Groupe      BUILTIN\Invités     Local
Utilisateur Vidange-Windose\bob Local


PS C:\WINDOWS\system32> Remove-LocalGroupMember -Group "Yo Les Jeunes" -Member "bob"
PS C:\WINDOWS\system32> Get-LocalGroupMember "Yo Les Jeunes"

ObjectClass Name            PrincipalSource
----------- ----            ---------------
Groupe      BUILTIN\Invités Local
```

# Configuration réseau

### Récupération d'information sur la configuration réseau

#### Get-NetAdapter

La commande Get-NetAdapter, tel que son nom le mentionne, nous permet de récupérer la liste des adaptateurs réseau d'un appareil ainsi que leur état.

```powershell
PS C:\WINDOWS\system32> Get-NetAdapter

Name                      InterfaceDescription                    ifIndex Status       MacAddress             LinkSpeed
----                      --------------------                    ------- ------       ----------             ---------
Ethernet0 2               vmxnet3 Ethernet Adapter                     19 Up           00-0C-29-17-0D-FE        10 Gbps
Ethernet1                 Intel(R) 82574L Gigabit Network Co...#2       4 Up           00-0C-29-17-0D-08         1 Gbps
```

Une panoplie d'informations supplémentaires se situent dans chaque objet, la plupart en lien avec l'état de connexion ainsi que le pilote de l'interface.

```powershell
PS C:\WINDOWS\system32> Get-NetAdapter | Where-Object ifIndex -like 19 | Select-Object -Property Name,MacAddress,DriverProvider,DriverDescription,DriverVersionString,Status,MediaType,FullDuplex,Speed,MtuSize,VlanID


Name                : Ethernet0 2
MacAddress          : 00-0C-29-17-0D-FE
DriverProvider      : VMware, Inc.
DriverDescription   : vmxnet3 Ethernet Adapter
DriverVersionString : 1.9.14.0
Status              : Up
MediaType           : 802.3
FullDuplex          : True
Speed               : 10000000000
MtuSize             : 1500
VlanID              :
```

#### Get-NetIPAddress

Quoique Get-NetIPConfiguration affiche aussi les adresses IP de façon plus concise, Get-NetIPAddress est beaucoup plus bavard et nous fourni des informations telles que la durée restante à un bail DHCP, l'origine de l'adresse IP active (statique/DHCP).

```powershell
PS C:\WINDOWS\system32> Get-NetIPAddress -AddressFamily IPv4 -InterfaceIndex 19 | Select-Object -Property *


PrefixOrigin             : Dhcp
SuffixOrigin             : Dhcp
Type                     : Unicast
AddressFamily            : IPv4
ifIndex                  : 19
IPv4Address              : 192.168.184.129
PrefixLength             : 24
SubnetMask               :
InterfaceAlias           : Ethernet0 2
InterfaceIndex           : 19
IPAddress                : 192.168.184.129
PreferredLifetime        : 00:17:20
SkipAsSource             : False
ValidLifetime            : 00:17:20
```

#### Get-DnsClientServerAddress

La commande Get-DnsClient nous permet de visualiser quel(s) serveur(s) DNS seront consultés par le client et par quelle interface ils seront consultés.

```powershell
PS C:\WINDOWS\system32> Get-DnsClientServerAddress -AddressFamily IPv4 | Select-Object -Property InterfaceIndex,InterfaceAlias,ServerAddresses

InterfaceIndex InterfaceAlias              ServerAddresses
-------------- --------------              ---------------
            19 Ethernet0 2                 {192.168.184.1}
             4 Ethernet1                   {192.168.118.2}
             1 Loopback Pseudo-Interface 1 {}
```

#### Get-NetFirewallRule

La commande Get-NetFirewallRule permet de consulter la liste de règles d'accès réseau que ce soit les règles entrantes ou sortantes mais seulement la liste, pas la règle en soi.

```powershell
PS C:\WINDOWS\system32> Get-NetFirewallRule | Where-Object DisplayName -like ICMP | Select-Object -Property ID,DisplayName,Group,Enabled,Profile,Direction,Action

ID                            : {91E1714E-81BF-41DC-B93A-CE63FFED09C5}
DisplayName                   : ICMP
Group                         :
Enabled                       : True
Profile                       : Any
Direction                     : Inbound
Action                        : Allow
```

#### Get-NetFirewallPortFilter / Get-NetworkFirewallServiceFilter / Get-NetworkFirewallInterfaceFilter / Get-NetworkFirewallSecurityFilter

Pour afficher le filtre associé à la règle, il faut associer la commande Get-NetFirewallRule à une de ces commandes.

```powershell
PS C:\WINDOWS\system32> Get-NetFirewallRule | Where-Object DisplayName -like ICMP | Get-NetFirewallPortFilter


Protocol      : ICMPv4
LocalPort     : Any
RemotePort    : Any
IcmpType      : Any
DynamicTarget : Any
```

# Applications et fonctionnalités

### Récupération d'information sur les applications et fonctionnalités installées et installables

#### Get-AppxPackage

La commande Get-AppxPackage vous permet de récupérer les informations sur les applications UWP (Universal Windows Platform) installées sur le système.

```
PS C:\WINDOWS\system32> Get-AppxPackage | Where-Object Name -like *Copilot | Select-Object -Property *


Name                   : Microsoft.Copilot
Publisher              : CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US
PublisherId            : 8wekyb3d8bbwe
Architecture           : X64
ResourceId             :
Version                : 1.24122.48.0
PackageFamilyName      : Microsoft.Copilot_8wekyb3d8bbwe
PackageFullName        : Microsoft.Copilot_1.24122.48.0_x64__8wekyb3d8bbwe
InstallLocation        : C:\Program Files\WindowsApps\Microsoft.Copilot_1.24122.48.0_x64__8wekyb3d8bbwe
IsFramework            : False
PackageUserInformation : {}
IsResourcePackage      : False
IsBundle               : False
IsDevelopmentMode      : False
NonRemovable           : False
Dependencies           : {Microsoft.WindowsAppRuntime.1.6_6000.373.1641.0_x64__8wekyb3d8bbwe,
                         Microsoft.VCLibs.140.00.UWPDesktop_14.0.33728.0_x64__8wekyb3d8bbwe,
                         Microsoft.VCLibs.140.00_14.0.33519.0_x64__8wekyb3d8bbwe,
                         Microsoft.Copilot_1.24122.48.0_neutral_split.language-fr_8wekyb3d8bbwe}
IsPartiallyStaged      : False
SignatureKind          : Store
Status                 : Ok
```

#### Get-AppxProvisionedPackage

La commande Get-AppxProvisionedPackage vous permet de récupérer les informations sur les applications UWP (Universal Windows Platform) qui seront déployées pour tous les nouveaux utilisateurs. Cette commande peut aussi être utilisée sur un système hors ligne pour visualiser une image d'installation ou un système qui n'est pas démarré.

```
PS C:\WINDOWS\system32> Get-AppxProvisionedPackage -Online | Where-Object DisplayName -like MSTeams | Select-Object -Property *


Version          : 24295.605.3225.8804
PackageName      : MSTeams_24295.605.3225.8804_x64__8wekyb3d8bbwe
DisplayName      : MSTeams
PublisherId      : 8wekyb3d8bbwe
MajorVersion     : 24295
MinorVersion     : 605
Build            : 3225
Revision         : 8804
Architecture     : 9
ResourceId       :
InstallLocation  : C:\Program Files\WindowsApps\MSTeams_24295.605.3225.8804_x64__8wekyb3d8bbwe\AppxManifest.xml
Regions          : AD;AE;AF;AG;AI;AL;AM;AO;AQ;AR;AS;AT;AU;AW;AX;AZ;BA;BB;BD;BE;BF;BG;BH;BI;BJ;BL;BM;BN;BO;BQ;BR;BS;BT;B
                   V;BW;BY;BZ;CA;CC;CD;CF;CG;CH;CI;CK;CL;CM;CO;CR;CU;CV;CW;CX;CY;CZ;DE;DJ;DK;DM;DO;DZ;EC;EE;EG;ER;ES;ET
                   ;FI;FJ;FK;FM;FO;FR;GA;GB;GD;GE;GF;GG;GH;GI;GL;GM;GN;GP;GQ;GR;GS;GT;GU;GW;GY;HK;HM;HN;HR;HT;HU;ID;IE;
                   IL;IM;IN;IO;IQ;IR;IS;IT;JE;JM;JO;JP;KE;KG;KH;KI;KM;KN;KP;KR;KW;KY;KZ;LA;LB;LC;LI;LK;LR;LS;LT;LU;LV;L
                   Y;MA;MC;MD;ME;MF;MG;MH;MK;ML;MM;MN;MO;MP;MQ;MR;MS;MT;MU;MV;MW;MX;MY;MZ;NA;NC;NE;NF;NG;NI;NL;NO;NP;NR
                   ;NU;NZ;OM;PA;PE;PF;PG;PH;PK;PL;PM;PN;PR;PS;PT;PW;PY;QA;RE;RO;RS;RU;RW;SA;SB;SC;SD;SE;SG;SH;SI;SJ;SK;
                   SL;SM;SN;SO;SR;SS;ST;SV;SX;SY;SZ;TC;TD;TF;TG;TH;TJ;TK;TL;TM;TN;TO;TR;TT;TV;TW;TZ;UA;UG;UM;US;UY;UZ;V
                   A;VC;VE;VG;VI;VN;VU;WF;WS;XK;YE;YT;ZA;ZM;ZW
Path             :
Online           : True
WinPath          :
SysDrivePath     :
RestartNeeded    : False
LogPath          : C:\WINDOWS\Logs\DISM\dism.log
ScratchDirectory :
LogLevel         : WarningsInfo
```

```
PS F:\> Get-AppxProvisionedPackage -Path E:\mnt | Where-Object DisplayName -like *Outlook* | Select-Object -Property *


Version          : 1.0.0.0
PackageName      : Microsoft.OutlookForWindows_1.0.0.0_neutral__8wekyb3d8bbwe
DisplayName      : Microsoft.OutlookForWindows
PublisherId      : 8wekyb3d8bbwe
MajorVersion     : 1
MinorVersion     : 0
Build            : 0
Revision         : 0
Architecture     : 11
ResourceId       :
InstallLocation  : %SYSTEMDRIVE%\Program
                   Files\WindowsApps\Microsoft.OutlookForWindows_1.0.0.0_neutral__8wekyb3d8bbwe\AppxManifest.xml
Regions          : AD;AE;AF;AG;AI;AL;AM;AO;AQ;AR;AS;AT;AU;AW;AX;AZ;BA;BB;BD;BE;BF;BG;BH;BI;BJ;BL;BM;BN;BO;BQ;BR;BS;BT;B
                   V;BW;BY;BZ;CA;CC;CD;CF;CG;CH;CI;CK;CL;CM;CO;CR;CU;CV;CW;CX;CY;CZ;DE;DJ;DK;DM;DO;DZ;EC;EE;EG;ER;ES;ET
                   ;FI;FJ;FK;FM;FO;FR;GA;GB;GD;GE;GF;GG;GH;GI;GL;GM;GN;GP;GQ;GR;GS;GT;GU;GW;GY;HK;HM;HN;HR;HT;HU;ID;IE;
                   IL;IM;IN;IO;IQ;IR;IS;IT;JE;JM;JO;JP;KE;KG;KH;KI;KM;KN;KP;KR;KW;KY;KZ;LA;LB;LC;LI;LK;LR;LS;LT;LU;LV;L
                   Y;MA;MC;MD;ME;MF;MG;MH;MK;ML;MM;MN;MO;MP;MQ;MR;MS;MT;MU;MV;MW;MX;MY;MZ;NA;NC;NE;NF;NG;NI;NL;NO;NP;NR
                   ;NU;NZ;OM;PA;PE;PF;PG;PH;PK;PL;PM;PN;PR;PS;PT;PW;PY;QA;RE;RO;RS;RU;RW;SA;SB;SC;SD;SE;SG;SH;SI;SJ;SK;
                   SL;SM;SN;SO;SR;SS;ST;SV;SX;SY;SZ;TC;TD;TF;TG;TH;TJ;TK;TL;TM;TN;TO;TR;TT;TV;TW;TZ;UA;UG;UM;US;UY;UZ;V
                   A;VC;VE;VG;VI;VN;VU;WF;WS;XK;YE;YT;ZA;ZM;ZW
Path             : E:\mnt
Online           : False
WinPath          :
SysDrivePath     :
RestartNeeded    : False
LogPath          : C:\WINDOWS\Logs\DISM\dism.log
ScratchDirectory :
LogLevel         : WarningsInfo
```

#### Get-WindowsCapability

La commande Get-WindowsCapability nous permet de récupérer les informations sur les fonctionnalités avancées/optionnelles de Windows telles que les outils d'administration de serveurs à distance, les services s'il s'agit d'un serveur windows où les packs de languages installés et disponibles. Cette commande peut aussi être utilisée sur un système hors ligne pour visualiser une image d'installation ou un système qui n'est pas démarré.

```
PS C:\WINDOWS\system32> Get-WindowsCapability -Online | Where-Object Name -like OpenSSH* | Select-Object -Property *


Name             : OpenSSH.Client~~~~0.0.1.0
State            : Installed
Path             :
Online           : True
WinPath          :
SysDrivePath     :
RestartNeeded    : False
LogPath          : C:\WINDOWS\Logs\DISM\dism.log
ScratchDirectory :
LogLevel         : WarningsInfo

Name             : OpenSSH.Server~~~~0.0.1.0
State            : NotPresent
Path             :
Online           : True
WinPath          :
SysDrivePath     :
RestartNeeded    : False
LogPath          : C:\WINDOWS\Logs\DISM\dism.log
ScratchDirectory :
LogLevel         : WarningsInfo
```

```
PS F:\> Get-WindowsCapability -Path E:\mnt | Where-Object State -like Installed | Select-Object -Property Name

Name
----
App.StepsRecorder~~~~0.0.1.0
Browser.InternetExplorer~~~~0.0.11.0
DirectX.Configuration.Database~~~~0.0.1.0
Edge.Webview2.Platform~~~~
Hello.Face.20134~~~~0.0.1.0
Language.Basic~~~en-US~0.0.1.0
Language.Basic~~~fr-CA~0.0.1.0
Language.Basic~~~fr-FR~0.0.1.0
Language.Handwriting~~~fr-FR~0.0.1.0
Language.OCR~~~en-US~0.0.1.0
Language.OCR~~~fr-CA~0.0.1.0
Language.Speech~~~fr-CA~0.0.1.0
Language.TextToSpeech~~~fr-CA~0.0.1.0
MathRecognizer~~~~0.0.1.0
Media.WindowsMediaPlayer~~~~0.0.12.0
[...]
OneCoreUAP.OneSync~~~~0.0.1.0
OpenSSH.Client~~~~0.0.1.0
VBSCRIPT~~~~
Windows.Client.ProjFS~~~~
Windows.DirectoryServices.ADAM.Client.Content~~~~
Windows.HyperV.OptionalFeature.VirtualMachinePlatform.Client.Disabled~~~~
Windows.Kernel.LA57~~~~0.0.1.0
Windows.SimpleTCP.Content~~~~
Windows.Telnet.Client~~~~
Windows.TerminalServices.AppServerClient~~~~
Windows.TFTP.Client~~~~
Windows.WinOcr~~~~
Windows.WorkFolders.Client~~~~
WMIC~~~~
```

### Retrait d'applications et fonctionnalités

#### Remove-AppxPackage

La commande Remove-AppxPackage peut être utilisée par elle même en mentionnant le nom du package ou conjointement à Get-AppxPackage pour désinstaller un package installé.

```
PS C:\WINDOWS\system32> Get-AppxPackage | Where-Object Name -like *Copilot | Remove-AppxPackage
PS C:\WINDOWS\system32> Get-AppxPackage | Where-Object Name -like *Copilot
PS C:\WINDOWS\system32>
```

#### Remove-AppxProvisionedPackage

La commande Remove-AppxProvisionedPackage retire le(s) package(s) de la liste de ceux qui seront installé pour les nouveaux utilisateurs.

```
PS F:\> Get-AppxProvisionedPackage -Path E:\mnt | Where-Object DisplayName -like *Outlook* | Remove-AppxProvisionedPackage


Path          : E:\mnt
Online        : False
RestartNeeded : False



PS F:\> Get-AppxProvisionedPackage -Path E:\mnt | Where-Object DisplayName -like *Outlook*
PS F:\>
```

Ces deux commandes pourraient être utilisées en conjonction avec un tableau pour désinstaller une liste d'application dans un script de préparation de nouveau système.

```
$list = @()
$list += '*Teams'
$list += '*BingSearch'
$list += '*BingNews'
$list += '*MicrosoftOfficeHub*'
$list += '*Game*'
$list += '*Gaming*'
$list += '*Solitaire*'
$list += '*Help*'
$list += '*Hub'
$list += '*QuickAssist*'

Foreach ($i in $list) {
	Get-AppxPackage | Where-Object Name -like $i | Remove-AppxPackage -AllUsers
}
```

### Ajout d'applications et fonctionnalités

Quoi qu'il soit parfois difficile de trouver les packages .msix et .msixbundle, le site suivant permet de générer des liens de téléchargement pour les fichiers d'installation des applications du Microsoft Store.

[https://store.rg-adguard.net/](https://store.rg-adguard.net/)

#### Add-AppxProvisionedPackage

Cette commande est utilisée pour déployer une application à tous les utilisateurs d'un système ou pour injecter une application dans une image d'installation de Windows.

Les commandes suivantes ajouteraient Microsoft PC Manager et sa dépendance à une image d'installation de Windows décapsulée avec DISM.

```
PS F:\> Add-AppxProvisionedPackage -PackagePath F:\Microsoft.WindowsAppRuntime.1.5_5001.373.1736.0_x64__8wekyb3d8bbwe.Msix -Path E:\mnt -SkipLicense


Path          : E:\mnt
Online        : False
RestartNeeded : False



PS F:\> Add-AppxProvisionedPackage -PackagePath F:\Microsoft.MicrosoftPCManager_3.14.18.0_neutral_~_8wekyb3d8bbwe.Msixbundle -Path E:\mnt -SkipLicense


Path          : E:\mnt
Online        : False
RestartNeeded : False

PS F:\> Get-AppxProvisionedPackage -Path E:\mnt | Where-Object DisplayName -like *Manager*


DisplayName  : Microsoft.MicrosoftPCManager
Version      : 3.14.18.0
Architecture : neutral
ResourceId   : ~
PackageName  : Microsoft.MicrosoftPCManager_3.14.18.0_neutral_~_8wekyb3d8bbwe
Regions      :
```

Les commandes suivantes installeraient Microsoft PC Manager et sa dépendance pour tous les utilisateurs d'un système sur lequel les commandes seraient exécutées.

```
PS C:\Users\Info\Desktop> Add-AppxProvisionedPackage -PackagePath .\Microsoft.WindowsAppRuntime.1.5_5001.373.1736.0_x64__8wekyb3d8bbwe.Msix -Online -SkipLicense


Path          :
Online        : True
RestartNeeded : False



PS C:\Users\Info\Desktop> Add-AppxProvisionedPackage -PackagePath .\Microsoft.MicrosoftPCManager_3.14.18.0_neutral_~_8wekyb3d8bbwe.Msixbundle -Online -SkipLicense


Path          :
Online        : True
RestartNeeded : False

PS C:\Users\Info\Desktop> Get-AppxProvisionedPackage -Online | Where-Object DisplayName -like *Manager*


DisplayName  : Microsoft.MicrosoftPCManager
Version      : 3.14.18.0
Architecture : neutral
ResourceId   : ~
PackageName  : Microsoft.MicrosoftPCManager_3.14.18.0_neutral_~_8wekyb3d8bbwe
Regions      :
```

[![image.png](https://cours.alexarsenault.cf/uploads/images/gallery/2025-01/scaled-1680-/jJ5image.png)](https://cours.alexarsenault.cf/uploads/images/gallery/2025-01/jJ5image.png)

#### Add-AppxPackage

La commande suivante installerait Spotify et ses dépendances pour l'utilisateur exécutant la commande.

```
PS C:\Users\Info\desktop> Get-Item -Path .\Spotify\* | Add-AppxPackage
PS C:\Users\Info\desktop> Get-AppxPackage | Where-Object Name -like *Spotify* | Select-Object -Property *


Name                   : SpotifyAB.SpotifyMusic
Publisher              : CN=453637B3-4E12-4CDF-B0D3-2A3C863BF6EF
PublisherId            : zpdnekdrzrea0
Architecture           : X64
ResourceId             :
Version                : 1.255.235.0
PackageFamilyName      : SpotifyAB.SpotifyMusic_zpdnekdrzrea0
PackageFullName        : SpotifyAB.SpotifyMusic_1.255.235.0_x64__zpdnekdrzrea0
InstallLocation        : C:\Program Files\WindowsApps\SpotifyAB.SpotifyMusic_1.255.235.0_x64__zpdnekdrzrea0
IsFramework            : False
PackageUserInformation : {}
IsResourcePackage      : False
IsBundle               : False
IsDevelopmentMode      : False
NonRemovable           : False
Dependencies           : {Microsoft.WindowsAppRuntime.1.2_2000.802.31.0_x64__8wekyb3d8bbwe,
                         Microsoft.VCLibs.140.00_14.0.33519.0_x64__8wekyb3d8bbwe,
                         Microsoft.VCLibs.140.00.UWPDesktop_14.0.33728.0_x64__8wekyb3d8bbwe}
IsPartiallyStaged      : False
SignatureKind          : Store
Status                 : Ok
```

[![image.png](https://cours.alexarsenault.cf/uploads/images/gallery/2025-01/scaled-1680-/QWRimage.png)](https://cours.alexarsenault.cf/uploads/images/gallery/2025-01/QWRimage.png)

# Services



# Fichiers et systèmes de fichiers



# Registre Windows

Powershell traite les entrées de registre au même titre que les fichiers et peuvent donc être récupérés, créés et modifiés avec les mêmes commandes que les fichiers. Plutôt que de viser une lettre de lecteur et un répertoire tel que C:\\, la "ruche" ou le registre sera visé avec un identifiant comme HKLM:\\

### Accès aux ruches du registre Windows

Par défaut, seulement HKCU (*HKEY\_CURRENT\_USER*) et HKLM (*HKEY\_LOCAL\_MACHINE*) sont accessibles. Puisque le registre est traité au même titre qu'un lecteur, il est possible d'observer ce qui est accessible dans une session ou un script powershell ainsi que de gagner accès à d'autres ruches en manipulant les PSDrives.

#### Get-PSDrive

Pour observer la liste des ruches de registres accessibles, il est possible d'utiliser la commande "Get-PSDrive" et de filtrer les résultats par "Provider" (type d'objet à manipuler).

```
PS C:\WINDOWS\system32> Get-PSDrive | Where-Object Provider -like *Registry*

Name           Used (GB)     Free (GB) Provider      Root                                               CurrentLocation
----           ---------     --------- --------      ----                                               ---------------
HKCU                                   Registry      HKEY_CURRENT_USER
HKLM                                   Registry      HKEY_LOCAL_MACHINE
```

#### New-PSDrive

Il est possible de gagner accès aux autres ruches telles que HKCR (*HKEY\_CLASSES\_ROOT*) et HKU (*HKEY\_USERS*) en les ajoutant comme PSDrive.

```
PS C:\WINDOWS\system32> New-PSDrive -PSProvider Registry -Name HKU -Root HKEY_USERS

Name           Used (GB)     Free (GB) Provider      Root                                               CurrentLocation
----           ---------     --------- --------      ----                                               ---------------
HKU                                    Registry      HKEY_USERS

PS C:\WINDOWS\system32> New-PSDrive -PSProvider Registry -Name HKCR -Root HKEY_CLASSES_ROOT

Name           Used (GB)     Free (GB) Provider      Root                                               CurrentLocation
----           ---------     --------- --------      ----                                               ---------------
HKCR                                   Registry      HKEY_CLASSES_ROOT

PS C:\WINDOWS\system32> Get-PSDrive | Where-Object Provider -like *Registry*

Name           Used (GB)     Free (GB) Provider      Root                                               CurrentLocation
----           ---------     --------- --------      ----                                               ---------------
HKCR                                   Registry      HKEY_CLASSES_ROOT
HKCU                                   Registry      HKEY_CURRENT_USER
HKLM                                   Registry      HKEY_LOCAL_MACHINE
HKU                                    Registry      HKEY_USERS
```

### Récupération d'information du registre

#### Get-ItemProperty

La commande Get-ItemProperty est utilisée pour récupérer l'information sur une valeur unique dans une clé. L'exemple suivant afficherait l'état du paramètre masquant les extensions de fichier connus dans l'explorateur Windows.

```
PS C:\Users\alexa> Get-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" -Name "HideFileExt"

HideFileExt  : 0
PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer
               \Advanced
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer
PSChildName  : Advanced
PSDrive      : HKCU
PSProvider   : Microsoft.PowerShell.Core\Registry
```

Sa valeur étant 0, les extensions de fichiers connues sont donc affichées dans l'explorateur de fichiers.

Elle peut être utilisée sur une clé sans mentionner de valeur pour afficher toutes les valeurs assignées à une clé. L'exemple suivant afficherait l'ensemble des applications qui démarreront à la connexion de l'utilisateur concerné.

```
PS C:\Users\alexa> Get-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" | Select-Object -Property *

Discord                  : "C:\Users\alexa\AppData\Local\Discord\Update.exe" --processStart Discord.exe
Steam                    : "C:\Program Files (x86)\Steam\steam.exe" -silent
electron.app.Base Camp™  : C:\Program Files (x86)\Mountain Base Camp\Base Camp.exe --process-start-args --hidden
com.squirrel.Teams.Teams : C:\Users\alexa\AppData\Local\Microsoft\Teams\Update.exe --processStart "Teams.exe"
                           --process-start-args "--system-initiated"
EADM                     : "C:\Program Files\Electronic Arts\EA Desktop\EA Desktop\EALauncher.exe" -silent
EpicGamesLauncher        : "C:\Program Files (x86)\Epic Games\Launcher\Portal\Binaries\Win64\EpicGamesLauncher.exe"
                           -silent -launchcontext=boot
HASS.Agent               : C:\Users\alexa\AppData\Roaming\LAB02 Research\HASS.Agent\HASS.Agent.exe
PSPath                   : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVers
                           ion\Run
PSParentPath             : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVers
                           ion
PSChildName              : Run
PSDrive                  : HKCU
PSProvider               : Microsoft.PowerShell.Core\Registry
```

#### Get-ChildItem

La commande Get-ChildItem permet de récupérer tous les éléments contenus dans une clé de registre et peut être exécutée récursivement pour aussi afficher les sous-clés. L'exemple suivant afficherait toutes les clés contenant les paramètres associés au logiciel 7-Zip ainsi que les valeurs associées à ces clés.

```
PS C:\Users\alexa> Get-ChildItem -Path "HKCU:\Software\7-Zip" -Recurse

    Hive: HKEY_CURRENT_USER\Software\7-Zip

Name                           Property
----                           --------
FM                             FolderShortcuts      : {}
                               FolderHistory        : {73, 0, 58, 0...}
                               PanelPath0           : I:\Documents\420-153-AT - Conception\A2024\TP2_A24\
                               FlatViewArc0         : 0
                               PanelPath1           :
                               FlatViewArc1         : 0
                               ListMode             : 771
                               Position             : {162, 1, 0, 0...}
                               Panels               : {1, 0, 0, 0...}
                               ShowDots             : 1
                               ShowRealFileIcons    : 1
                               FullRow              : 1
                               ShowGrid             : 0
                               SingleClick          : 0
                               AlternativeSelection : 0
                               ShowSystemMenu       : 1
                               CopyHistory          : {70, 0, 58, 0...}

    Hive: HKEY_CURRENT_USER\Software\7-Zip\FM

Name                           Property
----                           --------
Columns                        RootFolder     : {1, 0, 0, 0...}
                               7-Zip.zip      : {1, 0, 0, 0...}
                               FSFolder       : {1, 0, 0, 0...}
                               7-Zip.Rar5     : {1, 0, 0, 0...}
                               7-Zip.Rar      : {1, 0, 0, 0...}
                               7-Zip.gzip     : {1, 0, 0, 0...}
                               7-Zip.Compound : {1, 0, 0, 0...}
                               7-Zip.7z       : {1, 0, 0, 0...}
                               7-Zip.tar      : {1, 0, 0, 0...}
                               7-Zip.Nsis     : {1, 0, 0, 0...}

    Hive: HKEY_CURRENT_USER\Software\7-Zip

Name                           Property
----                           --------
Options                        MenuIcons    : 1
                               CascadedMenu : 1
                               ContextMenu  : 2147487782
```

### Création et définition de valeurs dans le registre

#### New-ItemProperty

La commande Set-ItemProperty permet de définir une valeur associée à une clé. La commande suivante activerait l'affichage avancé à l'écran de connexion d'un utilisateur (chaque étape plutôt que seulement "Veuillez patienter").

```
New-ItemProperty -Path "HKLM:\Software\Microsoft\Windows\CurrentVersion\Policies\System" -Name "VerboseStatus" -Value 1
```

#### New-Item

La commande New-Item permet la création de nouvelles clés. Accompagné du paramètre -Force, la commande créera l'ensemble de la hiérarchie jusqu'à l'item créé mais si la clé était déjà existante, elle sera vidée. Il est donc généralement préférable de s'assurer de son existance avant de tenter sa création. Ceci peut facilement être réalisé à l'aide d'un "try catch" comme suit. Dans cet exemple, \_Lab n'existe pas.

```
PS C:\Users\alexa> try {
>>     Get-Item -Path "HKCU:\_Lab" -ErrorAction Stop
>> }
>> catch {
>>     New-Item -Path "HKCU:\_Lab" -Force
>> }


    Hive: HKEY_CURRENT_USER


Name                           Property
----                           --------
_Lab
```

Dans cet exemple, \_Lab existe et contient la valeur "Soleil123" nommée "Password". L'item n'est par conséquent pas remplacé.

```
PS C:\Users\alexa> try {
>>     Get-Item -Path "HKCU:\_Lab" -ErrorAction Stop
>> }
>> catch {
>>     New-Item -Path "HKCU:\_Lab" -Force
>> }


    Hive: HKEY_CURRENT_USER


Name                           Property
----                           --------
_Lab                           Password : Soleil123
```

#### Set-ItemProperty

La commande Set-ItemProperty permet de modifier une valeur assignée à une clé. Il est possible d'exécuter ceci conjointement à une vérification de l'existance de la clé pour s'assurer de la réussite de l'exécution de la commande comme suit. Dans cet exemple, le bouton de Windows Copilot sera retirée de la barre des tâches de l'utilisateur concerné.

```
$registryPath = "HKCU:\Software\Policies\Microsoft\Windows\WindowsCopilot" 	
$registryValueName = "ShowCopilotButton"
$registryValueData = 0
try {
    Get-Item -Path $registryPath -ErrorAction Stop
}
catch {
    New-Item -Path $registryPath -Force
}
Set-ItemProperty -Path $registryPath -Name $registryValueName -Value $registryValueData
```

# Journal d'évènements

# Modules supplémentaires

Il est possible d'ajouter des fonctionnalités à Powershell à l'aide de modules supplémentaires. Certains modules sont inclus avec des fonctionnalités avancées de Windows, d'autres sont disponibles sur Le PowerShell Gallery (https://www.powershellgallery.com/)

# Mises à jour Windows

### Installation

Le module "PSWindowsUpdate" permet de facilement gérer, automatiser et déclencher à distance des tâches en lien avec les mises à jour Windows. L'installation du module se déroule comme suit et doit être effectuée dans un terminal Powershell exécuté en tant qu'administrateur.

```
PS C:\WINDOWS\system32> Install-Module PSWindowsUpdate 

Le fournisseur NuGet est requis pour continuer
PowerShellGet requiert le fournisseur NuGet, version 2.8.5.201 ou ultérieure, pour interagir avec les référentiels
NuGet. Le fournisseur NuGet doit être disponible dans « C:\Program Files\PackageManagement\ProviderAssemblies » ou «
C:\Users\Info\AppData\Local\PackageManagement\ProviderAssemblies ». Vous pouvez également installer le fournisseur
NuGet en exécutant la commande « Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force ». Voulez-vous
que PowerShellGet installe et importe le fournisseur NuGet maintenant ?
[O] Oui  [N] Non  [S] Suspendre  [?] Aide (la valeur par défaut est « O ») : O

Référentiel non approuvé
Vous installez les modules à partir d'un référentiel non approuvé. Si vous approuvez ce référentiel, modifiez sa valeur
 InstallationPolicy en exécutant l'applet de commande Set-PSRepository. Voulez-vous vraiment installer les modules à
partir de PSGallery ?
[O] Oui  [T] Oui pour tout  [N] Non  [U] Non pour tout  [S] Suspendre  [?] Aide (la valeur par défaut est « N ») : T

PS C:\WINDOWS\system32>
```

Une fois installé, le module peut être importé et sera prêt à l'utilisation à l'aide de la commande suivante :

```
#Permettre l'exécution de scripts
Set-ExecutionPolicy Unrestricted
#Importation du module installé
Import-Module PSWindowsUpdate
```

### Utilisation

Toutes les commandes supportent l'argument "-ComputerName" pour exécuter ces actions sur un ordinateur distant. Si l'argument n'est pas mentionné, les actions seront entreprise sur la machine exécutant la commande.

#### Get-WindowsUpdate

La commande Get-WindowsUpdate permet de rechercher des mises à jour Windows disponibles de façon granulaire ou globale. Sans paramètres, elle cherchera toutes les mises à jour disponible. Dans le cas suivante, une mise à jour de pilote d'affichage est disponible.

```
PS C:\WINDOWS\system32> Get-WindowsUpdate -Verbose
COMMENTAIRES : VIDANGE-WINDOSE (2025-01-19 15:45:21): Connecting to Windows Update server. Please wait...
COMMENTAIRES : Found [1] Updates in pre search criteria                                                                      COMMENTAIRES : Found [1] Updates in post search criteria

ComputerName Status     KB          Size Title
------------ ------     --          ---- -----
VIDANGE-W... -------                24MB Broadcom Inc. - Display - 9.17.8.9
```

Il est ensuite possible de procéder au téléchargement sans installer la mise à jour si on mentionne le paramètre -Download

```
PS C:\WINDOWS\system32> Get-WindowsUpdate -Download -Verbose
COMMENTAIRES : VIDANGE-WINDOSE (2025-01-19 15:51:08): Connecting to Windows Update server. Please wait...
COMMENTAIRES : Found [1] Updates in pre search criteria
COMMENTAIRES : Found [1] Updates in post search criteria

Confirmer
Êtes-vous sûr de vouloir effectuer cette action ?
Opération « (2025-01-19 15:51:15) Broadcom Inc. - Display - 9.17.8.9[24MB] » en cours sur la cible « VIDANGE-WINDOSE ».
[O] Oui  [T] Oui pour tout  [N] Non  [U] Non pour tout  [S] Suspendre  [?] Aide (la valeur par défaut est « O ») : O

X ComputerName Result     KB          Size Title
- ------------ ------     --          ---- -----
1 VIDANGE-W... Accepted               24MB Broadcom Inc. - Display - 9.17.8.9
COMMENTAIRES : Accepted [1] Updates ready to Download
2 VIDANGE-W... Downloaded             24MB Broadcom Inc. - Display - 9.17.8.9
COMMENTAIRES : Downloaded [1] Updates ready to Install
```

On peut ensuite observer que le statut de la mise à jour a changé et qu'elle indique maintenant "D" pour indiquer qu'elle est téléchargée.

```
PS C:\WINDOWS\system32> Get-WindowsUpdate -Verbose
COMMENTAIRES : VIDANGE-WINDOSE (2025-01-19 15:51:53): Connecting to Windows Update server. Please wait...
COMMENTAIRES : Found [1] Updates in pre search criteria
COMMENTAIRES : Found [1] Updates in post search criteria

ComputerName Status     KB          Size Title
------------ ------     --          ---- -----
VIDANGE-W... -D-----                24MB Broadcom Inc. - Display - 9.17.8.9
```

Il est maintenant possible de déclencher l'installation de la mise à jour avec le paramètre -Install

```
PS C:\WINDOWS\system32> Get-WindowsUpdate -Install -Verbose
COMMENTAIRES : VIDANGE-WINDOSE (2025-01-19 15:55:03): Connecting to Windows Update server. Please wait...
COMMENTAIRES : Found [1] Updates in pre search criteria
COMMENTAIRES : Found [1] Updates in post search criteria

Confirmer
Êtes-vous sûr de vouloir effectuer cette action ?
Opération « (2025-01-19 15:55:09) Broadcom Inc. - Display - 9.17.8.9[24MB] » en cours sur la cible « VIDANGE-WINDOSE ».
[O] Oui  [T] Oui pour tout  [N] Non  [U] Non pour tout  [S] Suspendre  [?] Aide (la valeur par défaut est « O ») : T

X ComputerName Result     KB          Size Title
- ------------ ------     --          ---- -----
1 VIDANGE-W... Accepted               24MB Broadcom Inc. - Display - 9.17.8.9
COMMENTAIRES : Accepted [1] Updates ready to Download
2 VIDANGE-W... Downloaded             24MB Broadcom Inc. - Display - 9.17.8.9
COMMENTAIRES : Downloaded [1] Updates ready to Install
3 VIDANGE-W... Installed              24MB Broadcom Inc. - Display - 9.17.8.9
COMMENTAIRES : Installed [1] Updates
```

#### Get-WUHistory

La commande Get-WUHistory permet de consulter l'historique des mises à jour Windows installées. Le paramètre -MaxDate permet d'établir une date limite à partir de laquelle les résultats affichés s'arrêteront.

```
PS C:\WINDOWS\system32> Get-WUHistory

ComputerName Operationname  Result     Date                Title
------------ -------------  ------     ----                -----
VIDANGE-W... Installation   Succeeded  2025-01-19 15:55:22 Broadcom Inc. - Display - 9.17.8.9
VIDANGE-W... Installation   Succeeded  2025-01-19 15:37:32 Mise à jour de la sélection disjointe pour Microsoft Defender ...
VIDANGE-W... Installation   Succeeded  2025-01-19 13:40:24 2025-01 Mise à jour cumulative pour Windows 11 Version 24H2 po...
VIDANGE-W... Installation   Succeeded  2025-01-19 13:24:43 2025-01 Mise à jour cumulative pour .NET Framework 3.5 pour et...
VIDANGE-W... Installation   Succeeded  2025-01-19 13:23:14 Outil de suppression de logiciels malveillants Windows x64 - v...
VIDANGE-W... Installation   Succeeded  2025-01-19 13:15:38 Mise à jour de la sélection disjointe pour Microsoft Defender ...
VIDANGE-W... Installation   Succeeded  2025-01-07 20:10:45 Mise à jour pour Microsoft Defender Antivirus plateforme anti-...
VIDANGE-W... Installation   Succeeded  2025-01-07 19:20:46 2024-12 Mise à jour cumulative pour Windows 11 Version 24H2 po...
VIDANGE-W... Installation   Succeeded  2025-01-07 18:58:18 2024-11 Mise à jour cumulative pour .NET Framework 3.5 pour et...
VIDANGE-W... Installation   Succeeded  2025-01-07 18:55:23 Mise à jour de la sélection disjointe pour Microsoft Defender ...
VIDANGE-W... Installation   Succeeded  2025-01-07 18:54:32 Outil de suppression de logiciels malveillants Windows x64 - v...
VIDANGE-W... Installation   Succeeded  2025-01-07 18:51:58 Mise à jour pour Windows Security platform - KB5007651 (versio...
VIDANGE-W... Installation   Succeeded  2025-01-07 18:32:59 Broadcom Inc. - System - 9.8.18.1
VIDANGE-W... Installation   Succeeded  2025-01-07 18:27:25 2024-11 Mise à jour pour Windows 11 Version 24H2 sur systèmes ...
```

#### Remove-WindowsUpdate

Vous avez effectué une mise à jour et quelque chose dans votre système a cassé? Pas de panique, vous pouvez désinstaller une mise à jour avec la commande "Remove-WindowsUpdate"!

Dans l'exemple suivant, nous désinstallerons une mise à jour pour la plateforme .NET 3.5 :

```
PS C:\WINDOWS\system32> Get-WindowsUpdate -IsInstalled

ComputerName Status     KB          Size Title
------------ ------     --          ---- -----
VIDANGE-W... -DI----    KB4052623    5MB Mise à jour pour la plateforme de logiciels anti-programme malveillant de W...
VIDANGE-W... -DI----    KB4052623   13MB Mise à jour pour Microsoft Defender Antivirus plateforme anti-programme mal...
VIDANGE-W... -DI----    KB5007651   38MB Mise à jour pour Windows Security platform - KB5007651 (version 10.0.27703....
VIDANGE-W... -DI----    KB890830    76MB Outil de suppression de logiciels malveillants Windows x64 - v5.131 (KB890830)
VIDANGE-W... -DI----    KB2267602    1GB Mise à jour de la sélection disjointe pour Microsoft Defender Antivirus – 2...
VIDANGE-W... -DI----    KB5049622  142MB 2025-01 Mise à jour cumulative pour .NET Framework 3.5 pour et 4.8.1 pour W...
VIDANGE-W... -DI----    KB5050009   86GB 2025-01 Mise à jour cumulative pour Windows 11 Version 24H2 pour les systèm...

PS C:\WINDOWS\system32> Remove-WindowsUpdate -KBArticleID KB5049622

Confirmer
Êtes-vous sûr de vouloir effectuer cette action ?
Opération « (2025-01-19 16:23:30) Remove (WUApi) Windows Update: 2025-01 Mise à jour cumulative pour .NET Framework 3.5
 pour et 4.8.1 pour Windows 11, version 24H2 pour les systèmes x64 (KB5049622) » en cours sur la cible
« VIDANGE-WINDOSE ».
[O] Oui  [T] Oui pour tout  [N] Non  [U] Non pour tout  [S] Suspendre  [?] Aide (la valeur par défaut est « O ») : O
```

#### Hide-WindowsUpdate

La commande Hide-WindowsUpdate permet de masquer certaines mises à jour pour éviter leur installation.

Dans l'exemple suivant, nous masquerons une mise à jour de Windows Defender :

```
PS C:\WINDOWS\system32> Hide-WindowsUpdate -KBArticleID KB2267602

Confirmer
Êtes-vous sûr de vouloir effectuer cette action ?
Opération « (2025-01-19 16:21:07) Hide Mise à jour de la sélection disjointe pour Microsoft Defender Antivirus –
2267602 Ko (version 1.421.1442.0) – Canal actuel (large)[1GB] » en cours sur la cible « VIDANGE-WINDOSE ».
[O] Oui  [T] Oui pour tout  [N] Non  [U] Non pour tout  [S] Suspendre  [?] Aide (la valeur par défaut est « O ») : T

ComputerName Status     KB          Size Title
------------ ------     --          ---- -----
VIDANGE-W... ---H--     KB2267602    1GB Mise à jour de la sélection disjointe pour Microsoft Defender Antivirus – 2...
```

Le statut "H" indique que la mise à jour est masquée et ne sera pas installée.

# Winget

Winget est un module permettant l'installation automatisée d'applications disponibles dans le répertoire logiciel [https://winget.run/](https://winget.run/). Il est à noter que la majorité des applications seront installées dans le %AppData% de l'utilisateur installant un logiciel. Ces logiciels sont donc unique à chaque utilisateur impliquant que si 20 utilisateurs du poste de travail désirent la même application, elle sera installée en 20 copies sur le poste. On réfère à ce type d'installation à "per-user" ou par utilisateur. La majorité des gestionnaires de logiciels du genre pour Windows fonctionnent de cette façon, l'avantage étant qu'un utilisateur n'a pas besoin de droits d'administrateur pour installer ces logiciels.

Cette méthode peut être une belle façon d'automatiser le déploiement logiciel sur un ordinateur personnel à un seul utilisateur puisqu'une simple tâche planifiée exécutant "winget update" et "winget upgrade --all" met à jour tous les logiciels pour l'utilisateur.

Il peut être installé en tant que module Powershell de la façon suivante (en tant qu'administrateur) :

```
PS C:\WINDOWS\system32> Install-Module Microsoft.WinGet.Client                                                          
Le fournisseur NuGet est requis pour continuer
PowerShellGet requiert le fournisseur NuGet, version 2.8.5.201 ou ultérieure, pour interagir avec les référentiels
NuGet. Le fournisseur NuGet doit être disponible dans « C:\Program Files\PackageManagement\ProviderAssemblies » ou «
C:\Users\Info\AppData\Local\PackageManagement\ProviderAssemblies ». Vous pouvez également installer le fournisseur
NuGet en exécutant la commande « Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force ». Voulez-vous
que PowerShellGet installe et importe le fournisseur NuGet maintenant ?
[O] Oui  [N] Non  [S] Suspendre  [?] Aide (la valeur par défaut est « O ») : O

Référentiel non approuvé
Vous installez les modules à partir d'un référentiel non approuvé. Si vous approuvez ce référentiel, modifiez sa valeur
 InstallationPolicy en exécutant l'applet de commande Set-PSRepository. Voulez-vous vraiment installer les modules à
partir de PSGallery ?
[O] Oui  [T] Oui pour tout  [N] Non  [U] Non pour tout  [S] Suspendre  [?] Aide (la valeur par défaut est « N ») : T
PS C:\WINDOWS\system32>
```

À sa première utilisation, vous devrez accepter les termes et conditions du module comme suit. La commande "update" au même titre que pour "apt" sous Ubuntu et Debian vérifie les mises à jour disponibles et la commande "upgrade --all" permet d'appliquer les mises à jour disponibles. Certaines mises à jour seront silencieuses en arrière plan et d'autres afficheront une fenêtre de progression mais tout sera toujours automatisé.

```
PS C:\WINDOWS\system32> winget update
The `msstore` source requires that you view the following agreements before using.
Terms of Transaction: https://aka.ms/microsoft-store-terms-of-transaction
The source requires the current machine's 2-letter geographic region to be sent to the backend service to function properly (ex. "US").

Do you agree to all the source agreements terms?
[Y] Yes  [N] No: Y
Name                                        Id                           Version             Available           Source
-----------------------------------------------------------------------------------------------------------------------
Microsoft Visual C++ 2015-2022 Redistribut… Microsoft.VCRedist.2015+.x86 14.36.32532.0       14.42.34433.0       winget
Microsoft Visual C++ 2015-2022 Redistribut… Microsoft.VCRedist.2015+.x64 14.36.32532.0       14.42.34433.0       winget
Microsoft OneDrive                          Microsoft.OneDrive           24.226.1110.0004    24.244.1204.0003    winget
Microsoft Teams                             Microsoft.Teams              24295.605.3225.8804 24335.208.3315.1951 winget
App Installer                               Microsoft.AppInstaller       1.24.25199.0        1.24.25200.0        winget
Power Automate                              Microsoft.DevHome            0.0.0.0             0.1901.687.0        winget
6 upgrades available.
```

```
PS C:\WINDOWS\system32> winget upgrade --all
Name                                        Id                           Version             Available           Source
-----------------------------------------------------------------------------------------------------------------------
Microsoft Visual C++ 2015-2022 Redistribut… Microsoft.VCRedist.2015+.x86 14.36.32532.0       14.42.34433.0       winget
Microsoft Visual C++ 2015-2022 Redistribut… Microsoft.VCRedist.2015+.x64 14.36.32532.0       14.42.34433.0       winget
Microsoft OneDrive                          Microsoft.OneDrive           24.226.1110.0004    24.244.1204.0003    winget
Microsoft Teams                             Microsoft.Teams              24295.605.3225.8804 24335.208.3315.1951 winget
App Installer                               Microsoft.AppInstaller       1.24.25199.0        1.24.25200.0        winget
Power Automate                              Microsoft.DevHome            0.0.0.0             0.1901.687.0        winget
6 upgrades available.

Installing dependencies:
This package requires the following dependencies:
  - Packages
      Microsoft.VCLibs.Desktop.14 [>= 14.0.33728.0]
      Microsoft.UI.Xaml.2.8 [>= 8.2310.30001.0]
      Microsoft.WindowsAppRuntime.1.5
(1/6) Found Microsoft Visual C++ 2015-2022 Redistributable (x86) [Microsoft.VCRedist.2015+.x86] Version 14.42.34433.0
Starting package install...
Successfully installed

#[...plein de barres de chargement]
```

La commande "winget --help" vous aidera à trouver les arguments nécessaires à l'utilisation du module :

```
PS C:\WINDOWS\system32> winget --help
Gestionnaire de package Windows v1.9.25200
Copyright (c) Microsoft Corporation. Tous droits réservés.

L’utilitaire de ligne de commande winget permet d’installer des applications et d’autres packages à partir de la ligne de commande.

Utilisation : winget  [<commande>] [<options>]

Les commandes suivantes sont disponibles :
  install    Installe le package donné
  show       Affiche des informations sur un package
  source     Gérer les sources des packages
  search     Rechercher et afficher des informations de base sur les packages
  list       Afficher les packages installés
  upgrade    Affiche et effectue les mises à niveau disponibles.
  uninstall  Désinstallation du paquet donné
  hash       Assistant pour le hachage des fichiers d’installation
  validate   Valide un fichier manifeste
  settings   Ouvrir les paramètres ou définir les paramètres d’administrateur
  features   Affiche le statut des fonctionnalités expérimentales
  export     Exporte une liste des packages installés
  import     Installe tous les packages dans un fichier
  pin        Gérer les broches de package
  configure  Configure le système dans un état souhaité
  download   Télécharge le programme d’installation à partir d’un package donné
  repair     Répare le package sélectionné
```

La commande "winget search \[application\]" vous permettrait de vérifier si une application est disponible sur leur répertoire. Dans l'exemple suivant,

```
PS C:\WINDOWS\system32> winget search VSCode
Nom                                ID                                  Version      Correspondance               Source
-----------------------------------------------------------------------------------------------------------------------
Microsoft Visual Studio Code       Microsoft.VisualStudioCode          1.96.4       Moniker: vscode              winget
Codium                             Alex313031.Codium                   1.89.1.24132 Tag: vscode                  winget
TheiaBlueprint                     EclipseFoundation.TheiaBlueprint    1.44.0       Tag: vscode                  winget
TheiaIDE                           EclipseFoundation.TheiaIDE          1.54.0       Tag: vscode                  winget
Huawei QuickApp IDE                Huawei.QuickAppIde                  14.0.1       Tag: vscode                  winget
DevPod                             LoftLabs.DevPod                     0.6.9        Tag: vscode                  winget
VSCodium                           VSCodium.VSCodium                   1.96.4.25017 Tag: vscode                  winget
VSCodium Insiders                  VSCodium.VSCodium.Insiders          1.97.0.24352 Tag: vscode                  winget
vscli                              michidk.vscli                       1.1.0        Tag: vscode                  winget
Upgit                              pluveto.Upgit                       0.2.18       Tag: vscode                  winget
MrCode                             zokugun.MrCode                      1.82.0.23253 Tag: vscode                  winget
Microsoft Visual Studio Code CLI   Microsoft.VisualStudioCode.CLI      1.96.4       Moniker: vscode-cli          winget
Microsoft Visual Studio Code Insi… Microsoft.VisualStudioCode.Insiders 1.97.0       Moniker: vscode-insiders     winget
Microsoft Visual Studio Code Insi… Microsoft.VisualStudioCode.Insider… 1.97.0       Moniker: vscode-insiders-cli winget
markdown-oxide                     FelixZeller.markdown-oxide          0.23.1       Tag: vscode-language-support winget
```

Connaissant maintenant l'ID de l'application recherchée, nous pouvons maintenant l'installer!

```
PS C:\WINDOWS\system32> winget install Microsoft.VisualStudioCode
Trouvé Microsoft Visual Studio Code [Microsoft.VisualStudioCode] Version 1.96.4
La licence d’utilisation de cette application vous est octroyée par son propriétaire.
Microsoft n’est pas responsable des paquets tiers et n’accorde pas de licences à ceux-ci.
Téléchargement en cours https://vscode.download.prss.microsoft.com/dbazure/download/stable/cd4ee3b1c348a13bafd8f9ad8060705f6d4b9cba/VSCodeUserSetup-x64-1.96.4.exe
  ██████████████████████████████   100 MB /  100 MB
Le code de hachage de l’installation a été vérifié avec succès
Démarrage du package d’installation... Merci de patienter.
Installé correctement

# Redémarrage du shell pour recharger les variables d'environnement
PS C:\Users\Info> (Get-Command code).path
C:\Users\Info\AppData\Local\Programs\Microsoft VS Code\bin\code.cmd
```

[![image.png](https://cours.alexarsenault.cf/uploads/images/gallery/2025-01/scaled-1680-/image.png)](https://cours.alexarsenault.cf/uploads/images/gallery/2025-01/image.png)

La commande "winget list" permet de voir l'ensemble des logiciels et indiquera lesquelles ont été installées et sont gérées par winget.

```
PS C:\Users\Info> winget list
Nom                                           ID                                            Version             Source
-----------------------------------------------------------------------------------------------------------------------
VMware Tools                                  ARP\Machine\X64\{6070BE95-B84D-40FE-8ABD-C70… 12.4.5.23787635
Microsoft Edge                                Microsoft.Edge                                132.0.2957.115      winget
Microsoft Visual C++ 2015-2022 Redistributab… Microsoft.VCRedist.2015+.x64                  14.42.34433.0       winget
Microsoft Visual C++ 2015-2022 Redistributab… Microsoft.VCRedist.2015+.x86                  14.42.34433.0       winget
Microsoft OneDrive                            Microsoft.OneDrive                            24.244.1204.0003    winget
Microsoft Visual Studio Code (User)           Microsoft.VisualStudioCode                    1.96.4              winget
Microsoft Clipchamp                           MSIX\Clipchamp.Clipchamp_3.1.11920.0_neutral… 3.1.11920.0
Microsoft Teams                               Microsoft.Teams                               24335.208.3315.1951 winget
AV1 Video Extension                           MSIX\Microsoft.AV1VideoExtension_1.3.4.0_x64… 1.3.4.0
AVC Encoder Video Extension                   MSIX\Microsoft.AVCEncoderVideoExtension_1.1.… 1.1.3.0
Améliorations de la compatibilité des applic… MSIX\Microsoft.ApplicationCompatibilityEnhan… 1.2411.16.0
Actualités                                    MSIX\Microsoft.BingNews_4.55.62231.0_x64__8w… 4.55.62231.0
Recherche Web de Microsoft Bing               MSIX\Microsoft.BingSearch_1.1.3.0_x64__8weky… 1.1.3.0
MSN Météo                                     MSIX\Microsoft.BingWeather_4.54.63007.0_x64_… 4.54.63007.0
Copilot                                       MSIX\Microsoft.Copilot_1.24122.48.0_x64__8we… 1.24122.48.0
Installeur d'applications                     Microsoft.AppInstaller                        1.24.25200.0        winget
```

# Tâches planifiées

[Référence officiel de Microsoft](https://learn.microsoft.com/en-us/powershell/module/scheduledtasks)

### Importation

La gestion des tâches planifiées n'est pas directement incluse dans Powershell mais le module permettant leur manipulation est préinstallé dans Windows et il suffit del 'importer à l'aide de la commande suivante pour l'utiliser :

```
PS C:\Users\Info> Import-Module ScheduledTasks
PS C:\Users\Info>
```

### Récupération d'information sur les tâches planifiées

#### Get-ScheduledTask

La commande "Get-ScheduledTask" permet de lister l'ensemble des tâches planifiées du système. Ces tâches sont l'équivalent de "cron" sous Linux.

```
PS C:\Users\Info> Get-ScheduledTask

TaskPath                                       TaskName                          State
--------                                       --------                          -----
\                                              OneDrive Reporting Task-S-1-5-... Ready
\                                              OneDrive Standalone Update Tas... Ready
\Microsoft\Windows\.NET Framework\             .NET Framework NGEN v4.0.30319    Ready
\Microsoft\Windows\.NET Framework\             .NET Framework NGEN v4.0.30319 64 Ready
\Microsoft\Windows\.NET Framework\             .NET Framework NGEN v4.0.30319... Disabled
\Microsoft\Windows\.NET Framework\             .NET Framework NGEN v4.0.30319... Disabled
\Microsoft\Windows\Active Directory Rights ... AD RMS Rights Policy Template ... Disabled
```

Les tâches planifiées sous Windows sont structurées par "dossier". Le dossier Microsoft comprend une panoplie de tâches exécutées par défaut sous Windows. Certaines sont de la télémétrie (envoyer des données de diagnostic à Microsoft), d'autres sont pour la maintenance des ordinateurs (ex. Windows Update, synchronisation d'horloge, GPUpdate, etc.). Il est généralement sage de créer nos propres tâches à l'extérieur de ce répertoire.

Les options .Actions et .Triggers de l'objet retourné afficheront la tâche et les déclencheurs de la tâche.

```
PS C:\Users\Info> (Get-ScheduledTask -TaskName QueueReporting).Actions


Id               :
Arguments        : -upload
Execute          : %windir%\system32\wermgr.exe
WorkingDirectory :
PSComputerName   :



PS C:\Users\Info> (Get-ScheduledTask -TaskName QueueReporting).Triggers

Enabled            : True
EndBoundary        :
ExecutionTimeLimit :
Id                 : QueueReportingTimeTrigger
Repetition         : MSFT_TaskRepetitionPattern
StartBoundary      : 2014-12-31T19:00:00-05:00
RandomDelay        : PT1H
PSComputerName     :
```

#### Get-ScheduledTaskInfo

La commande "Get-ScheduledTaskInfo" nous permet de consulter la dernière date d'exécution ainsi que la suivante et le résultat de la dernière exécution.

```
PS C:\Users\Info> Get-ScheduledTask -TaskName QueueReporting | Get-ScheduledTaskInfo


LastRunTime        : 2025-01-20 23:33:45
LastTaskResult     : 0
NextRunTime        : 2025-01-21 03:23:38
NumberOfMissedRuns : 0
TaskName           : QueueReporting
TaskPath           : \Microsoft\Windows\Windows Error Reporting\
PSComputerName     :
```






##### Registry

```
#Taskbar
$registryPath = "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" 	
$registryValueName = "TaskbarAl"
$registryValueData = 0
Set-ItemProperty -Path $registryPath -Name $registryValueName -Value $registryValueData

#Widgets
$registryPath = "HKLM:\SOFTWARE\Policies\Microsoft\Dsh" 	
$registryValueName = "AllowNewsAndInterests"
$registryValueData = 0
try {
    Get-Item -Path $registryPath -ErrorAction Stop
}
catch {
    New-Item -Path $registryPath -Force
}
Set-ItemProperty -Path $registryPath -Name $registryValueName -Value $registryValueData
#Restart-Computer

#Classic right click
$registryPath = "HKCU:\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32"
$registryValueName = "(Default)"
$registryValueData = ""
try {
    Get-Item -Path $registryPath -ErrorAction Stop
}
catch {
    New-Item -Path $registryPath -Force
}
Set-Item -Path $registryPath -Value $registryValueData
Restart-Computer





$hacks = @()

#Widgets
$tweak = [PSCustomObject]@{
  $registryPath = "HKCU:\SOFTWARE\Microsoft\PolicyManager\default\NewsAndInterests"
  $registryValueName = "AllowNewsAndInterests"
  $registryValueData = "0"
}
$hacks += $tweak
$tweak = [PSCustomObject]@{
  $registryPath = "HKCU:\SOFTWARE\Policies\Microsoft"
  $registryValueName = "Dsh"
  $registryValueData = "0"
}
$hacks += $tweak

For ($i in $hacks) {
  Set-ItemProperty -Path $i.registryPath -Name $i.registryValueName -Value $registryValueData
}
```

##### CleanMgr

cleanmgr /sageset:\[n\] \[configure set\]  
cleanmgr /sagerun:\[n\] \[run set\]

cleanmgr /autoclean \[old windows updates\]

##### Task Scheduler

##### Winget

#####   


##### Remove features?

##### PSWindowsUpdate

##### Robocopy?

[![image.png](https://cours.alexarsenault.cf/uploads/images/gallery/2025-01/scaled-1680-/ad9image.png)](https://cours.alexarsenault.cf/uploads/images/gallery/2025-01/ad9image.png)

##### Scripting Install?

FireFox  
7-Zip

# DHCP



# DNS



# Active Directory