Comment gérer les utilisateurs et groupes locaux avec PowerShell ?
Sommaire [-]
I. Présentation
Dans ce tutoriel, nous allons apprendre à gérer les utilisateurs et groupes locaux de Windows avec PowerShell ! Un module PowerShell natif nommé "Microsoft.PowerShell.LocalAccounts" sert à créer, modifier, et supprimer les utilisateurs et groupes locaux de la base de comptes locale de Windows (base SAM).
Le module "Microsoft.PowerShell.LocalAccounts" que l'on peut appeler "LocalAccounts" est disponible sur Windows et Windows Server depuis la sortie de Windows 10 et de Windows Server 2016, donc vous devriez l'avoir sur la grande majorité de vos machines. Ce module est en quelque sorte le successeur (ou concurrent...) des célèbres commandes "net user" et "net localgroup". D'ailleurs, ces commandes fonctionnent toujours.
II. Les commandes du module LocalAccounts
Pour lister les commandes du module LocalAccounts et avoir une idée de son potentiel, on utilisera cette commande :
Get-Command -Module Microsoft.PowerShell.LocalAccounts
Ce module contient une bonne dizaine de commandes, dont voici la liste :
- Add-LocalGroupMember : ajouter un utilisateur à un groupe de sécurité local
- Disable-LocalUser : désactiver un compte utilisateur local
- Enable-LocalUser : activer un compte utilisateur local
- Get-LocalGroup : obtenir la liste des groupes de sécurité locaux
- Get-LocalGroupMember : obtenir la liste des membres d'un groupe de sécurité
- Get-LocalUser : obtenir la liste des utilisateurs locaux
- New-LocalGroup : créer un nouveau groupe de sécurité
- New-LocalUser : créer un nouvel utilisateur local
- Remove-LocalGroup : supprimer un groupe de sécurité local
- Remove-LocalGroupMember : retirer un membre d'un groupe local
- Remove-LocalUser : supprimer un utilisateur local
- Rename-LocalGroup : renommer un groupe local
- Rename-LocalUser : renommer un utilisateur local
- Set-LocalGroup : modifier un groupe local
- Set-LocalUser : modifier un utilisateur local, utile pour changer le mot de passe
Il y a vraiment tout l'arsenal nécessaire pour manipuler les utilisateurs et groupes locaux !
III. Créer un utilisateur local avec PowerShell
Pour commencer, nous allons créer un utilisateur local avec PowerShell. Le nom de cet utilisateur sera stocké dans la variable $AccountName, son mot de passe dans la variable $AccountPassword et la description dans $AccountDescription.
Le mot de passe doit répondre aux exigences de la stratégie de mots de passe de la machine locale, ou de l'Active Directory s'il s'agit d'une machine intégrée au domaine. Par ailleurs, si le mot de passe n'est pas précisé, il devra être saisi en mode interactif dans la console PowerShell.
$AccountName = "test-fb" $AccountPassword = ConvertTo-SecureString "P@ssword123!" -AsPlainText -Force $AccountDescription = "Compte de test" # Créer le compte local New-LocalUser $AccountName -Password $AccountPassword -FullName $AccountName -Description $AccountDescription
La commande New-LocalUser aura pour effet de créer le compte "test-fb" sur l'ordinateur local. Par défaut, ce compte est activé alors si vous souhaitez qu'il soit désactivé, il faut ajouter le paramètre "-Disabled". D'autres paramètres sont disponibles pour cette commande comme le mentionne la documentation Microsoft.
Note : lorsqu'un compte est créé avec New-LocalUser, il n'appartient à aucun groupe de sécurité. De ce fait, sur Windows Server il ne sera pas possible d'ouvrir une session interactive (alors que ce sera possible sur Windows 10 ou Windows 11). Donc, en complément, il faudra l'ajouter à minima au groupe Utilisateurs avec la commande Add-LocalGroupMember étudiée dans la suite de cet article.
Ce nouveau compte apparaît bien dans la liste des comptes locaux :
Get-LocalUser
La preuve en image :
D'ailleurs, la commande Get-LocalUser peut renvoyer beaucoup d'informations au sujet des comptes : dernière connexion, date d'expiration du mot de passe, date du dernier changement de mot de passe, SID du compte, etc.... Voici comment obtenir ce détail :
Pour obtenir ces informations pour tous les comptes
Get-LocalUser | Select-Object *
Pour obtenir ces informations pour un compte :
Get-LocalUser -Name "test-fb" | Select-Object *
IV. Désactiver le compte Administrateur local avec PowerShell
Imaginons que l'on souhaite désactiver le compte "Administrateur" local de la machine Windows pour utiliser un nouveau compte avec un nom personnalisé. Tout d'abord, nous allons ajouter le compte "test-fb" au groupe de sécurité "Administrateurs" local de la machine (oui j'aurais pu choisir mieux comme nom d'utilisateur).
Avec Add-LocalGroupMember, on ajoute notre utilisateur au groupe "Administrateurs" :
Add-LocalGroupMember -Group "Administrateurs" -Member "test-fb"
Puis, si on liste les membres du groupe "Administrateurs", on peut voir que le compte "test-fb" est bien présent :
Get-LocalGroupMember -Group "Administrateurs"
Attention, sur un Windows en anglais, le nom du groupe sera "Administrators".
Il ne reste plus qu'à désactiver le compte "Administrateur" natif créé à l'installation de la machine :
Disable-LocalUser -Name "Administrateur"
Voilà, le compte "Administrateur" est désactivé sur la machine locale. À la place, nous pouvons utiliser le compte "test-fb" ! Ce dernier pourrait être géré par une stratégie Windows LAPS !
V. Gérer les groupes locaux avec PowerShell
Tout d'abord, la longue liste des groupes de sécurité locaux intégrés à Windows peut être obtenue avec une simple commande :
Get-LocalGroup
En entreprise, c'est assez rare que l'on ait besoin de créer un nouveau groupe de sécurité local ou d'en supprimer un. Par contre, on est souvent amené à ajouter ou supprimer des membres de ces groupes. Par exemple, si l'on souhaite donner des droits d'administration sur une machine à un utilisateur ou un groupe du domaine Active Directory.
Pour ajouter le compte "IT-Connect\admin.fb" (compte utilisateur sur le domaine AD) en tant que membre du groupe "Administrateurs", on utilisera cette syntaxe :
Add-LocalGroupMember -Group "Administrateurs" -Member "IT-Connect\admin.fb"
On peut aussi ajouter plusieurs éléments d'un coup :
Add-LocalGroupMember -Group "Administrateurs" -Member ("IT-Connect\compte1","IT-Connect\compte2")
L'opération inverse à savoir retirer des membres de ce groupe n'est pas bien compliqué : il suffit de changer le nom de la commande :
Remove-LocalGroupMember -Group "Administrateurs" -Member ("IT-Connect\compte1","IT-Connect\compte2")
Si vous avez besoin de créer un nouveau groupe de sécurité local, la commande New-LocalGroup doit être utilisée.
VI. Conclusion
Voilà, nous venons de voir quelques commandes pratiques pour gérer les utilisateurs et groupes locaux à partir de PowerShell et du module intégré à Windows ! Si vous avez une question, n'hésitez pas à poster un commentaire ou à venir en discuter sur notre serveur Discord.
En complément de cet article, vous pouvez consulter la documentation Microsoft pour avoir de l'aide sur les différentes commandes de ce module PowerShell.
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Le module LocalAccounts contient 15 cmdlets. Pour voir la liste complète, exécutez la commande suivante :
Get-Command -Module Microsoft.PowerShell
- Add-LocalGroupMember — Ajouter un utilisateur au groupe local
- Disable-LocalUser — Désactiver un compte d’utilisateur local
- Enable-LocalUser — Activer un compte d’utilisateur local
- Get-LocalGroup — Afficher les préférences du groupe local
- Get-LocalGroupMember — Afficher la liste de tous les membres du groupe local
- Get-LocalUser — Afficher les préférences d’un compte d’utilisateur local
- New-LocalGroup — Créer un nouveau groupe local
- New-LocalUser — Créer un nouveau compte d’utilisateur local
- Remove-LocalGroup — Supprimer un groupe local
- Remove-LocalGroupMember — Supprimer un membre d’un groupe local
- Remove-LocalUser — Supprimer un compte d’utilisateur local
- Rename-LocalGroup — Renommer un groupe local
- Rename-LocalUser — Renommer un compte d’utilisateur local
- Set-LocalGroup — Modifier les paramètres d’un groupe local
- Set-LocalUser — Modifier les paramètres de compte d’un utilisateur local
Gérer les comptes d’utilisateur locaux avec PowerShell
Voyons comment utiliser ces commandes pour effectuer des tâches courantes de gestion des utilisateurs locaux sur un ordinateur sous Windows 10.
Établir la liste des utilisateurs et de leurs propriétés avec PowerShell
Commençons par obtenir la liste de tous les comptes d’utilisateur locaux de la machine. Pour cela, nous utilisons le cmdlet Get-LocalUser :
Get-LocalUser
Comme vous le voyez, nous avons deux comptes d’utilisateur locaux, dont l’un est désactivé (celui pour lequel est indiqué « False » (Faux) dans la colonne « Enabled » (Activé)).
Si vous voulez obtenir toutes les propriétés et leurs valeurs pour un compte d’utilisateur local, utilisez le cmdlet Get-LocalUser avec les paramètres suivants :
Get-LocalUser -Name ‘guest’ | Select-Object *
Pour obtenir la valeur d’un attribut de compte d’utilisateur local particulier, saisissez son nom après le paramètre Select-Object. Dans cet exemple, nous souhaitons connaître la valeur de l’attribut PasswordLastSet du compte dont le nom d’utilisateur est « administrator » :
Get-LocalUser -Name ‘administrator’ | Select-Object PasswordLastSet
Créer un utilisateur local avec PowerShell
Créons maintenant un nouvel utilisateur à l’aide du cmdlet New-LocalUser. Ce cmdlet peut créer les types de comptes d’utilisateur suivants :
- Comptes d’utilisateur locaux Windows
- Comptes Microsoft
- Comptes Azure Active Directory
Lorsque vous créez un compte d’utilisateur local, ne tapez jamais le mot de passe en texte simple ; convertissez-le toujours en une chaîne sécurisée à l’aide du paramètre ?AsSecureString ou ?ConvertTo-SecureString. La commande suivante permet de créer un nouveau compte d’utilisateur local :
$UserPassword = Read-Host –AsSecureString New-LocalUser "Netwrix" -Password $UserPassword -FullName "Netwrix" -Description "CompleteVisibility"
Dans un environnement Windows 10, les utilisateurs peuvent accorder des autorisations depuis leurs comptes Microsoft, ce qui permet de créer un nouveau compte d’utilisateur local lié aux informations d’identification d’un compte Microsoft. À cette fin, utilisez le script suivant (notez que vous n’avez pas besoin de saisir le mot de passe car il est stocké dans le Cloud Microsoft) :
New-LocalUser -Name "MicrosoftAccount\SomeAccount@outlook.com" -Description "Microsoft Account"
Pour créer un compte local lié à votre Azure AD, utilisez la commande suivante :
New-LocalUser -Name "AzureAD\Netwrix@enterprise.com" -Description "Azure AD Account"
Modifier le mot de passe d’un utilisateur local ou les propriétés du mot de passe avec PowerShell
Pour changer le mot de passe d’un compte d’utilisateur local, utilisez le cmdlet Set-LocalUser. Pour changer le mot de passe de l’administrateur local :
$UserPassword = Read-Host –AsSecureString Set-LocalUser -Name Administrator -Password $UserPassword –Verbose
Pour définir avec PowerShell que le mot de passe d’un utilisateur local ne doit jamais expirer, exécutez le script suivant :
Set-LocalUser -Name Netwrix –PasswordNeverExpires $False
Supprimer un compte d’utilisateur local avec PowerShell
Pour supprimer un compte d’utilisateur local, utilisez le cmdlet Remove-LocalUser :
Remove-LocalUser -Name Netwrix -Verbose
Gérer les groupes locaux avec PowerShell
Après nous être intéressés aux utilisateurs locaux, penchons-nous maintenant sur les groupes locaux.
Consulter les groupes locaux avec PowerShell
Commençons par établir une liste de tous les groupes sur notre Windows Server :
Get-LocalGroup
Ajouter un groupe local avec PowerShell
Pour créer un nouveau groupe :
New-LocalGroup -Name 'Netwrix Users' -Description 'Netwrix Users Group'
Ajouter des utilisateurs à un groupe local avec PowerShell
Pour ajouter un utilisateur (ou un groupe) à un groupe local, utilisez le cmdlet Add-LocalGroupMember. Supposez par exemple que vous vouliez ajouter des utilisateurs au groupe local Administrators, mais sans avoir à les ajouter un par un. Pour ajouter le groupe « Netwrix Users » au groupe local Administrators :
Add-LocalGroupMember -Group 'Administrators' -Member ('Netwrix',’Netwrix Users') –Verbose
Si votre ordinateur ou votre serveur fait partie du domaine, vous pouvez également ajouter un compte et des groupes de domaine aux groupes locaux pour accorder à ces utilisateurs des droits locaux spéciaux sur le serveur. Ajoutez-les au format « DomainName\User » (pour un utilisateur) ou « DomainName\Domain Group » (pour un groupe).
Afficher les membres d’un groupe particulier avec PowerShell
Pour établir la liste de tous les membres d’un groupe local particulier :
Get-LocalGroupMember -Group 'Netwrix Users'
Comme vous le voyez, cette commande affiche tous les comptes et groupes locaux qui sont membres du groupe « Netwrix Users ». Bien que seuls les comptes et groupes locaux soient mentionnés dans cette liste, cette commande affiche également tous les utilisateurs et groupes de domaine, ainsi que tous les comptes Microsoft et Azure AD.
Afficher tous les groupes dont un utilisateur est membre avec PowerShell
Pour établir la liste de tous les groupes dont un utilisateur particulier est membre, exécutez le script suivant :
foreach ($LocalGroup in Get-LocalGroup) { if (Get-LocalGroupMember $LocalGroup -Member 'Guest' –ErrorAction SilentlyContinue) { $LocalGroup.Name } }
Supprimer un groupe local avec PowerShell
Pour supprimer un compte d’utilisateur local d’un groupe, utilisez le cmdlet Remove-LocalGroupMember :
Remove-LocalGroupMember -Group 'Netwrix Users' –Member 'guest'
Gérer les utilisateurs et groupes locaux à distance avec PowerShell
Pour gérer à distance les comptes d’utilisateur et groupes locaux, connectez-vous aux postes de travail distants via WinRM en utilisant les cmdlets Invoke-Command et Enter-PSSession. Par exemple, pour obtenir à distance les membres du groupe d’administrateurs local sur plusieurs ordinateurs, exécutez le script suivant :
$search = new-pssession -computer pcname1,pcname2,pcname3 invoke-command -scriptblock {Get-LocalGroupMember -Group 'Administrators'} -session $search -hidecomputername | select * -exclude RunspaceID | out-gridview -title "LocalAdmins"
Active Directory : comment obtenir la liste des administrateurs locaux de tous les ordinateurs ?
Sommaire [-]
I. Présentation
Vous travaillez en environnement Active Directory avec des machines sous Windows et vous ne savez plus trop qui est administrateur local de quelle machine ? Autrement dit, vous cherchez à obtenir la liste des administrateurs locaux de chaque machine de votre domaine Active Directory ? Cela tombe bien, c'est ce que nous allons voir dans ce tutoriel où nous allons utiliser PowerShell !
Vous avez également la possibilité de déployer une stratégie de groupe pour uniformiser la configuration sur vos machines :
II. Lister les comptes Administrateurs locaux d'une machine
Tout d'abord, nous allons voir comment obtenir cette information sur une seule machine, en étant en local. Vous pouvez regarder dans la console "Gestion de l'ordinateur" afin de regarder les membres du groupe "Administrateurs". Dans cet exemple, nous pouvons voir qu'il y a le compte "Administrateur" local de la machine, ainsi que le groupe de sécurité "IT-CONNECT\GDL-Admins-PC" (dans l'Active Directory).
Ma volonté étant plutôt de vous expliquer comment procéder avec PowerShell, voici la commande à utiliser :
Get-LocalGroupMember -Group "Administrateurs"
Elle retournera la même liste que l'interface graphique. La propriété "PrincipalSource" permet de savoir s'il s'agit d'un utilisateur/groupe stocké dans la base SAM locale ou dans l'Active Directory.
Ainsi, nous pourrions filtrer cette liste pour avoir uniquement les objets (utilisateur/groupe) appartenant à l'Active Directory :
Get-LocalGroupMember -Group Administrateurs | Where-Object {$_.PrincipalSource -eq "ActiveDirectory"}
Si le module Active Directory de PowerShell était installé sur le poste de travail, nous pourrions récupérer la liste des membres des groupes Active Directory, en l'occurrence ici les membres du groupe "IT-CONNECT\GDL-Admins-PC". Toutefois, ce module n'est généralement pas installé sur les postes de travail (à quelques exceptions près...). Nous verrons comment récupérer automatiquement cette liste via l'interrogation à distance.
III. Récupérer la liste des administrateurs locaux à distance
Nous allons commencer à récupérer l'information à distance, ce qui permettra d'obtenir la liste des administrateurs locaux de n'importe quelle machine du domaine Active Directory actuellement allumé et connecté au réseau.
Avec PowerShell, nous allons utiliser le cmdlet "Invoke-Command" qui va permettre d'exécuter une commande sur la machine distante : nous allons exécuter la commande "Get-LocalGroupMember" que nous avons vue précédemment. Pour que cela fonctionne, la gestion à distance via WinRM doit être activée sur les machines cibles et ce flux doit être autorisé dans le pare-feu Windows.
Le fait d'agir à distance depuis un contrôleur de domaine Active Directory ou une machine d'administration va nous permettre d'utiliser le module Active Directory de PowerShell à partir d'une seule machine.
Pour récupérer la liste des administrateurs locaux à distance sur une machine nommée "PC-01", voici la commande à exécuter :
Invoke-Command -ComputerName PC-01 -ScriptBlock { Get-LocalGroupMember -Group Administrateurs }
Nous obtenons le même résultat :
Ensuite, nous pouvons aller plus loin en nous intéressant aux administrateurs locaux correspondants à des comptes du domaine Active Directory.
- S'il s'agit d'un utilisateur, on récupère son identifiant (SamAccountName), son état pour savoir s'il est activé ou non (Enabled) et sa date de création (WhenCreated)
- S'il s'agit d'un groupe de sécurité, on récupère la liste des membres de ce groupe, et pour chaque utilisateur on récupère les mêmes propriétés (identifiant, état, date de création)
Ce qui donne le bout de code suivant :
$LocalAdmins = Invoke-Command -ComputerName PC-01 -ScriptBlock { Get-LocalGroupMember -Group Administrateurs | Where-Object { $_.PrincipalSource -eq "ActiveDirectory" } }
Foreach ($LocalAdmin in $LocalAdmins)
{
If($LocalAdmin.objectclass –eq "Utilisateur"){
Get-ADUser $LocalAdmin.SID -Properties whenCreated | Select-Object SamAccountName,enabled,whenCreated
}
If($LocalAdmin.objectclass –eq "Groupe"){
Get-ADGroupMember $LocalAdmin.SID | ForEach-Object { Get-ADUser $_ -Properties whenCreated | Select-Object SamAccountName,enabled,whenCreated }
}
}
Ainsi, le résultat suivant est retourné :
Ceci me donne des précisions sur les membres du groupe "IT-CONNECT\GDL-Admins-PC" de l'Active Directory ! Si un administrateur local ne nous plaît pas, il suffirait de le retirer du groupe. S'il s'agit d'un objet local, il est toujours possible de le faire à distance via la commande "Remove-LocalGroupMember".
IV. Récupérer la liste des administrateurs locaux pour tous les ordinateurs
Pour finir et aller plus loin, nous allons voir comment récupérer la liste des administrateurs locaux pour tous les ordinateurs (ou une sélection d'ordinateurs) intégrés à l'Active Directory.
Tout d'abord, nous devons récupérer une liste de machines : à vous de définir vos critères en adaptant la syntaxe de la commande Get-ADComputer. Cette liste de machines sera stockée dans la variable $Targets.
Par exemple, voici comment récupérer une liste d'ordinateurs à partir d'une OU spécifique (et toutes les sous-OUs) :
$Targets = (Get-ADComputer -Filter * -SearchBase "OU=PC,DC=it-connect,DC=local").Name
Nous pouvons aussi utiliser d'autres critères, comme le système d'exploitation. Si l'on recherche uniquement les serveurs sous Windows Server, cela donne :
$Targets = (Get-ADComputer -Filter 'operatingsystem -Like "Windows Server*"').Name
Dans la commande Invoke-Command, nous allons simplement remplacer le nom de la machine à cibler par notre liste représentée par $Targets. Ainsi, nous allons récupérer la liste de tous les ordinateurs correspondants à notre sélection.
$LocalAdmins=Invoke-Command -ComputerName $Targets -ScriptBlock { Get-LocalGroupMember -Group Administrateurs | Where-Object { $_.PrincipalSource -eq "ActiveDirectory" } }
Désormais, nous allons aller plus loin puisque l'on va dresser la liste des administrateurs locaux correspondants à des comptes Active Directory, pour chaque machine. Lorsqu'il s'agit d'un groupe de sécurité, tel que "IT-CONNECT\GDL-Admins-PC", nous allons récupérer la liste des membres pour avoir directement les noms des utilisateurs dans la sortie de la commande.
$LocalAdmins=Invoke-Command -ComputerName $Targets -ScriptBlock { Get-LocalGroupMember -Group Administrateurs | Where-Object { $_.PrincipalSource -eq "ActiveDirectory" } }
$Report = Foreach ($LocalAdmin in $LocalAdmins)
{
If($LocalAdmin.objectclass –eq "Utilisateur"){
Get-ADUser $LocalAdmin.SID -Properties whenCreated | Select-Object @{Name = 'ComputerName'; Expression = {$LocalAdmin.PSComputerName}},SamAccountName,enabled,whenCreated, @{Name = 'Type'; Expression = {"Utilisateur"}}
}
If($LocalAdmin.objectclass –eq "Groupe"){
Get-ADGroupMember $LocalAdmin.SID | ForEach-Object { Get-ADUser $_ -Properties whenCreated | Select-Object @{Name = 'ComputerName'; Expression = {$LocalAdmin.PSComputerName}},SamAccountName,enabled,whenCreated,@{Name = 'Type'; Expression = {"Groupe"}}}
}
}
$Report | Format-Table
Le bout de code ci-dessous contient deux propriétés calculées :
- ComputerName pour spécifier le nom de l'ordinateur (sinon il sera difficile de s'y retrouver).
- Type pour indiquer la valeurr "Utilisateur" s'il s'agit d'un utilisateur directement membre du groupe "Administrateurs" de la machine ou la valeur "Groupe" s'il s'agit d'un utilisateur membre d'un groupe de sécurité AD étant lui-même membre du groupe "Administrateurs". De ce fait, un même utilisateur peut ressortir deux fois dans les résultats pour une même machine.
Voici un exemple de résultat :
Vous pouvez aussi exporter cette liste dans un fichier CSV (qui contient la date du jour dans le nom) :
$Report | Export-CSV "C:\Scripting\CSVLocalAdmins.csv" -NoTypeInformation