Aller au contenu principal

Rencontre 9 - Utilisateurs locaux et commentaires

Résumé de la séance
  1. Gestion des utilisateurs locaux sous Windows
  2. Commentaires et rubriques d'aide basées sur les commentaires
  3. Utilisation des fonctionnalités de débogage dans VS Code
  4. Utilisation de Git, GitHub et GitHub Classroom
  5. Présentation du TP1

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.

attention

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.

Windows PowerShell
PS C:\> Get-LocalUser

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 *.

Windows PowerShell
PS C:\> Get-LocalUser -Name 'paul' | 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ètreTypeDescription
NameStringLe nom d'utilisateur (login)
FullNameStringLe nom complet (prénom nom)
DescriptionStringLe champ Description
AccountExpiresDateTimeLa date d'expiration de l'utilisateur
AccountNeverExpiresSwitchIndique que le compte n'expire jamais
DisabledSwitchIndique que le compte est désactivé dès sa création
PasswordSecureStringLe mot de passe de l'utilisateur
NoPasswordSwitchIndique que le compte n'a aucun mot de passe (pas très sécuritaire!)
PasswordNeverExpiresSwitchIndique que le mot de passe n'expire jamais
UserMayNotChangePasswordSwitchIndique que l'utilisateur n'a pas le droit de modifier son mot de passe
WhatIfSwitchFait en sorte que la commande ne crée pas l'utilisateur pour vrai (utile pour tester)
info

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
danger

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.

Windows PowerShell
PS C:\> Get-LocalGroupMember -Group 'Administrateurs'

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"

info

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"

astuce

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çaisNom anglaisSID
AdministrateursAdministratorsS-1-5-32-544
UtilisateursUsersS-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:

SectionDescription
.SYNOPSISRésumé de la fonctionnalité du script ou de la fonction.
.DESCRIPTIONDescription plus détaillée du script ou de la fonction.
.PARAMETER NomDuParamètreFournit une description à un paramètre. Il doit y en avoir un pour chaque paramètre.
.INPUTSDécrit le type et la nature des données traitées en entrée par pipeline.
.OUTPUTSDécrit le type et la nature des données sortie sur le pipeline.
.EXAMPLEDonne un exemple d'utilisation ainsi que son résultat. On peut fournir plusieurs exemples.
.NOTESOn peut fournir des notes supplémentaires
.LINKOn 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
#>
astuce

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.