Gebruik van Dynamic PowerShell om Huidige Gebruikers te Krijgen

Wanneer je met Windows werkt, zul je op een gegeven moment waarschijnlijk moeten achterhalen welke gebruikersaccounts momenteel zijn aangemeld op een computer. Gelukkig kun je PowerShell gebruiken om huidige gebruikers op lokale of externe computers te krijgen.

Heb je gecompromitteerde wachtwoorden in je Active Directory? Ontdek het met Specops Password Auditor Free.

In deze tutorial leer je verschillende manieren om PowerShell te gebruiken om huidige gebruikers op een computer te krijgen. De methoden die je leert zullen native commando’s, .NET classes, en Windows Management Instrumentation (WMI) specifieke cmdlets omvatten.

Ben je klaar om uit te vinden wie er op de loer ligt op je computer? Laten we beginnen!

Vereisten

In deze tutorial leer je het best door de voorbeelden te volgen. En om dat te doen, heb je een computer nodig die draait op een moderne versie van Windows, zoals Windows 10, Windows Server 2012, of later.

Deze tutorial zal een computer gebruiken die draait op Windows Server 2019 met de naam DC1.

Waarom PowerShell Gebruiken om Huidige Gebruikers Aangemeld op een Computer te Krijgen?

Toegegeven, er zijn manieren om huidige gebruikers op een computer ingelogd te krijgen zonder PowerShell. Immers, systeembeheerders moesten toch al een manier hebben gehad om dit te doen zelfs vóór PowerShell, toch? Zo ja, waarom PowerShell gebruiken?

Hetzelfde taak uitvoeren in PowerShell heeft als voordeel dat de resultaten worden behandeld als objecten die je kunt manipuleren. Als je bijvoorbeeld een script uitvoert dat vraagt om de gebruikersreferenties, kan PowerShell programmatisch de gebruikersnaam invullen, en hoef je alleen het wachtwoord handmatig in te voeren.

Nog een voorbeeld uit de praktijk is het exporteren van de lijst met momenteel ingelogde gebruikers op een server naar een bestand. Dit gebeurt door PowerShell te gebruiken om de huidige gebruikers op te halen en vervolgens het resultaat te exporteren naar CSV, HTML of XML-bestanden. Daarna kunnen verschillende geautomatiseerde workflows deze uitvoer gebruiken.

Er kunnen duizenden redenen zijn om PowerShell te gebruiken om huidige gebruikers op te halen, maar uiteindelijk komt het allemaal neer op je vereisten. En deze tutorial zal je de verschillende manieren leren om dat doel te bereiken.

Opvragen van de Win32_ComputerSystem-klasse

Laten we beginnen met de PowerShell-native cmdlets genaamd Get-WMIObject en Get-CimInstance. Deze cmdlets stellen je in staat informatie op te vragen, inclusief de momenteel ingelogde gebruiker, met behulp van de Windows Management Instrumentation (WMI)-klassen op een lokaal of extern computersysteem.

Get-WMIObject is de oudere (verouderde) cmdlet en is alleen beschikbaar tot Windows PowerShell 5.1. Daarentegen is Get-CIMInstance de nieuwere, meer beveiligde cmdlet en is beschikbaar tot de laatste versies van PowerShell.

Om meer te weten te komen, bezoek Get-CIMInstance Vs. Get-WMIObject: Wat is het verschil?

Om PowerShell te gebruiken om de huidige gebruiker op te halen, roep je de cmdlet aan die gericht is op de Win32_ComputerSystem class. De Win32_ComputerSystem class bevat verschillende eigenschappen, waaronder de Username eigenschap. Doe dit door een PowerShell-venster te openen en de onderstaande commando’s uit te voeren.

# Gebruik de Get-WMIObject cmdlet en geef alleen de Username eigenschap terug
(Get-WMIObject -ClassName Win32_ComputerSystem).Username

# Gebruik de Get-CimInstance cmdlet en geef alleen de Username eigenschap terug
(Get-CimInstance -ClassName Win32_ComputerSystem).Username

Let op: Het bevragen van de Win32_ComputerSystem class zal alleen de gebruikersnaam opleveren van degene die rechtstreeks op de computer is ingelogd (console sessie). Als de gebruiker extern is ingelogd (bijv. Remote Desktop), zal de gebruikersnaam leeg zijn.

Beide commando’s leveren hetzelfde resultaat op, zoals hieronder getoond. Als de huidige gebruiker een domeingebruikersaccount is, zal het commando het domein en de gebruikersnaam teruggeven (domein\gebruikersnaam). Maar voor een lokaal gebruikersaccount zou de uitvoer computer\gebruikersnaam zijn.

Querying WMI in PowerShell to Get Current Users

Get-WMIObject en Get-CimInstance hebben een parameter genaamd -computerName, die de naam van de computer accepteert om te bevragen. Door deze parameter te gebruiken, kunt u dezelfde informatie opvragen vanaf een externe machine in het netwerk.

Maar als u alleen de gebruikersnaam zonder het domein moet krijgen, is een oplossing om de uitvoer te splitsen met behulp van de split() methode. Voer hiervoor het onderstaande commando uit in PowerShell.

# Het onderstaande commando zal de gebruikersnaam eigenschap in tweeën splitsen met behulp van het backslash '\' karakter als scheidingsteken.
# Het [1] gedeelte aan het einde vertelt het commando om alleen het resultaat op index 1 terug te geven.
# Indexen beginnen met 0, wat betekent dat het specificeren van index 1 het resultaat op de tweede positie zal tonen.
((Get-WMIObject -ClassName Win32_ComputerSystem).Username).Split('\')[1]

Als gevolg hiervan geeft PowerShell alleen het gebruikersdeel terug, zoals te zien is op de onderstaande screenshot.

Splitting the username property

Lezen van de Windows Omgevingsvariabelen

Een andere manier om PowerShell te gebruiken om de huidige gebruiker op een computer te krijgen, is door waarden op te halen uit de omgevingsvariabelen. De omgevingsvariabelen vertegenwoordigen de gegevens van het besturingssysteem, inclusief de gebruikersnaam van de huidige gebruiker, onder andere.

Er zijn drie manieren om met de omgevingsvariabelen om te gaan. Welke manier je ook kiest, het zou hetzelfde resultaat opleveren.

De Env PowerShell Drive

PowerShell cached omgevingsvariabelen en maakt ze beschikbaar via een PowerShell Drive (PSDrive) genaamd de Env: drive. PSDrives zijn gegevenslocaties die je kunt openen als een drive op de computer (bijv. C:), maar zijn alleen toegankelijk binnen PowerShell.

PowerShell maakt automatisch het Env:-station aan zodra je een PowerShell-sessie opent. En omdat Env: een station is, kun je de inhoud ervan ophalen door het Get-ChildItem-cmdlet aan te roepen, vergelijkbaar met hoe je de inhoud van een bestandssysteemstation of map zou weergeven.

Gebruik van het Env:-station in PowerShell, haal de huidige gebruiker op door het onderstaande commando uit te voeren.

Get-ChildItem Env:\USERNAME

De onderstaande schermafbeelding toont het verwachte resultaat. Zoals je kunt zien, retourneert het commando het item USERNAME en de bijbehorende waarde, die de momenteel aangemelde gebruiker is.

Getting the Env:\USERNAME item

Om alleen de gebruikersnaamwaarde terug te geven, wijzig je het commando zoals hieronder weergegeven en voer je het opnieuw uit in PowerShell.

(Get-ChildItem Env:\USERNAME).Value

En zoals je hieronder kunt zien, retourneert het commando alleen de gebruikersnaamwaarde als een string.

Getting the Env:\USERNAME value

De $env-variabele

Naast het benaderen van de omgevingsvariabelen als een PSDrive door ze te behandelen als bestanden op een station, is een andere manier het benaderen van het Env-station als een variabele. Dit betekent dat je de omgevingsvariabelen kunt refereren met de onderstaande syntaxis.

# Het dollarteken geeft een variabele aan
# env is de Env-drive
# <variabele> is de naam van de variabele die je wilt ophalen
$env:<variable>

Op basis van de genoemde syntaxis, voer de onderstaande opdracht uit in PowerShell om de huidige gebruiker te krijgen.

$env:username

Zoals te zien is in de onderstaande schermafbeelding, geeft de opdracht de gebruikersnaam terug.

Getting the username variable value

De .NET Environment Class

PowerShell is een objectgeoriënteerde taal en shell. In feite is alles waaraan je werkt binnen PowerShell een object. Wanneer je een opdracht uitvoert, is de uitvoer een object. Als je een variabele declareert, is die variabele zelf een object. Je begrijpt het idee.

Deze objecten hebben een structuur die het gegevenstype dat ze vertegenwoordigen definieert, vergelijkbaar met blauwdrukken. En deze blauwdrukken worden .NET-klassen of simpelweg klassen genoemd.

Als het gaat om omgevingsvariabelen, is de bijbehorende klasse de Environment-klasse. Hoe gebruik je de Environment-klasse in PowerShell om de huidige gebruiker te krijgen?

Net als de $env-variabele heeft de Environment-klasse een Username-eigenschap, waarvan de waarde de gebruikersnaam van de huidige gebruiker is. Voer het onderstaande commando uit in PowerShell om de waarde van de gebruikersnaam op te halen.

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

Naast de Username-eigenschap heeft de Environment-klasse ook een methode om de waarde van een omgevingsvariabele op te halen. De naam van de methode is GetEnvironmentVariable.

Om de huidige gebruiker met deze methode te krijgen, voer het onderstaande commando uit.

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

Gebruik van de .NET WindowsIdentity-klasse

De klasse WindowsIdentity is nog een andere .NET-klasse die je kunt oproepen in PowerShell om de huidige gebruiker te krijgen. Deze klasse heeft een methode genaamd GetCurrentName, die een object retourneert dat de huidige Windows-gebruiker voorstelt.

Om de details van de huidige gebruiker te krijgen, voer je onderstaand commando uit.

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

Zoals je hieronder kunt zien, retourneert het commando de eigenschappen van het huidige gebruikersobject, inclusief de eigenschap Name. De waarde van de eigenschap Name volgt het formaat domein\gebruiker.

Getting the current Windows user

Om alleen het gebruikersnaamgedeelte terug te krijgen, pas je het vorige commando aan om alleen de eigenschap Name te selecteren en de techniek van het splitsen van strings toe te passen. Kopieer hiervoor het onderstaande commando en voer het uit in PowerShell.

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

Gebruik van het whoami-commando

Nog een handig commando waarmee je snel de huidige gebruiker kunt krijgen, is het whoami-commando. Dit commando is een uitvoerbaar bestand dat je kunt vinden in de %WINDIR%\System32-map met de bestandsnaam whoami.exe.

Om de gebruikersnaam van de huidige gebruiker te krijgen, voer je onderstaand commando uit.

whoami

Het commando retourneert vervolgens het resultaat in het formaat domein gebruikersnaam, zoals te zien is in de onderstaande screenshot.

Getting the username using whoami

Om de gebruikersnaam zonder het domein te verkrijgen, pas de eerder geleerde techniek voor string splitsen toe door de onderstaande opdracht uit te voeren.

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

De opdracht whoami kan ook de volledige gekwalificeerde onderscheidende naam (FQDN) van de huidige gebruiker en de gebruikersprincipe-naam (UPN) retourneren. en . Deze uitvoer van de opdracht kan handig zijn als je van plan bent een script uit te voeren dat de identiteit van de huidige gebruiker ophaalt, verder dan de gebruikersnaam.

Voer de onderstaande opdracht uit in PowerShell om de FQDN en UPN van de huidige gebruiker te verkrijgen.

# Verkrijg de FQDN van de huidige gebruiker
whoami /fqdn

# Verkrijg de UPN van de huidige gebruiker
whoami /upn
Getting the current user’s FQDN and UPN

Opmerking: De waarden van FQDN en UPN zijn alleen beschikbaar als de momenteel aangemelde gebruiker een domeingebruiker is. Als je deze waarden probeert te verkrijgen voor een lokale gebruiker, zal de opdracht een foutmelding retourneren, zoals hieronder getoond.

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

Het gebruik van de query Opdracht

Als je een systeembeheerder of een domeingebruiker bent, is de kans groot dat je minstens één keer via het Remote Desktop Protocol (RDP) op een externe machine bent ingelogd, misschien om resources te beheren of applicaties te gebruiken. Wat de reden ook is, je zou willen weten wie er momenteel is ingelogd en systeembronnen gebruikt.

Gelukkig heeft Windows een ingebouwd command-line hulpprogramma genaamd query dat alle momenteel aangemelde gebruikers op een computer kan weergeven. Het commando laat ook zien of de gebruiker is aangemeld via een externe desktopsessie of lokaal op de computer.

Het query-commando heeft twee relevante parameters voor het ophalen van de aangemelde gebruikers; session en user. De session-parameter geeft de computersessies weer, terwijl de user-parameter de gebruikers en hun sessies weergeeft.

Het query session-commando heeft een alias genaamd qwinsta, terwijl de commando-alias voor query user quser is.

Bijvoorbeeld, voer het onderstaande commando uit om de sessies op DC1 weer te geven.

# sessies opvragen op DC1
qwinsta /server:dc1

De onderstaande schermafbeelding toont de uitvoer van de opdracht. In dit voorbeeld hebben twee gebruikers zich aangemeld bij de computer DC1 – één in de console-sessie en een andere via RDP. Zoals je kunt zien, geeft qwinsta alle sessies terug, zelfs de niet-gebruikerssessies.

Querying sessions

Als je qwinsta of quser alleen uitvoert zonder het argument /server:<computer>, zal elk van beide commando’s standaard de lokale computer bevragen.

Vervolgens, om alle gebruikers met bestaande aanmeldingssessies op te lijsten, voer je het onderstaande user-commando uit.

# Gebruikers op DC1 bevragen
quser /server:dc1

Na het uitvoeren van het commando, zul je meteen merken dat quser de sessies en gebruikers teruggeeft, net als het qwinsta-commando. Maar deze keer zijn er geen lege sessies.

Er zijn ook twee extra kolommen: IDLE TIME, die de inactieve tijd van de gebruikers weergeeft, en LOGON TIME die de inlogtijd van de gebruikers toont.

Querying users

Uiteindelijk, bij het vergelijken van de resultaten van qwinsta en quser, is quser het meest geschikte commando in PowerShell om huidige gebruikers op te halen.

Heb je gecompromitteerde wachtwoorden in je Active Directory? Ontdek het met Specops Password Auditor Free.

Conclusie

Terwijl er in PowerShell veel manieren zijn om de huidige ingelogde gebruikers op te halen, hangt de beste methode af van het resultaat dat je wilt verkrijgen en hoe je het zult gebruiken.

De ingebouwde WMI-gerelateerde cmdlets en het query-commando stellen je in staat om de ingelogde gebruikers op een lokaal of extern computersysteem te verkrijgen. Het gebruik van .NET-klassen en omgevingsvariabelen biedt snelle manieren om dezelfde resultaten op te halen, maar alleen op de lokale computer.

Of je nu van plan bent om een script uit te voeren of de resultaten handmatig op het scherm weer te geven, er is een methode die aan je eisen voldoet om PowerShell te gebruiken om de huidige gebruiker op te halen. Wat is de volgende stap? Misschien leren hoe je de resultaten van het query-commando kunt ontleden en ze kunt omzetten naar PowerShell-objecten door functies te schrijven met behulp van RegEx?

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