Utilisation du PowerShell dynamique pour obtenir les utilisateurs actuels

Lorsque vous travaillez avec Windows, à un moment donné, vous devrez probablement découvrir quels comptes d’utilisateur sont actuellement connectés à un ordinateur. Heureusement, vous pouvez utiliser PowerShell pour obtenir les utilisateurs actuels sur des ordinateurs locaux ou distants.

Avez-vous des mots de passe compromis dans votre Active Directory? Découvrez-le avec Specops Password Auditor Free.

Dans ce tutoriel, vous apprendrez plusieurs façons d’utiliser PowerShell pour obtenir les utilisateurs actuels sur un ordinateur. Les méthodes que vous apprendrez incluront des commandes natives, des classes .NET et des cmdlets spécifiques à Windows Management Instrumentation (WMI).

Êtes-vous prêt à découvrir qui se cache sur votre ordinateur? Commençons!

Prérequis

Dans ce tutoriel, vous apprendrez mieux en suivant les exemples. Et pour ce faire, vous aurez besoin d’un ordinateur fonctionnant sous une version moderne de Windows, comme Windows 10, Windows Server 2012, ou ultérieur.

Ce tutoriel utilisera un ordinateur fonctionnant sous Windows Server 2019 nommé DC1.

Pourquoi utiliser PowerShell pour obtenir les utilisateurs actuellement connectés à un ordinateur?

Il est vrai qu’il existe des moyens de connecter les utilisateurs actuels à un ordinateur sans utiliser PowerShell. Après tout, les administrateurs système devaient avoir une méthode pour le faire même avant PowerShell, n’est-ce pas ? Si c’est le cas, pourquoi utiliser PowerShell ?

Effectuer la même tâche en utilisant PowerShell présente l’avantage de traiter les résultats comme des objets que vous pouvez manipuler. Par exemple, si vous exécutez un script qui demande les informations d’identification de l’utilisateur, PowerShell peut remplir automatiquement le nom d’utilisateur, et vous n’avez qu’à taper manuellement le mot de passe.

Un autre exemple concret est l’exportation de la liste des utilisateurs actuellement connectés à un serveur dans un fichier. Cela peut être réalisé en utilisant PowerShell pour obtenir les utilisateurs actuels, puis exporter le résultat dans des fichiers CSV, HTML ou XML. Ensuite, divers flux de travail d’automatisation peuvent utiliser cette sortie.

Il peut y avoir des milliers de raisons d’utiliser PowerShell pour obtenir les utilisateurs actuels, mais cela dépend finalement de vos besoins. Et ce tutoriel vous apprendra les différentes façons d’atteindre cet objectif.

Interrogation de la classe Win32_ComputerSystem.

Commençons par les cmdlets natifs PowerShell appelés Get-WMIObject et Get-CimInstance. Ces cmdlets vous permettent de interroger des informations, y compris l’utilisateur actuellement connecté, en utilisant les classes Windows Management Instrumentation (WMI) sur un ordinateur local ou distant.

Get-WMIObject est le cmdlet plus ancien (déprécié) et est disponible uniquement jusqu’à Windows PowerShell 5.1. En revanche, Get-CIMInstance est le cmdlet plus récent et plus sécurisé et est disponible jusqu’aux dernières versions de PowerShell.

Pour en savoir plus, visitez Get-CIMInstance Vs. Get-WMIObject: Quelle est la différence?

Pour utiliser PowerShell afin d’obtenir l’utilisateur actuel, invoquez la cmdlet ciblant la classe Win32_ComputerSystem. La classe Win32_ComputerSystem comprend diverses propriétés, notamment la propriété Username. Pour ce faire, ouvrez une fenêtre PowerShell et exécutez les commandes ci-dessous.

# Utilisation de la cmdlet Get-WMIObject et retour de la propriété Username uniquement
(Get-WMIObject -ClassName Win32_ComputerSystem).Username

# Utilisation de la cmdlet Get-CimInstance et retour de la propriété Username uniquement
(Get-CimInstance -ClassName Win32_ComputerSystem).Username

Note : Interroger la classe Win32_ComputerSystem ne renverra que le nom d’utilisateur de la personne connectée directement à l’ordinateur (session console). Si l’utilisateur s’est connecté à distance (par exemple, Bureau à distance), le nom d’utilisateur sera vide.

Les deux commandes renvoient le même résultat, comme illustré ci-dessous. Si l’utilisateur actuel est un compte utilisateur de domaine, la commande renverra le domaine et le nom d’utilisateur (domaine\nom_utilisateur). Mais pour un compte utilisateur local, la sortie serait ordinateur\nom_utilisateur.

Querying WMI in PowerShell to Get Current Users

Get-WMIObject et Get-CimInstance ont un paramètre appelé -computerName, qui accepte le nom de l’ordinateur à interroger. Utiliser ce paramètre signifie que vous pouvez interroger les mêmes informations à partir d’une machine distante dans le réseau.

Mais si vous avez besoin d’obtenir uniquement le nom d’utilisateur sans le domaine, une solution consiste à diviser la sortie en utilisant la méthode split(). Pour ce faire, exécutez la commande suivante dans PowerShell.

# La commande ci-dessous divisera la propriété du nom d'utilisateur en deux en utilisant le caractère backslash '\' comme délimiteur.
# La partie [1] à la fin indique à la commande de ne renvoyer que le résultat à l'index 1.
# Les index commencent à 0, ce qui signifie que spécifier l'index 1 affichera le résultat à la deuxième position.
((Get-WMIObject -ClassName Win32_ComputerSystem).Username).Split('\')[1]

En conséquence, PowerShell renvoie uniquement la partie utilisateur, comme le montre la capture d’écran ci-dessous.

Splitting the username property

La lecture des variables d’environnement Windows

Une autre manière d’utiliser PowerShell pour obtenir l’utilisateur actuel sur un ordinateur consiste à récupérer les valeurs des variables d’environnement. Les variables d’environnement représentent les données du système d’exploitation, notamment le nom d’utilisateur actuel, entre autres.

Il existe trois façons d’interagir avec les variables d’environnement. Peu importe la méthode que vous choisissez, le résultat sera le même.

Le lecteur Env PowerShell

PowerShell met en cache les variables d’environnement et les rend disponibles via un lecteur PowerShell (PSDrive) appelé le lecteur Env:. Les PSDrives sont des emplacements de données auxquels vous pouvez accéder comme un lecteur sur l’ordinateur (par exemple, C:), mais qui ne sont accessibles qu’à l’intérieur de PowerShell.

PowerShell crée automatiquement le lecteur Env: dès l’ouverture d’une session PowerShell. Et parce que Env: est un lecteur, vous pouvez obtenir son contenu en invoquant la cmdlet Get-ChildItem, de manière similaire à la liste du contenu d’un lecteur ou d’un dossier de système de fichiers.

Utilisation du lecteur Env: Dans PowerShell, obtenez l’utilisateur actuel en exécutant la commande ci-dessous.

Get-ChildItem Env:\USERNAME

La capture d’écran ci-dessous montre le résultat attendu. Comme vous pouvez le voir, la commande retourne l’élément USERNAME et sa valeur correspondante, qui est l’utilisateur actuellement connecté.

Getting the Env:\USERNAME item

Pour ne retourner que la valeur du nom d’utilisateur, modifiez la commande comme indiqué ci-dessous et exécutez-la à nouveau dans PowerShell.

(Get-ChildItem Env:\USERNAME).Value

Et comme vous pouvez le voir ci-dessous, la commande ne retourne que la valeur du nom d’utilisateur en tant que chaîne.

Getting the Env:\USERNAME value

La variable $env

Outre l’accès aux variables d’environnement en tant que PSDrive en les traitant comme des fichiers dans un lecteur, une autre façon est d’accéder au lecteur Env en tant que variable. Cela signifie que vous pouvez référencer les variables d’environnement en utilisant la syntaxe ci-dessous.

# Le signe $ indique une variable
# env est le lecteur Env
#  est le nom de la variable que vous souhaitez obtenir
$env:<variable>

Sur la base de la syntaxe mentionnée, exécutez la commande ci-dessous dans PowerShell pour obtenir l’utilisateur actuel.

$env:username

Comme le montre la capture d’écran ci-dessous, la commande renvoie la valeur du nom d’utilisateur.

Getting the username variable value

La classe Environment .NET

PowerShell est un langage orienté objet et une interface de ligne de commande. Essentiellement, tout ce sur quoi vous travaillez dans PowerShell est un objet. Lorsque vous exécutez une commande, la sortie est un objet. Si vous avez déclaré une variable, cette variable est elle-même un objet. Vous avez l’idée.

Ces objets ont une structure qui définit le type de données qu’ils représentent, similaire à des plans. Et ces plans sont appelés classes .NET ou simplement classes.

Quant aux variables d’environnement, la classe associée est la classe Environment. Alors, comment utiliser la classe Environment dans PowerShell pour obtenir l’utilisateur actuel ?

Tout comme la variable $env, la classe Environment possède une propriété Username, dont la valeur est le nom d’utilisateur actuel. Pour obtenir la valeur de la propriété Username, exécutez la commande ci-dessous dans PowerShell.

[System.Environment]::UserName
Getting the environment username property value

Outre la propriété Username, la classe Environment possède également une méthode pour obtenir la valeur d’une variable d’environnement. Le nom de la méthode est GetEnvironmentVariable.

Pour obtenir l’utilisateur actuel à l’aide de cette méthode, exécutez la commande ci-dessous.

[System.Environment]::GetEnvironmentVariable('username')
Getting the environment variable value

Utilisation de la classe WindowsIdentity .NET

La classe WindowsIdentity est une autre classe .NET que vous pouvez invoquer dans PowerShell pour obtenir l’utilisateur actuel. Cette classe a une méthode appelée GetCurrentName, qui renvoie un objet représentant l’utilisateur Windows actuel.

Pour obtenir les détails de l’utilisateur actuel, exécutez la commande ci-dessous.

[System.Security.Principal.WindowsIdentity]::GetCurrent()

Comme vous pouvez le voir ci-dessous, la commande renvoie les propriétés de l’objet utilisateur actuel, y compris la propriété Name. La valeur de la propriété Name suit la convention domaine\utilisateur.

Getting the current Windows user

Pour ne retourner que la partie du nom d’utilisateur, modifiez la commande précédente pour sélectionner uniquement la propriété Name et appliquez la technique de découpage de chaîne. Pour ce faire, copiez la commande ci-dessous et exécutez-la dans PowerShell.

([System.Security.Principal.WindowsIdentity]::GetCurrent().Name).Split('\')[1]
Returning only the username part

Utilisation de la commande whoami

Une autre commande pratique qui vous permet d’obtenir rapidement l’utilisateur actuel est la commande whoami. Cette commande est un fichier exécutable que vous pouvez trouver dans le dossier %WINDIR%\System32 avec le nom de fichier whoami.exe.

Pour obtenir le nom d’utilisateur actuel, exécutez la commande ci-dessous.

whoami

La commande renvoie ensuite le résultat au format domaine nom d'utilisateur, comme sur la capture d’écran ci-dessous.

Getting the username using whoami

Pour obtenir le nom d’utilisateur sans le domaine, appliquez la technique de division de chaîne que vous avez apprise précédemment dans ce tutoriel en exécutant la commande ci-dessous.

(whoami).Split('\')[1]
Getting the username without the domain

La commande whoami peut également renvoyer le nom distingué entièrement qualifié (FQDN) actuel de l’utilisateur et le nom principal de l’utilisateur (UPN). Cette sortie de commande peut être utile si vous prévoyez d’exécuter un script qui récupère l’identité actuelle de l’utilisateur au-delà du nom d’utilisateur.

Exécutez la commande ci-dessous dans PowerShell pour obtenir le FQDN et l’UPN de l’utilisateur actuel.

# Obtenez le FQDN de l'utilisateur actuel
whoami /fqdn

# Obtenez l'UPN de l'utilisateur actuel
whoami /upn
Getting the current user’s FQDN and UPN

Note : Les valeurs de FQDN et d’UPN ne sont disponibles que si l’utilisateur actuellement connecté est un utilisateur de domaine. Si vous essayez d’obtenir ces valeurs pour un utilisateur local, la commande renverra une erreur, comme indiqué ci-dessous.

Error getting the UPN and FQDN of a non-domain user account

Utilisation de la commande query

Si vous êtes administrateur système ou utilisateur de domaine, il est fort probable que vous vous soyez connecté à distance à une machine via le protocole Bureau à distance (RDP) au moins une fois, peut-être pour gérer des ressources ou utiliser des applications. Quelle que soit la raison, vous voudriez savoir qui est actuellement connecté et utilise les ressources système.

Heureusement, Windows dispose d’un outil en ligne de commande intégré appelé query qui peut répertorier tous les utilisateurs actuellement connectés sur un ordinateur. La commande vous montre également si l’utilisateur s’est connecté via une session de bureau à distance ou localement sur l’ordinateur.

La commande query possède deux paramètres pertinents pour obtenir les utilisateurs connectés ; session et user. Le paramètre session répertorie les sessions d’ordinateur, tandis que le paramètre user répertorie les utilisateurs et leurs sessions.

La commande query session possède un alias appelé qwinsta, tandis que l’alias de commande pour query user est quser.

Par exemple, exécutez la commande ci-dessous pour répertorier les sessions sur DC1.

# sessions de requête sur DC1
qwinsta /server:dc1

Le screenshot ci-dessous montre la sortie de la commande. Dans cet exemple, deux utilisateurs se sont connectés à l’ordinateur DC1, l’un dans la session console et l’autre via RDP. Comme vous pouvez le voir, qwinsta renvoie toutes les sessions, même celles sans utilisateur.

Querying sessions

Si vous exécutez qwinsta ou quser seul, sans l’argument /server:<ordinateur>, chaque commande interrogera l’ordinateur local par défaut.

Ensuite, pour lister tous les utilisateurs ayant des sessions ouvertes, exécutez la commande user ci-dessous.

# interroger les utilisateurs sur DC1
quser /server:dc1

Après avoir exécuté la commande, vous remarquerez immédiatement que quser renvoie les sessions et les utilisateurs comme la commande qwinsta. Mais cette fois, il n’y a pas de sessions vides.

Il y a également deux colonnes supplémentaires : IDLE TIME, qui montre le temps d’inactivité des utilisateurs, et LOGON TIME montrant l’horodatage de la connexion des utilisateurs.

Querying users

En fin de compte, en comparant les résultats de qwinsta et quser, quser est la commande plus appropriée en PowerShell pour obtenir les utilisateurs actuels.

Avez-vous des mots de passe compromis dans votre Active Directory ? Découvrez-le avec Specops Password Auditor Free.

Conclusion

Alors qu’il existe de nombreuses façons d’obtenir les utilisateurs actuellement connectés en PowerShell, la méthode la plus appropriée dépend du résultat que vous souhaitez obtenir et de la manière dont vous allez l’utiliser.

Les cmdlets natives liées à WMI et la commande query vous permettent d’obtenir les utilisateurs connectés sur un ordinateur local ou distant. L’utilisation des classes .NET et des variables d’environnement offre des moyens rapides d’obtenir les mêmes résultats, mais uniquement sur l’ordinateur local.

Que vous prévoyiez d’exécuter un script ou d’afficher manuellement les résultats à l’écran, il existe une méthode adaptée à vos besoins pour utiliser PowerShell afin d’obtenir l’utilisateur actuel. Quelle est la prochaine étape ? Peut-être apprendre à analyser les résultats de la commande query et les convertir en objets PowerShell en écrivant des fonctions avec des expressions régulières ?

Source:
https://adamtheautomator.com/powershell-get-current-user/