Verwendung von Dynamic PowerShell, um aktuelle Benutzer abzurufen

Wenn Sie mit Windows arbeiten, müssen Sie wahrscheinlich irgendwann herausfinden, welche Benutzerkonten aktuell auf einem Computer angemeldet sind. Glücklicherweise können Sie PowerShell verwenden, um aktuelle Benutzer auf lokalen oder entfernten Computern abzurufen.

Haben Sie kompromittierte Passwörter in Ihrem Active Directory? Finden Sie es mit Specops Password Auditor Free heraus.

In diesem Tutorial lernen Sie verschiedene Möglichkeiten kennen, PowerShell zu verwenden, um aktuelle Benutzer auf einem Computer zu erhalten. Die Methoden umfassen native Befehle, .NET-Klassen und Windows Management Instrumentation (WMI)-spezifische Cmdlets.

Sind Sie bereit herauszufinden, wer sich auf Ihrem Computer herumtreibt? Lassen Sie uns beginnen!

Voraussetzungen

In diesem Tutorial lernen Sie am besten, indem Sie den Beispielen folgen. Dazu benötigen Sie einen Computer mit einer modernen Windows-Version wie Windows 10, Windows Server 2012 oder neuer.

Dieses Tutorial verwendet einen Computer mit Windows Server 2019 namens DC1.

Warum PowerShell verwenden, um aktuelle Benutzer auf einem Computer abzurufen?

Zugegebenermaßen gibt es Möglichkeiten, aktuelle Benutzer auf einem Computer anzumelden, ohne PowerShell zu verwenden. Immerhin mussten Systemadministratoren schon vor PowerShell eine Möglichkeit dazu haben, oder? Wenn ja, warum dann PowerShell verwenden?

Die Ausführung derselben Aufgabe in PowerShell bietet den Vorteil, dass die Ergebnisse als Objekte behandelt werden können, die Sie manipulieren können. Wenn Sie beispielsweise ein Skript ausführen, das nach den Benutzeranmeldeinformationen fragt, kann PowerShell den Benutzernamen programmgesteuert ausfüllen, und Sie müssen nur das Passwort manuell eingeben.

Ein weiteres Beispiel aus der Praxis ist das Exportieren der Liste der aktuellen Benutzer, die sich auf einem Server angemeldet haben, in eine Datei. Dies geschieht durch die Verwendung von PowerShell, um die aktuellen Benutzer abzurufen und das Ergebnis in CSV-, HTML– oder XML-Dateien zu exportieren. Anschließend können verschiedene Automatisierungsworkflows diese Ausgabe verwenden.

Es könnte Tausende von Gründen geben, PowerShell zu verwenden, um die aktuellen Benutzer abzurufen, aber letztendlich kommt es auf Ihre Anforderungen an. Und dieses Tutorial wird Ihnen die verschiedenen Möglichkeiten zeigen, dieses Ziel zu erreichen.

Abfrage der Win32_ComputerSystem-Klasse

Lassen Sie uns mit den PowerShell-eigenen Befehlen namens Get-WMIObject und Get-CimInstance beginnen. Diese Befehle ermöglichen es Ihnen, Informationen abzufragen, einschließlich des aktuell angemeldeten Benutzers, mithilfe der Klassen der Windows-Verwaltungsinstrumentation (WMI) auf einem lokalen oder entfernten Computer.

Get-WMIObject ist der ältere (veraltete) Befehl und steht nur bis Windows PowerShell 5.1 zur Verfügung. Im Gegensatz dazu ist Get-CIMInstance der neuere, sicherere Befehl und steht bis zu den neuesten PowerShell-Versionen zur Verfügung.

Weitere Informationen finden Sie unter Get-CIMInstance vs. Get-WMIObject: Was ist der Unterschied?

Um den aktuellen Benutzer mit PowerShell zu erhalten, rufen Sie entweder den Befehl ab, der auf die Win32_ComputerSystem-Klasse abzielt. Die Win32_ComputerSystem-Klasse enthält verschiedene Eigenschaften, einschließlich der Username-Eigenschaft. Öffnen Sie dazu ein PowerShell-Fenster und führen Sie die unten stehenden Befehle aus.

# Mit dem Get-WMIObject-Befehl und Rückgabe nur der Username-Eigenschaft
(Get-WMIObject -ClassName Win32_ComputerSystem).Username

# Mit dem Get-CimInstance-Befehl und Rückgabe nur der Username-Eigenschaft
(Get-CimInstance -ClassName Win32_ComputerSystem).Username

Hinweis: Eine Abfrage der Win32_ComputerSystem-Klasse liefert nur den Benutzernamen der Person, die direkt am Computer angemeldet ist (Konsolensitzung). Wenn der Benutzer sich remotely angemeldet hat (z.B. Remote Desktop), ist der Benutzername leer.

Beide Befehle liefern das gleiche Ergebnis, wie unten gezeigt. Wenn der aktuelle Benutzer ein Domänenbenutzerkonto ist, gibt der Befehl die Domäne und den Benutzernamen zurück (domain\username). Für ein lokales Benutzerkonto wäre die Ausgabe jedoch computer\username.

Querying WMI in PowerShell to Get Current Users

Get-WMIObject und Get-CimInstance haben einen Parameter namens -computerName, der den Namen des Computers akzeptiert, den Sie abfragen möchten. Die Verwendung dieses Parameters bedeutet, dass Sie dieselben Informationen von einem Remote-Computer im Netzwerk abfragen können.

Aber wenn Sie nur den Benutzernamen ohne die Domäne erhalten müssen, ist eine Lösung, die Ausgabe mit der split()-Methode zu teilen. Führen Sie dazu den folgenden Befehl in PowerShell aus.

# Der folgende Befehl teilt die Benutzernameigenschaft in zwei Teile auf, wobei das Backslash '\' als Trennzeichen verwendet wird.
# Der Teil [1] am Ende des Befehls gibt an, dass der Befehl nur das Ergebnis an Index 1 zurückgeben soll.
# Indizes beginnen mit 0, was bedeutet, dass die Angabe von Index 1 das Ergebnis an der zweiten Position anzeigt.
((Get-WMIObject -ClassName Win32_ComputerSystem).Username).Split('\')[1]

Als Ergebnis gibt PowerShell nur den Benutzeranteil zurück, wie im Screenshot unten gezeigt.

Splitting the username property

Lesen der Windows-Umgebungsvariablen

Eine andere Möglichkeit, PowerShell zu verwenden, um den aktuellen Benutzer auf einem Computer zu erhalten, besteht darin, Werte aus den Umgebungsvariablen abzurufen. Die Umgebungsvariablen repräsentieren Daten des Betriebssystems, einschließlich des Benutzernamens des aktuellen Benutzers, unter anderem.

Es gibt drei Möglichkeiten, mit den Umgebungsvariablen zu interagieren. Unabhängig von der gewählten Methode wird dasselbe Ergebnis zurückgegeben.

Der Env PowerShell Drive

PowerShell zwischenspeichert Umgebungsvariablen und stellt sie über einen PowerShell Drive (PSDrive) namens Env: zur Verfügung. PSDrives sind Datenorte, auf die Sie wie auf ein Laufwerk auf dem Computer zugreifen können (z. B. C:), aber sie sind nur innerhalb von PowerShell zugänglich.

PowerShell erstellt automatisch das Env:-Laufwerk, sobald Sie eine PowerShell-Sitzung öffnen. Und da Env: ein Laufwerk ist, können Sie dessen Inhalt abrufen, indem Sie das Get-ChildItem-Cmdlet aufrufen, ähnlich wie Sie die Inhalte eines Dateisystemlaufwerks oder -ordners auflisten würden.

Verwenden des Env:-Laufwerks In PowerShell können Sie den aktuellen Benutzer abrufen, indem Sie den folgenden Befehl ausführen.

Get-ChildItem Env:\USERNAME

Das folgende Bild zeigt das erwartete Ergebnis. Wie Sie sehen können, gibt der Befehl das Element USERNAME und seinen entsprechenden Wert zurück, der der aktuell angemeldete Benutzer ist.

Getting the Env:\USERNAME item

Um nur den Benutzernamenwert zurückzugeben, ändern Sie den Befehl wie unten gezeigt ab und führen Sie ihn erneut in PowerShell aus.

(Get-ChildItem Env:\USERNAME).Value

Und wie unten gezeigt, gibt der Befehl nur den Benutzernamenwert als Zeichenfolge zurück.

Getting the Env:\USERNAME value

Die $env-Variable

Abgesehen davon, dass Sie auf die Umgebungsvariablen als PSDrive zugreifen und sie wie Dateien in einem Laufwerk behandeln können, besteht eine andere Möglichkeit darin, auf das Env-Laufwerk als Variable zuzugreifen. Das bedeutet, Sie können die Umgebungsvariablen mit der folgenden Syntax referenzieren.

# Das $-Zeichen kennzeichnet eine Variable
# env ist das Env-Laufwerk
# <variable> ist der Name der gewünschten Variable
$env:<variable>

Auf Grundlage der genannten Syntax führen Sie den folgenden Befehl in PowerShell aus, um den aktuellen Benutzer abzurufen.

$env:username

Wie auf dem unten stehenden Screenshot zu sehen ist, gibt der Befehl den Benutzernamen zurück.

Getting the username variable value

Die .NET Environment-Klasse

PowerShell ist eine objektorientierte Sprache und Shell. Grundsätzlich ist alles, woran Sie in PowerShell arbeiten, ein Objekt. Wenn Sie einen Befehl ausführen, ist die Ausgabe ein Objekt. Wenn Sie eine Variable deklariert haben, ist diese Variable selbst ein Objekt. Sie verstehen schon.

Diese Objekte haben eine Struktur, die den Datentyp definiert, den sie repräsentieren, ähnlich wie Baupläne. Und diese Baupläne werden als .NET-Klassen oder einfach Klassen bezeichnet.

Wie Sie bereits erwähnt haben, ist die Klasse, die mit Umgebungsvariablen verbunden ist, die Klasse Environment. Wie verwenden Sie jedoch die Klasse Environment in PowerShell, um den aktuellen Benutzer zu erhalten?

Ähnlich wie bei der $env-Variable verfügt die Environment-Klasse über eine Username-Eigenschaft, deren Wert der Benutzername des aktuellen Benutzers ist. Um den Wert der Benutzername-Eigenschaft zu erhalten, führen Sie den folgenden Befehl in PowerShell aus.

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

Neben der Username-Eigenschaft verfügt die Environment-Klasse auch über eine Methode zum Abrufen des Werts einer Umgebungsvariable. Der Name dieser Methode lautet GetEnvironmentVariable.

Um den aktuellen Benutzer mithilfe dieser Methode zu erhalten, führen Sie den folgenden Befehl aus.

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

Verwendung der .NET WindowsIdentity-Klasse

Die WindowsIdentity-Klasse ist eine weitere .NET-Klasse, die Sie in PowerShell aufrufen können, um den aktuellen Benutzer zu erhalten. Diese Klasse verfügt über eine Methode namens GetCurrentName, die ein Objekt zurückgibt, das den aktuellen Windows-Benutzer darstellt.

Um die Details des aktuellen Benutzers zu erhalten, führen Sie den folgenden Befehl aus.

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

Wie unten dargestellt, gibt der Befehl die Eigenschaften des aktuellen Benutzerobjekts zurück, einschließlich der Name-Eigenschaft. Der Wert der Name-Eigenschaft folgt dem domain\user-Konvention.

Getting the current Windows user

Um nur den Benutzernamen zurückzugeben, ändern Sie den vorherigen Befehl so, dass nur die Name-Eigenschaft ausgewählt und die Zeichenkettenaufteilungstechnik angewendet wird. Kopieren Sie dazu den folgenden Befehl und führen Sie ihn in PowerShell aus.

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

Verwendung des whoami-Befehls

Ein weiterer praktischer Befehl, mit dem Sie schnell den aktuellen Benutzer erhalten können, ist der whoami-Befehl. Dieser Befehl ist eine ausführbare Datei, die Sie im %WINDIR%\System32-Ordner unter dem Dateinamen whoami.exe finden können.

Um den Benutzernamen des aktuellen Benutzers zu erhalten, führen Sie den folgenden Befehl aus.

whoami

Daraufhin gibt der Befehl das Ergebnis im Format domänenbenutzername zurück, wie im Screenshot unten dargestellt.

Getting the username using whoami

Um den Benutzernamen ohne die Domäne zu erhalten, wenden Sie die zuvor in diesem Tutorial erlernte Zeichenkettenaufteilungstechnik an, indem Sie den folgenden Befehl ausführen.

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

Der Befehl whoami kann auch den vollqualifizierten Distinguished Name (FQDN) des aktuellen Benutzers und den Benutzernamen des Hauptbenutzers (UPN) zurückgeben. Diese Befehlsausgabe kann nützlich sein, wenn Sie ein Skript ausführen möchten, das die Identität des aktuellen Benutzers über den Benutzernamen hinaus abruft.

Führen Sie den folgenden Befehl in PowerShell aus, um den FQDN und UPN des aktuellen Benutzers zu erhalten.

# Den FQDN des aktuellen Benutzers abrufen
whoami /fqdn

# Den UPN des aktuellen Benutzers abrufen
whoami /upn
Getting the current user’s FQDN and UPN

Hinweis: Die Werte FQDN und UPN sind nur verfügbar, wenn der aktuell angemeldete Benutzer ein Domänenbenutzer ist. Wenn Sie versuchen, diese Werte für einen lokalen Benutzer abzurufen, gibt der Befehl einen Fehler zurück, wie unten gezeigt.

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

Verwenden Sie den Befehl query

. Wenn Sie ein Systemadministrator oder Domänenbenutzer sind, haben Sie wahrscheinlich mindestens einmal über das Remote Desktop Protocol (RDP) eine Verbindung zu einer Remotemaschine hergestellt, um Ressourcen zu verwalten oder Anwendungen zu verwenden. Aus welchem Grund auch immer, Sie möchten wissen, wer derzeit angemeldet ist und Systemressourcen verwendet.

Glücklicherweise verfügt Windows über ein integriertes Befehlszeilentool namens query, mit dem alle aktuell angemeldeten Benutzer auf einem Computer aufgelistet werden können. Der Befehl zeigt auch an, ob der Benutzer über eine Remotedesktopsitzung oder lokal am Computer angemeldet ist.

Der Befehl query verfügt über zwei Parameter, die für das Abrufen der angemeldeten Benutzer relevant sind: session und user. Der Parameter session listet die Computersitzungen auf, während der Parameter user die Benutzer und ihre Sitzungen auflistet.

Der Befehl query session hat ein Alias namens qwinsta, während das Befehlsalias für query user quser ist.

Führen Sie beispielsweise den folgenden Befehl aus, um die Sitzungen auf DC1 aufzulisten.

# Sitzungen auf DC1 abfragen
qwinsta /server:dc1

Das untenstehende Bild zeigt die Ausgabe des Befehls. In diesem Beispiel haben sich zwei Benutzer am Computer DC1 angemeldet – einer in der Konsolensitzung und ein anderer über RDP. Wie Sie sehen können, gibt qwinsta alle Sitzungen zurück, auch diejenigen, die nicht von Benutzern verwendet werden.

Querying sessions

Wenn Sie qwinsta oder quser ohne das Argument /server:<computer> allein ausführen, wird entweder Befehl standardmäßig den lokalen Computer abfragen.

Anschließend, um alle Benutzer mit bestehenden Anmeldesitzungen aufzulisten, führen Sie den folgenden Befehl aus:

# Benutzer auf DC1 abfragen
quser /server:dc1

Nach Ausführung des Befehls werden Sie sofort feststellen, dass quser die Sitzungen und Benutzer wie der qwinsta-Befehl zurückgibt. Aber dieses Mal gibt es keine leeren Sitzungen.

Es gibt auch zwei zusätzliche Spalten: INAKTIVE ZEIT, die die Leerlaufzeit der Benutzer zeigt, und ANMELDEZEIT, die den Anmeldezeitstempel der Benutzer zeigt.

Querying users

Am Ende ist quser im Vergleich zu den Ergebnissen von qwinsta und quser der geeignetere Befehl in PowerShell, um aktuelle Benutzer zu erhalten.

Haben Sie kompromittierte Passwörter in Ihrem Active Directory? Finden Sie es heraus mit Specops Password Auditor Free.

Schlussfolgerung

Während es in PowerShell viele Möglichkeiten gibt, die aktuellen Benutzer anzusehen, hängt die beste Methode von dem beabsichtigten Ergebnis und der Verwendung ab.

Die nativen WMI-bezogenen Cmdlets und der query-Befehl ermöglichen es Ihnen, die angemeldeten Benutzer auf einem lokalen oder entfernten Computer zu erhalten. Die Verwendung von .NET-Klassen und Umgebungsvariablen bietet schnelle Möglichkeiten, die gleichen Ergebnisse nur auf dem lokalen Computer abzurufen.

Ob Sie nun ein Skript ausführen oder die Ergebnisse manuell auf dem Bildschirm anzeigen möchten, es gibt eine Methode, die Ihren Anforderungen entsprechen würde, um in PowerShell den aktuellen Benutzer zu erhalten. Was kommt als Nächstes? Vielleicht lernen Sie, wie Sie die Ergebnisse des Query-Befehls analysieren und sie in PowerShell-Objekte umwandeln, indem Sie Funktionen mit RegEx schreiben?

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