Rencontre 9 - Utilisateurs locaux et commentaires
- 👨🏫 Déroulement du cours
- 💻 Exercices à compléter
- 📚 Ressources à consulter
- Gestion des utilisateurs locaux sous Windows
- Commentaires et rubriques d'aide basées sur les commentaires
- Utilisation des fonctionnalités de débogage dans VS Code
- Utilisation de Git, GitHub et GitHub Classroom
- Présentation du TP1
- L'exercice de remise sur GitHub Classroom (TP0)
- Les exercices que vous n'avez pas encore complétés
- Travail sur le TP1
- La présentation PowerPoint est sur le Teams du cours, sous le canal Général > Fichiers > Supports de cours.
- Des tutoriels pour GitHub et LabInfo sont dans la bibliothèque de contenu sur OneNote.
Gestion des utilisateurs locaux
À l'exception des contrôleurs de domaine, toutes les machines Windows, qu'elles soient d'une édition client (Windows 10 / 11) ou serveur, possèdent des utilisateurs locaux. Comme vous l'avez vu dans le cours de systèmes d'exploitation, les utilisateurs locaux peuvent être gérés au moyen du composant enfichable "Utilisateurs et groupes locaux" dans une console MMC (accessible par lusrmgr.msc ou compmgmt.msc). Par défaut, lorsqu'on installe Windows, un certain nombre de comptes utilisateurs sont créés, dont Administrateur et Invité.
Windows possède également un ensemble de groupes locaux prédéfinis. On peut ajouter des comptes (locaux ou domaine) dans un groupe local. Certains groupes possèdent des privilèges particuliers, comme le groupe Administrateurs; tous les comptes utilisateurs membres de ce groupe disposent du privilège d'élévation ("exécuter en tant qu'admin"). Les membres du groupe Utilisateurs, quant à eux, disposent du privilège de démarrage de session locale.
Un utilisateur qui n'est pas membre d'un de ces groupes ne sera pas autorisé à démarrer une session.
On peut utiliser PowerShell pour contrôler les utilisateurs locaux, les groupes locaux ainsi que l'appartenance aux groupes locaux. PowerShell offre pour ce faire un module Microsoft.PowerShell.LocalAccounts
qui renferme plusieurs commandes, notamment:
Add-LocalGroupMember
Disable-LocalUser
Enable-LocalUser
Get-LocalGroup
Get-LocalGroupMember
Get-LocalUser
New-LocalGroup
New-LocalUser
Remove-LocalGroup
Remove-LocalGroupMember
Remove-LocalUser
Rename-LocalGroup
Rename-LocalUser
Set-LocalGroup
Set-LocalUser
Consulter les utilisateurs existants
La commande Get-LocalUser permet d'obtenir la liste des utilisateurs locaux. Elle retourne un ou plusieurs objets de types [Microsoft.PowerShell.Commands.LocalUser]
qui décrivent un compte utilisateur local.
Name Enabled Description
---- ------- -----------
Administrateur True Compte d’utilisateur d’administration
DefaultAccount False Compte utilisateur géré par le système.
Invité False Compte d’utilisateur invité
paul True Boss de la compagnie
WDAGUtilityAccount False Compte d’utilisateur géré et utilisé par le syst...
Ces objets possèdent plusieurs informations sur le compte utilisateur. On peut les voir en explorant la structure de l'objet, par exemple avec Select-Object *
.
AccountExpires : 2023-05-12 20:06:27
Description : Boss de la compagnie
Enabled : True
FullName : Paul Meilleur
PasswordChangeableDate : 2023-04-13 20:06:27
PasswordExpires : 2023-05-24 20:06:27
UserMayChangePassword : True
PasswordRequired : False
PasswordLastSet : 2023-04-12 20:06:27
LastLogon :
Name : paul
SID : S-1-5-21-3297567932-2200011671-69726474-1001
PrincipalSource : Local
ObjectClass : Utilisateur
Création d'un nouvel utilisateur
La commande New-LocalUser
crée un utilisateur local et retourne l'objet décrivant cet utilisateur dans le pipeline (comme il est d'usage par la majorité des commandes exploitant le verbe New-
). Il faut évidemment que la session PowerShell soit élevée en tant qu'admin pour apporter des modifications sur les utilisateurs locaux.
La commande offre un certains nombres de paramètres pour spécifier les différentes propriétés du compte à créer.
Paramètre | Type | Description |
---|---|---|
Name | String | Le nom d'utilisateur (login) |
FullName | String | Le nom complet (prénom nom) |
Description | String | Le champ Description |
AccountExpires | DateTime | La date d'expiration de l'utilisateur |
AccountNeverExpires | Switch | Indique que le compte n'expire jamais |
Disabled | Switch | Indique que le compte est désactivé dès sa création |
Password | SecureString | Le mot de passe de l'utilisateur |
NoPassword | Switch | Indique que le compte n'a aucun mot de passe (pas très sécuritaire!) |
PasswordNeverExpires | Switch | Indique que le mot de passe n'expire jamais |
UserMayNotChangePassword | Switch | Indique que l'utilisateur n'a pas le droit de modifier son mot de passe |
WhatIf | Switch | Fait en sorte que la commande ne crée pas l'utilisateur pour vrai (utile pour tester) |
Le mot de passe est de type [SecureString]
et pas une chaîne de caractères normale. Ce qui fait qu'on doit d'abord convertir la chaîne de caractère en chaîne sécurisée. On peut le faire au moyen de la commande ConvertTo-SecureString
.
$securepasswd = 'Passw0rd' | ConvertTo-SecureString -AsPlainText -Force
Voici un exemple de création d'un compte utilisateur local (en utilisant le splatting):
$NouvelUtilisateurSplat = @{
Name = "paul"
FullName = "Paul Meilleur"
Description = "Boss de la compagnie"
AccountExpires = (Get-Date).AddDays(30) # Dans 30 jours
Password = ConvertTo-SecureString -String "Passw0rd" -AsPlainText -Force
}
New-LocalUser @NouvelUtilisateurSplat
On ne devrait jamais mettre des mots de passe en clair dans un script, ni stocker un mot de passe dans une variable en texte clair!!! Voici quelques options pour l'éviter:
- Créer un algorithme qui choisit automatiquement un mot de passe en fonction d'information provenant de l'extérieur
- Utiliser la commande
Read-Host -AsSecureString
pour demander à l'utilisateur d'entrer un mot de passe (dont la saisie est masquée - Utiliser
Get-Credential
pour fournir un nom d'utilisateur et un mot de passe. Nous verrons plus loin cette commande lorsque nous traiterons de l'authentification par PowerShell.
Groupes locaux
À l'instar des utilisateurs, on peut connaître les groupes locaux au moyen de la commande Get-LocalGroup
.
Pour créer un groupe local, on utilise la commande New-LocalGroup
. Là encore, cette commande ne fonctionne que dans une session PowerShell élevée.
Pour obtenir les membres d'un groupe, on peut utiliser la commande Get-LocalGroupMember
.
ObjectClass Name PrincipalSource
----------- ---- ---------------
Utilisateur PC0001\Administrateur Local
Utilisateur PC0001\bob Local
Utilisateur PC0001\paul Local
Utilisateur PC0001\pierre Local
Groupe MINOU\Admins du domaine ActiveDirectory
Utilisateur MINOU\paul.meilleur ActiveDirectory
Pour ajouter un utilisateur dans un groupe, on utilise la commande Add-LocalGroupMember
. Cette commande prend en paramètre -Member
qui désigne le membre à ajouter, ainsi que -Group
qui désigne le groupe dans lequel l'ajouter.
Add-LocalGroupMember –Member "Paul" -Group "Administrateurs"
Cette commande admet qu'on passe le membre à ajouter par le pipeline en entrée.
Get-LocalUser -Name "Paul" | Add-LocalGroupMember -Group "Administrateurs"
Cela permet, entre autres, de créer un compte et l'ajouter immédiatement à un groupe, puisque la création génère un objet représentant l'utilisateur.
New-LocalUser -Name "Zoe" -NoPassword | Add-LocalGroupMember -Group "Utilisateurs"
On peut aussi ajouter des utilisateurs ou des groupes du domaine comme membre d'un groupe local. Pour ce faire, on n'a qu'à spécifier le sAMAccountName du principal de sécurité du domaine. Si la machine dispose d'une relation d'approbation avec le domaine du compte, celui-ci sera ajouté comme membre au groupe.
Add-LocalGroupMember –Member "DOMAINE\paul.meilleur" -Group "Administrateurs"
Le nom des groupes est différent sur les versions anglaise et française de Windows. Pour que le script fonctionne indépendamment de la langue du système, on peut utiliser le SID du groupe plutôt que son nom. Le SID est un numéro d'identification unique, et dans le cas des groupes prédéfinis dans Windows (Administrateurs, Utilisateurs), il est toujours le même peu importe la langue.
On peut voir les SID des groupes avec la commande suivante:
Get-LocalGroup | Select-Object -Property Name, SID
Voici quelques SID bien connus:
Nom français | Nom anglais | SID |
---|---|---|
Administrateurs | Administrators | S-1-5-32-544 |
Utilisateurs | Users | S-1-5-32 545 |
Par exemple, pour ajouter un utilisateur au groupe des administrateurs:
$MonUtilisateur | Add-LocalGroupMember -SID "S-1-5-32-544"
Commentaires
Au début de la session, nous avons vu les différents types de commentaires en PowerShell. Les commentaires sont des parties du texte compris dans le fichier script qui sont ignorés par l'interpréteur. Ils servent principalement à documenter le code.
Commentaires de ligne
Les commentaires de ligne sont identifiés par le caractère #
. Dès que ce caractère est rencontré sur une ligne de texte, le reste de la ligne n'est pas interprété. On peut l'utiliser au début de la ligne, ou après une commande.
# Ceci est un exemple de commentaire de ligne
Get-ChildItem -Path $env:Windir # Voici un autre commentaire
Blocs de commentaires
Les blocs de commentaires sont utiles lorsque plusieurs lignes consécutives doivent être mises en commentaire. On peut toujours faire débuter plusieurs lignes par le caractère #
, mais on peut aussi mettre plusieurs lignes entre <#
et #>
.
# Voici plusieurs
# lignes En
# commentaires
<#
Ou encore on peut
écrire un bloc de
commentaires comme ça.
#>
Aide basée sur les commentaires
Nous avons vu qu'il est possible d'obtenir de l'aide sur une commande grâce à la commande Get-Help. On peut spécifier, grâce à des commentaires le contenu de la rubrique d'aide d'un script ou une fonction.
Pour ce faire, il suffit de créer un bloc de commentaires, entre <#
et #>
au début ou à la fin du script ou de la fonction, et de spécifier le contenu des différentes rubriques dans des sections correspondantes. Voici les principales:
Section | Description |
---|---|
.SYNOPSIS | Résumé de la fonctionnalité du script ou de la fonction. |
.DESCRIPTION | Description plus détaillée du script ou de la fonction. |
.PARAMETER NomDuParamètre | Fournit une description à un paramètre. Il doit y en avoir un pour chaque paramètre. |
.INPUTS | Décrit le type et la nature des données traitées en entrée par pipeline. |
.OUTPUTS | Décrit le type et la nature des données sortie sur le pipeline. |
.EXAMPLE | Donne un exemple d'utilisation ainsi que son résultat. On peut fournir plusieurs exemples. |
.NOTES | On peut fournir des notes supplémentaires |
.LINK | On peut fournir un lien URL, par exemple vers une page de documentation |
Il existe aussi d'autres sections que l'on peut ajouter à un bloc de commentaires.
Voici un exemple d'un script RepeteChaine.ps1
qui implémente une rubrique d'aide basée sur les commentaires:
[CmdletBinding()]
Param(
[Parameter(Mandatory,ValueFromPipeline)]
[string] $Chaine,
[Parameter(Mandatory)]
[int] $Répétitions
)
$Chaine * $Répétitions
<#
.SYNOPSIS
Répète une chaîne de texte un certain nombre de fois.
.DESCRIPTION
Cette fonction retourne une chaîne de caractères correspondant à la répétition de la chaîne d'entrée un certain nombre de fois.
.PARAMETER Chaine
Spécifie la chaîne de caractères à répéter.
.PARAMETER Répétitions
Spécifie le nombre de répétitions.
.INPUTS
System.String. Ce script adbet la chaîne de caractères à répéter par le pipeline.
.OUTPUTS
System.String. Ce script retourne une chaîne résultant de la répétition de la chaîne d'entrée
.EXAMPLE
PS> .\RepeteChaine.ps1 -Chaine "abc" -Répétitions 3
abcabcabc
.EXAMPLE
PS> "abc" | .\RepeteChaine.ps1 -Répétitions 3
abcabcabc
.NOTES
Ce script est un exemple d'utilisation de l'aide basée sur les commentaires
.LINK
https://learn.microsoft.com/fr-ca/powershell/module/microsoft.powershell.core/about/about_comment_based_help?view=powershell-5.1
#>
Il est possible de spécifier le texte d'aide spécifiques aux paramètres directement dans la déclaration de ces derniers. On n'a alors plus besoin de les définir dans le bloc de commentaires. Si les descriptions des paramètres sont courtes, ça peut être pratique.
Param(
#Spécifie la chaîne de caractères à répéter.
[Parameter(Mandatory,ValueFromPipeline)]
[string] $Chaine,
#Spécifie le nombre de répétitions.
[Parameter(Mandatory)]
[int] $Répétitions
)
Git, GitHub et GitHub Classroom
Vous avez peut-être entendu parler de Git. Il s'agit d'une solution de gestion du code source. Dans les équipes de développement logiciel, Git est très souvent utilisé pour gérer les fichiers composant la solution.
Git
Le logiciel Git a été créé par Linus Torvalds, le créateur de Linux. Il permet de gérer et contrôler l'évolution d'une solution logicielle. On peut le télécharger gratuitement sur le site https://git-scm.com/.
Lorsqu'on travaille avec Git, on doit définir un dépôt (aussi appelé repository, ou repo) qui contient le ou les fichiers qui composent la solution. Chaque fois qu'on fait une modification significative du code (par exemple, on implémente une nouvelle fonctionnalité), on procède à un commit et lui donnant une description.
Il existe plusieurs services sur le cloud permettant de conserver un dépôt. Le plus connu est GitHub, mais il y a aussi GitLabs, BitBucket, et d'autres. Dans ce cours, nous utiliserons GitHub.
GitHub
GitHub est un service qui appartient à Microsoft et sert à héberger des dépôts publics ou privés. Un dépôt public héberge des solutions open source. N'importe qui peut y avoir accès. Pour les projets dont le code source ne doit pas être divulgué au public, on peut créer un dépôt privé. Sur GitHub, on doit disposer d'un compte professionnel pour avoir le droit de créer un dépôt privé. Un compte professionnel coûte normalement 4$ US par mois, mais votre statut d'étudiant vous permet de profiter des avantages pro gratuitement pour la durée de vos études.
Vous pouvez vous créer un compte à l'adresse https://github.com/login. Suivez les étapes pour obtenir votre pack d'étudiant, ce qui vous donnera droit à des avantages gratuits. Vous aurez à fournir une preuve de votre statut d'étudiant.
GitHub Classroom
GitHub Classroom est une solution affiliée à GitHub qui facilite l'utilisation de GitHub dans un cadre éducatif. Les travaux pratiques que vous réaliserez dans ce cours devront être remis par GitHub Classroom.
Lorsqu'un nouveau travail vous sera soumis, votre prof vous communiquera un lien vers GitHub Classroom avec un code. En cliquant sur ce lien, vous devrez vous authentifier avec votre compte GitHub.
Si c'est le premier travail du cours, le site vous demandera de lier votre compte à votre nom. Vous n'aurez à faire ceci qu'une seule fois par cours.
Ensuite, acceptez le travail. Cela créera pour vous une copie du dépôt modèle qui comprend tous les fichiers relatifs au travail à réaliser. Seuls vous et votre professeur aurez accès à votre dépôt.
Ce dépôt vous étant réservé, vous pourrez synchroniser vos fichiers et procéder à la remise de vos travaux. Votre professeur pourra vous donner des commentaires et de la rétroaction.