Comment utiliser PowerShell pour obtenir les SID des utilisateurs ?
Sommaire
I. Présentation
Dans ce tutoriel, nous allons apprendre à lister le SID des utilisateurs de Windows à l'aide de plusieurs commandes différentes ! Nous allons utiliser 4 commandes PowerShell : Get-WmiObject, Get-CimInstance, Get-LocalUser et Get-ADUser pour PowerShell, ainsi que deux autres commandes : wmic et whoami.
Pour rappel, sous Windows, le SID pour Security IDentifier ou identificateur de sécurité en français, est une chaîne unique pour identifier un objet de sécurité, notamment un utilisateur ou un groupe sur une machine Windows. Au sein d'un annuaire Active Directory, chaque objet possède également son SID. Cela signifie que derrière chaque nom d'utilisateur se cache un SID. Il est notamment utilisé pour gérer les autorisations.
Comment récupérer le SID d'un utilisateur local ou Active Directory en ligne de commande ? C'est ce que nous allons voir à l'aide de plusieurs commandes, bien que cette information soit aussi accessible dans le Registre Windows.
II. Récupérer le SID avec PowerShell
A. Get-WmiObject et Get-CimInstance
Commençons par interroger les classes WMI (Windows Management Instrumentation) de Windows avec la commande Get-WmiObject de PowerShell.
Get-WmiObject -Class win32_UserAccount | Format-Table Name,SID
Cette commande retourne la liste des utilisateurs locaux avec leur SID respectif :
Pour récupérer directement le SID d'un utilisateur local spécifique, nous pouvons utiliser cette syntaxe :
(Get-WmiObject -Class win32_UserAccount -Filter "name='Florian' and domain='$env:ComputerName'").SID
Cette commande permet de récupérer la valeur de la propriété SID, et nous appliquons un filtre sur le nom d'utilisateur "Florian". Le fait de spécifier "domain='$env:ComputerName'"" permet de cibler la base de comptes locale.
Toutefois, il est préférable d'utiliser la commande Get-CimInstance puisqu'elle succède à Get-WmiObject. Elle s'utilise de la même façon, sauf qu'elle s'appuie sur WinRM (protocole de gestion à distance) plutôt que WMI, donc attention au numéro de ports, car les flux ne sont pas les mêmes. Il suffit de remplacer le nom de la commande :
Get-CimInstance -Class win32_UserAccount | Format-Table Name,SID
Nous pouvons constater que la sortie est identique :
Ces deux cmldets PowerShell prennent en charge le paramètre "-ComputerName", ce qui permet d'interroger une machine à distance à condition que les flux soient autorisés dans le pare-feu Windows.
Ainsi, depuis un serveur nous pouvons récupérer les informations sur une autre machine en spécifiant son nom (exemple avec PC-01) :
Get-CimInstance -Class win32_UserAccount -ComputerName PC-01 | Format-Table Name,SID
B. Get-LocalUser
PowerShell intègre un ensemble de commandes pour gérer les utilisateurs et groupes locaux de Windows, dont Get-LocalUser pour obtenir des informations sur les utilisateurs. Cela tombe bien, car cette commande retourne la propriété SID correspondante au SID.
Ainsi, nous pouvons obtenir tous les SID de cette façon :
Get-LocalUser | Select-Object Name, SID
Nous obtenons bien la même liste :
Voire même le SID d'un utilisateur spécifique :
Get-LocalUser -Name "Florian" | Select-Object Name, SID # ou uniquement la valeur : (Get-LocalUser -Name "Florian").SID.value
C. Get-ADUser
Bien que la commande Get-LocalUser permette de récupérer les SID des comptes sur un contrôleur de domaine Active Directory, il ne faut pas négliger la commande Get-ADUser du module PowerShell "Active Directory". Elle donne accès à l'ensemble des propriétés des objets Active Directory appartenant à la classe user.
Ainsi, pour obtenir le SID de tous les utilisateurs de l'Active Directory, cela nous donne la commande suivante :
Get-ADUser -Filter * | Select-Object Name, SID
Bien sûr, vous pouvez cibler un utilisateur spécifique en précisant son identifiant :
Get-ADUser -Identity "guy.mauve" | Select-Object Name, SID
Bien qu'il soit question des utilisateurs dans cet exemple, sachez que vous pouvez obtenir cette informations pour les groupes et les ordinateurs avec ces deux commandes : Get-ADGroup et Get-ADComputer.
III. Récupérer le SID en ligne de commande
A. Wmic
Bien que wmic soit une commande amenée à disparaître et que Microsoft ne prend plus en charge (voir cette page), elle reste une commande historique et très utile pour récupérer des informations sans passer par PowerShell.
La commande ci-dessous va permettre de lister tous les comptes utilisateurs locaux d'une machine afin d'avoir le nom et le SID de chaque compte :
wmic useraccount get name,sid
Pour récupérer le SID d'un utilisateur spécifique, nous pouvons utiliser la syntaxe ci-dessous (exemple pour l'utilisateur "Florian") mais cette commande n'est pas pris en charge sur les versions récentes de Windows et Windows Server.
wmic useraccount where name="Florian" get sid
La commande retourne l'erreur "Description = Demande non valide".
B. Whoami
La méthode la plus simple et la plus rapide d'obtenir le SID du compte actuellement ouvert sur l'ordinateur, c'est probablement avec cette commande :
whoami /user
La commande whoami est généralement utilisée pour savoir "Qui suis-je ?", autrement dit avec quel utilisateur sommes-nous actuellement connecté. Si l'on ouvre une Invite de commande pour console PowerShell avec sa session en cours, la commande retournera bien le SID de l'utilisateur actuel :
IV. Conclusion
Si vous êtes dans une situation où vous avez besoin de récupérer la liste des SID des utilisateurs d'une machine, ou le SID d'un utilisateur spécifique, vous avez un ensemble de commandes à votre disposition pour obtenir cette information en quelques secondes.
Laquelle avez-vous l'habitude d'utiliser ? Personnellement, soit Get-ADUser ou Get-CimInstance.