Aller au contenu principal

Gérer les utilisateurs et groupes locaux

Objectifs de la séance

  • Lire, créer, modifier et supprimer des comptes locaux avec PowerShell
  • Comprendre le type SecureString et pourquoi un mot de passe ne se manipule jamais comme une chaîne simple
  • Gérer l'appartenance à un groupe local
  • Écrire un script qui peut être relancé plusieurs fois sans erreur (idempotence)

Notions théoriques

La base des comptes locaux

Chaque poste Windows possède sa propre base de comptes locaux, indépendante d'un éventuel domaine (la base SAM). C'est la différence entre un compte local, valable uniquement sur cette machine, et un compte de domaine, valable sur tout le réseau de l'entreprise — nous verrons les comptes de domaine avec Active Directory plus loin dans ce cours. Les cmdlets de gestion des comptes locaux appartiennent au module Microsoft.PowerShell.LocalAccounts, chargé automatiquement.

Lire les comptes et les groupes

Get-LocalUser
Get-LocalGroup
Get-LocalGroupMember -Group "Administrateurs"

Ces cmdlets renvoient des objets, comme toutes les cmdlets Get-* déjà rencontrées en niveau 1 : vous pouvez donc les combiner avec Where-Object, Select-Object et Sort-Object.

Get-LocalUser | Where-Object { $_.Enabled -eq $true } | Select-Object Name, LastLogon

Propriétés utiles : Name, Enabled, LastLogon, PasswordExpires, Description.

Créer un compte local

New-LocalUser -Name "stagiaire01" -FullName "Stagiaire BTS SIO" -Description "Compte temporaire"

Paramètres courants : -Name, -FullName, -Description, -Password, -PasswordNeverExpires, -AccountExpires.

Le type SecureString

Contrairement à une simple chaîne de caractères, le paramètre -Password de New-LocalUser attend un objet de type SecureString : PowerShell refuse qu'un mot de passe circule en clair dans le système. Pour demander un mot de passe à l'utilisateur de façon sécurisée :

$motDePasse = Read-Host "Mot de passe du compte" -AsSecureString
New-LocalUser -Name "stagiaire01" -Password $motDePasse
attention

Vous croiserez aussi ConvertTo-SecureString "MotDePasse123!" -AsPlainText -Force, qui transforme une chaîne en clair en SecureString. C'est pratique pour un script de démonstration en labo, mais ne l'utilisez jamais dans un script destiné à la production : le mot de passe en clair resterait visible dans le code source, potentiellement versionné dans un dépôt Git.

Modifier et supprimer un compte

Set-LocalUser -Name "stagiaire01" -Description "Stage terminé le 30/06"
Disable-LocalUser -Name "stagiaire01"
Enable-LocalUser -Name "stagiaire01"
Remove-LocalUser -Name "stagiaire01"

Désactiver un compte (Disable-LocalUser) est souvent préférable à le supprimer immédiatement : le compte et son historique restent disponibles si besoin.

Gérer l'appartenance à un groupe

Add-LocalGroupMember -Group "Utilisateurs du Bureau à distance" -Member "stagiaire01"
Remove-LocalGroupMember -Group "Utilisateurs du Bureau à distance" -Member "stagiaire01"
New-LocalGroup -Name "GRP_Stagiaires" -Description "Groupe des comptes stagiaires"
info

Ajouter un compte au strict minimum de groupes nécessaires à son usage est une application directe du principe du moindre privilège : plus un compte a de droits, plus les conséquences d'une compromission sont importantes.

Exécuter en tant qu'administrateur

Créer, modifier ou supprimer un compte local nécessite une console PowerShell ouverte en tant qu'administrateur (clic droit → « Exécuter en tant qu'administrateur »). Les cmdlets de lecture (Get-LocalUser, Get-LocalGroupMember...) fonctionnent en revanche sans élévation.

Le piège de la localisation

attention

Le nom des groupes intégrés dépend de la langue d'installation de Windows : le groupe des administrateurs s'appelle Administrateurs sur un Windows en français, mais Administrators sur un Windows en anglais. Un script écrit avec le nom en dur ne fonctionnera donc pas sur toutes les machines. La solution robuste consiste à cibler le groupe par son SID, identique sur toutes les langues :

Get-LocalGroup -SID "S-1-5-32-544"

Exemple pratique

# Script : New-UtilisateursLocaux.ps1
# Role : creer un compte local de stagiaire et l'ajouter au groupe Utilisateurs du bureau a distance
# A lancer dans une console PowerShell ouverte en tant qu'administrateur

$nomCompte = "stagiaire01"
$motDePasse = Read-Host "Mot de passe du compte $nomCompte" -AsSecureString

if (Get-LocalUser -Name $nomCompte -ErrorAction SilentlyContinue) {
Write-Host "Le compte $nomCompte existe deja."
}
else {
New-LocalUser -Name $nomCompte `
-Password $motDePasse `
-FullName "Stagiaire BTS SIO" `
-Description "Compte temporaire cree par script"

Add-LocalGroupMember -Group "Utilisateurs du Bureau a distance" -Member $nomCompte
Write-Host "Compte $nomCompte cree et ajoute au groupe."
}

Get-LocalUser | Select-Object Name, Enabled, LastLogon | Sort-Object Name | Format-Table
info

Le test if (Get-LocalUser -Name $nomCompte -ErrorAction SilentlyContinue) avant la création est l'équivalent PowerShell du if [ ! -d "$dossier" ] vu en Bash niveau 1 : il rend le script idempotent, c'est-à-dire qu'on peut le relancer plusieurs fois sans provoquer d'erreur.

Test de mémorisation/compréhension


Quelle cmdlet crée un compte local ?


Pourquoi New-LocalUser -Password "Azerty01!" échoue-t-il ?


Que se passe-t-il si vous exécutez Get-LocalGroupMember -Group "Administrateurs" sur un Windows en anglais ?


Quelle cmdlet désactive un compte local sans le supprimer ?


TP pour réfléchir et résoudre des problèmes

attention

Ce TP crée un vrai compte local : il doit être exécuté dans une console PowerShell ouverte en tant qu'administrateur. Sur un poste du lycée géré par une stratégie de groupe, la création de compte peut être refusée : dans ce cas, limitez-vous aux étapes 1 et 2, qui n'utilisent que des cmdlets de lecture, et complétez les étapes suivantes par lecture de code sans les exécuter.

Étape 1 — Demander le mot de passe de façon sécurisée


Bonne pratique - Ne jamais écrire un mot de passe en dur

Un mot de passe ne doit jamais apparaître en clair dans le code source d'un script : demandez-le toujours à l'exécution, avec -AsSecureString.

Étape 2 — Rendre le script idempotent


Bonne pratique - Un script rejouable

Vérifier qu'un compte n'existe pas déjà avant de le créer permet de relancer le script sans qu'il échoue à la deuxième exécution — exactement le même réflexe que le if [ ! -d "$dossier" ] vu en Bash.

Étape 3 — Créer le compte


Bonne pratique - L'accent grave de continuation

Le backtick ` en fin de ligne permet d'étaler une commande PowerShell trop longue sur plusieurs lignes, à condition qu'il soit le tout dernier caractère de la ligne, sans espace après.

Étape 4 — Ajouter le compte au groupe puis afficher un récapitulatif


Bonne pratique - Le moindre privilège

N'ajoutez un compte qu'aux groupes strictement nécessaires à son usage : un stagiaire n'a par exemple aucune raison d'appartenir au groupe des administrateurs.

📌 Une solution