Utilizzando PowerShell dinamico per ottenere gli utenti attuali

Quando lavori con Windows, a un certo punto, probabilmente dovrai scoprire quali account utente sono attualmente collegati a un computer. Fortunatamente, puoi utilizzare PowerShell per ottenere gli utenti attuali su computer locali o remoti.

Hai password compromesse nel tuo Active Directory? Scoprilo con Specops Password Auditor Free.

In questo tutorial, imparerai diversi modi per utilizzare PowerShell per ottenere gli utenti attuali su un computer. I metodi che imparerai includeranno comandi nativi, classi .NET e cmdlet specifici di Gestione Windows (WMI).

Sei pronto a scoprire chi si nasconde sul tuo computer? Iniziamo!

Prerequisiti

In questo tutorial, imparerai meglio seguendo gli esempi. E per farlo, avrai bisogno di un computer che esegua una qualsiasi versione moderna di Windows, come Windows 10, Windows Server 2012 o successivi.

Questo tutorial utilizzerà un computer che esegue Windows Server 2019 chiamato DC1.

Perché usare PowerShell per ottenere gli utenti attualmente collegati a un computer?

Ammettiamolo, ci sono modi per accedere agli utenti attualmente connessi a un computer senza PowerShell. Dopotutto, gli amministratori di sistema dovevano averne uno anche prima di PowerShell, giusto? Se così fosse, perché usare PowerShell?

Eseguire lo stesso compito in PowerShell offre vantaggi nel trattare i risultati come oggetti che è possibile manipolare. Ad esempio, se si esegue uno script che richiede le credenziali dell’utente, PowerShell può popolare in modo programmato il nome utente, e sarà necessario digitare manualmente solo la password.

Un altro esempio del mondo reale è l’esportazione dell’elenco degli utenti attualmente connessi a un server in un file. Si tratta di utilizzare PowerShell per ottenere gli utenti attuali e quindi esportare il risultato in file CSV, HTML o XML. Successivamente, vari flussi di lavoro di automazione possono utilizzare questo output.

Potrebbero esserci migliaia di motivi per utilizzare PowerShell per ottenere gli utenti attuali, ma alla fine tutto si riduce ai tuoi requisiti. E questo tutorial ti insegnerà i diversi modi per raggiungere tale obiettivo.

Interrogare la classe Win32_ComputerSystem

Iniziamo con i cmdlet nativi di PowerShell chiamati Get-WMIObject e Get-CimInstance. Questi cmdlet ti consentono di interrogare le informazioni, inclusi gli utenti attualmente connessi, utilizzando le classi Windows Management Instrumentation (WMI) su un computer locale o remoto.

Get-WMIObject è il cmdlet più vecchio (deprecato) e è disponibile solo fino a Windows PowerShell 5.1. Al contrario, Get-CIMInstance è il cmdlet più recente e sicuro ed è disponibile fino alle ultime versioni di PowerShell.

Per saperne di più, visita Get-CIMInstance Vs. Get-WMIObject: Qual è la differenza?

Per utilizzare PowerShell per ottenere l’utente corrente, esegui uno dei cmdlet mirati alla classe Win32_ComputerSystem. La classe Win32_ComputerSystem include varie proprietà, tra cui la proprietà Username. Per farlo, apri una finestra di PowerShell e esegui i comandi qui sotto.

# Utilizzando il cmdlet Get-WMIObject e restituisci solo la proprietà Username
(Get-WMIObject -ClassName Win32_ComputerSystem).Username

# Utilizzando il cmdlet Get-CimInstance e restituisci solo la proprietà Username
(Get-CimInstance -ClassName Win32_ComputerSystem).Username

Nota: Interrogare la classe Win32_ComputerSystem restituirà solo il nome utente di chi è collegato direttamente al computer (sessione console). Se l’utente ha effettuato l’accesso in remoto (ad esempio, Desktop remoto), il nome utente sarà vuoto.

Entrambi i comandi restituiscono lo stesso risultato, come mostrato di seguito. Se l’utente corrente è un account utente di dominio, il comando restituirà il dominio e il nome utente (dominio\nomeutente). Ma per un account utente locale, l’output sarebbe computer\nomeutente.

Querying WMI in PowerShell to Get Current Users

Get-WMIObject e Get-CimInstance hanno un parametro chiamato -computerName, che accetta il nome del computer da interrogare. Utilizzare questo parametro significa che è possibile interrogare le stesse informazioni da una macchina remota nella rete.

Ma se hai bisogno di ottenere solo il nome utente senza il dominio, una soluzione è suddividere l’output utilizzando il split() metodo. Per farlo, esegui il comando seguente in PowerShell.

# Il comando di seguito dividerà la proprietà del nome utente in due utilizzando il backslash '\' carattere come delimitatore.
# La parte [1] alla fine indica al comando di restituire solo il risultato all'indice 1.
# Gli indici partono da 0, il che significa che specificare l'indice 1 mostrerà il risultato nella seconda posizione.
((Get-WMIObject -ClassName Win32_ComputerSystem).Username).Split('\')[1]

Come risultato, PowerShell restituisce solo la parte utente, come nella schermata sottostante.

Splitting the username property

Leggere le variabili d’ambiente di Windows

Un altro modo per utilizzare PowerShell per ottenere l’utente attuale su un computer è recuperando i valori dalle variabili d’ambiente. Le variabili d’ambiente rappresentano i dati del sistema operativo, inclusi l’username dell’utente attuale, tra gli altri.

Ci sono tre modi per interagire con le variabili d’ambiente. Qualunque metodo si scelga restituirà lo stesso risultato.

Il Drive Env di PowerShell

PowerShell memorizza in cache le variabili d’ambiente e le rende disponibili attraverso un Drive PowerShell (PSDrive) chiamato drive Env:. I PSDrives sono luoghi di dati a cui è possibile accedere come un drive sul computer (ad es. C:), ma sono accessibili solo all’interno di PowerShell.

PowerShell crea automaticamente il drive Env: non appena si apre una sessione PowerShell. E poiché Env: è un drive, è possibile ottenere i suoi contenuti invocando il cmdlet Get-ChildItem, simile a come si elencano i contenuti di un drive o di una cartella del file system.

Utilizzando il drive Env: In PowerShell, ottenere l’utente corrente eseguendo il comando seguente.

Get-ChildItem Env:\USERNAME

Lo screenshot qui sotto mostra il risultato atteso. Come si può vedere, il comando restituisce l’elemento USERNAME e il relativo valore, che è l’utente attualmente connesso.

Getting the Env:\USERNAME item

Per restituire solo il valore dell’username, modificare il comando come mostrato di seguito e eseguirlo nuovamente in PowerShell.

(Get-ChildItem Env:\USERNAME).Value

E come si può vedere di seguito, il comando restituisce solo il valore dell’username come stringa.

Getting the Env:\USERNAME value

La variabile $env

Oltre ad accedere alle variabili di ambiente come un PSDrive trattandole come file in un drive, un altro modo è accedere al drive Env come variabile. Significa che è possibile fare riferimento alle variabili di ambiente utilizzando la sintassi seguente.

# Il segno $ indica una variabile
# env è il drive Env
# <variabile> è il nome della variabile che si desidera ottenere
$env:<variable>

Basandosi sulla sintassi indicata, eseguire il comando seguente in PowerShell per ottenere l’utente corrente.

$env:username

Come mostra lo screenshot qui sotto, il comando restituisce il valore del nome utente.

Getting the username variable value

La Classe di Ambiente .NET

PowerShell è un linguaggio e shell orientato agli oggetti. Fondamentalmente, tutto ciò su cui lavori all’interno di PowerShell è un oggetto. Quando esegui un comando, l’output è un oggetto. Se hai dichiarato una variabile, quella variabile è un oggetto stesso. Hai capito l’idea.

Questi oggetti hanno una struttura che definisce il tipo di dati che rappresentano, simile a dei progetti. E questi progetti sono chiamati classi .NET o semplicemente classi.

Per quanto riguarda le variabili d’ambiente, la classe associata ad esse è la classe Environment. Quindi, come si utilizza la classe Environment in PowerShell per ottenere l’utente corrente?

Come la variabile $env, la classe Environment ha una proprietà Username, il cui valore è il nome utente corrente. Per ottenere il valore della proprietà del nome utente, esegui il comando seguente in PowerShell.

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

Oltre alla proprietà Username, la classe Environment ha anche un metodo per ottenere il valore di una variabile d’ambiente. Il nome del metodo è GetEnvironmentVariable.

Per ottenere l’utente corrente utilizzando questo metodo, esegui il comando seguente.

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

Utilizzando la classe .NET WindowsIdentity

La classe WindowsIdentity è un’altra classe .NET che puoi invocare in PowerShell per ottenere l’utente corrente. Questa classe ha un metodo chiamato GetCurrentName, che restituisce un oggetto che rappresenta l’utente corrente di Windows.

Per ottenere i dettagli dell’utente corrente, esegui il comando seguente.

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

Come puoi vedere di seguito, il comando restituisce le proprietà dell’oggetto utente corrente, inclusa la proprietà Name. Il formato del valore della proprietà Name segue la convenzione dominio\utente.

Getting the current Windows user

Per restituire solo la parte del nome utente, modifica il comando precedente per selezionare solo la proprietà Name e applicare la tecnica di divisione delle stringhe. Per farlo, copia il comando seguente ed eseguilo in PowerShell.

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

Utilizzando il comando whoami

Un altro comando utile che consente di ottenere rapidamente l’utente corrente è il comando whoami. Questo comando è un file eseguibile che puoi trovare nella cartella %WINDIR%\System32 con il nome file whoami.exe.

Per ottenere il nome utente dell’utente corrente, esegui il comando seguente.

whoami

Il comando restituisce quindi il risultato nel formato dominio nomeutente, come mostrato nello screenshot qui sotto.

Getting the username using whoami

Per ottenere il nome utente senza il dominio, applica la tecnica di divisione delle stringhe che hai imparato in precedenza in questo tutorial eseguendo il comando seguente.

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

Il comando whoami può anche restituire il nome distintivo qualificato completamente (FQDN) dell’utente corrente e il nome principale utente (UPN). Questo output del comando potrebbe essere utile se hai intenzione di eseguire uno script che recupera l’identità dell’utente corrente oltre al nome utente.

Esegui il comando seguente in PowerShell per ottenere il FQDN e l’UPN dell’utente corrente.

# Ottieni il FQDN dell'utente corrente
whoami /fqdn

# Ottieni l'UPN dell'utente corrente
whoami /upn
Getting the current user’s FQDN and UPN

Nota: I valori FQDN e UPN sono disponibili solo se l’utente attualmente connesso è un utente di dominio. Se provi a ottenere questi valori per un utente locale, il comando restituirà un errore, come mostrato di seguito.

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

Utilizzando il comando query

Se sei un amministratore di sistema o un utente di dominio, è probabile che tu abbia effettuato l’accesso a una macchina remota tramite il Protocollo Desktop Remoto (RDP) almeno una volta, forse per gestire risorse o utilizzare applicazioni. Qualunque sia il motivo, vorresti sapere chi è attualmente connesso e sta utilizzando le risorse di sistema.

Per fortuna, Windows dispone di uno strumento da riga di comando integrato chiamato query, che può elencare tutti gli utenti attualmente connessi a un computer. Il comando mostra anche se l’utente si è connesso tramite una sessione desktop remota o localmente al computer.

Il comando query ha due parametri pertinenti per ottenere gli utenti connessi; session e user. Il parametro session elenca le sessioni del computer, mentre il parametro user elenca gli utenti e le loro sessioni.

Il comando query session ha un alias chiamato qwinsta, mentre l’alias del comando query user è quser.

Ad esempio, esegui il comando seguente per elencare le sessioni su DC1.

# query delle sessioni su DC1
qwinsta /server:dc1

La schermata sotto mostra l’output del comando. In questo esempio, due utenti hanno effettuato l’accesso al computer DC1 – uno nella sessione console e un altro tramite RDP. Come puoi vedere, qwinsta restituisce tutte le sessioni, anche quelle non utente.

Querying sessions

Se esegui qwinsta o quser da solo senza l’argomento /server:<computer>, entrambi i comandi interrogheranno il computer locale per impostazione predefinita.

Successivamente, per elencare tutti gli utenti con sessioni di accesso esistenti, esegui il comando user qui sotto.

# interrogare gli utenti su DC1
quser /server:dc1

Dopo aver eseguito il comando, noterai subito che quser restituisce le sessioni e gli utenti come il comando qwinsta. Ma questa volta non ci sono sessioni vuote.

Ci sono anche due colonne aggiuntive: TEMPO DI INATTIVITÀ, che mostra il tempo di inattività degli utenti, e TEMPO DI ACCESSO che mostra il timestamp di accesso degli utenti.

Querying users

Alla fine, confrontando i risultati di qwinsta e quser, quser è il comando più appropriato in PowerShell per ottenere gli utenti attuali.

Hai password compromesse nel tuo Active Directory? Scoprilo con Specops Password Auditor Free.

Conclusioni

Mentre ci sono molte modalità in PowerShell per ottenere gli utenti attualmente loggati, il metodo migliore dipende dal risultato che intendi ottenere e da come lo utilizzerai.

I cmdlet nativi correlati a WMI e il comando query ti consentono di ottenere gli utenti loggati su un computer locale o remoto. Utilizzare le classi .NET e le variabili di ambiente offre modi rapidi per recuperare gli stessi risultati, ma solo sul computer locale.

Che tu preveda di eseguire uno script o di visualizzare manualmente i risultati sullo schermo, c’è un metodo che soddisferà i tuoi requisiti per utilizzare PowerShell per ottenere l’utente corrente. Cosa fare dopo? Forse imparare come analizzare i risultati del comando di query e convertirli in oggetti PowerShell scrivendo funzioni con RegEx?

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