Nel panorama IT moderno, la gestione delle sessioni utente è fondamentale. Che si tratti di garantire che le sessioni inutilizzate non consumino risorse o di mantenere i protocolli di sicurezza assicurando che le sessioni non autorizzate vengano terminate, è necessario gestire le sessioni in modo efficiente. L’importanza di questi interventi viene sottolineata se si considera l’aumento del lavoro a distanza e le sessioni multiple avviate da diverse posizioni. PowerShell, con la sua versatilità, offre un’eccellente soluzione a questa sfida attraverso questo script per disconnettere da remoto gli utenti.
Background
Lo script fornito ha uno scopo semplice ma cruciale: disconnettere da remoto gli utenti specificati da un computer Windows, con l’eccezione della sessione della console. Sebbene molti professionisti IT e fornitori di servizi gestiti (MSP) possano dubitare della sua utilità, vista la disponibilità di strumenti basati su GUI, ricordati che per ottenere soluzioni automatizzate e scalabili spesso è necessario un approccio basato su script. Questo script per disconnettere da remoto gli utenti consente agli amministratori di integrare perfettamente le funzionalità di disconnessione degli utenti all’interno di flussi di lavoro di automazione più ampi, fondamentali per le aziende con numerose sessioni utente da gestire.
Lo script per disconnettere da remoto gli utenti
#Requires -Version 5.1 <# .SYNOPSIS Logs off user(s) specified. You can't log off a user from the console session. .DESCRIPTION Logs off user(s) specified. You can't log off a user from the console session. .EXAMPLE -User "Administrator" Logs off Administrator user. .EXAMPLE -User "Administrator","Guest" Logs off Administrator and Guest users. .EXAMPLE PS C:> Logoff-User.ps1 -User "Administrator","Guest" Logs off Administrator and Guest users. .OUTPUTS String[] .NOTES Minimum OS Architecture Supported: Windows 10, Windows Server 2016 Release Notes: Initial Release By using this script, you indicate your acceptance of the following legal terms as well as our Terms of Use at https://www.ninjaone.com/terms-of-use. Ownership Rights: NinjaOne owns and will continue to own all right, title, and interest in and to the script (including the copyright). NinjaOne is giving you a limited license to use the script in accordance with these legal terms. Use Limitation: You may only use the script for your legitimate personal or internal business purposes, and you may not share the script with another party. Republication Prohibition: Under no circumstances are you permitted to re-publish the script in any script library or website belonging to or under the control of any other software provider. Warranty Disclaimer: The script is provided “as is” and “as available”, without warranty of any kind. NinjaOne makes no promise or guarantee that the script will be free from defects or that it will meet your specific needs or expectations. Assumption of Risk: Your use of the script is at your own risk. You acknowledge that there are certain inherent risks in using the script, and you understand and assume each of those risks. Waiver and Release: You will not hold NinjaOne responsible for any adverse or unintended consequences resulting from your use of the script, and you waive any legal or equitable rights or remedies you may have against NinjaOne relating to your use of the script. EULA: If you are a NinjaOne customer, your use of the script is subject to the End User License Agreement applicable to you (EULA). .COMPONENT ManageUsers #> [CmdletBinding(SupportsShouldProcess = $True)] param ( # User name(s) to log off [Parameter(Mandatory = $true)] [String[]] $User ) begin { function Test-IsElevated { $id = [System.Security.Principal.WindowsIdentity]::GetCurrent() $p = New-Object System.Security.Principal.WindowsPrincipal($id) if ($p.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)) { Write-Output $true } else { Write-Output $false } } Function Get-QueryUser() { Param() # Replaces all occurrences of 2 or more spaces in a row with a single comma $Lines = @(query.exe user).foreach({ $(($_) -replace ('s{2,}', ',')) }) $Header = $($Lines[0].split(',').trim()) for ($i = 1; $i -lt $($Lines.Count); $i++) { $Line = $($Lines[$i].split(',')).foreach({ $_.trim().trim('>') }) # Accounts for disconnected users if ($Line.count -eq 5) { $Line = @($Line[0], "$($null)", $Line[1], $Line[2], $Line[3], $Line[4] ) } $CurUser = [PSCustomObject]::new() for ($j = 0; $j -lt $($Line.count); $j++) { $CurUser | Add-Member -MemberType NoteProperty -Name $Header[$j] -Value $Line[$j] } $CurUser } } } process { if (-not (Test-IsElevated)) { Write-Error -Message "Access Denied. Please run with Administrator privileges." exit 1 } # Get a list of users logged on from query.exe, format it for powershell to process $QueryResults = Get-QueryUser # Accounts for only one user logged in $QueryTest = $($QueryResults | Select-Object -First 1) if ( $QueryResults.Count -or ( $QueryTest.USERNAME -is [String] -and -not [String]::IsNullOrEmpty($QueryTest.USERNAME) -and -not [String]::IsNullOrWhiteSpace($QueryTest.USERNAME) ) ) { $script:HasError = $false $QueryResults | Where-Object { # For each session filter out the user that weren't specified in $User $_.UserName -in $User } | ForEach-Object { Write-Host "Found Logged In User: $($_.UserName)" if ($_.SessionName -like "console") { # We can't log out a user that is at the console. # We could do this logic in the Where-Object code block, but then there isn't an output of what was skipped. # https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/logoff#remarks # "You can't log off a user from the console session." Write-Host "Skipping user, can't log off a user($($_.UserName)) from the $($_.SessionName) session." } else { # Log off the user session with a matching ID logoff.exe $_.Id if ($LASTEXITCODE -gt 0) { $script:HasError = $true Write-Error "logoff.exe $($_.Id) returned exit code: $LASTEXITCODE" } else { Write-Host "Logged Off User: $($_.UserName)" } } } if ($script:HasError) { exit 1 } } else { Write-Output "No Users Logged In" exit 2 } } end {}
Accedi a oltre 700 script nel Dojo di NinjaOne
Analisi dettagliata dello script per disconnettere da remoto gli utenti
- Inizializzazione: Lo script per disconnettere da remoto gli utenti inizia con una serie di commenti, o ‘.SYNOPSIS’, ‘.DESCRIPTION’ e ‘.EXAMPLE’, che forniscono rispettivamente una panoramica, una descrizione dettagliata ed esempi di utilizzo.
- Parametri: Il blocco param è la sezione in cui lo script richiede un input ($User), cioè il nome utente (o i nomi utente) da disconnettere.
- Funzioni: Vengono definite due funzioni primarie:
- Test-IsElevated: Determina se lo script per disconnettere da remoto gli utenti viene eseguito con privilegi di amministratore.
- Get-QueryUser: Recupera un elenco di utenti connessi utilizzando il comando di Windows query.exe user e formatta l’output per facilitarne l’utilizzo da parte di PowerShell.
- Blocco del processo: Le operazioni principali avvengono qui:
- Controllo dei permessi: Verifica se lo script per disconnettere da remoto gli utenti è in esecuzione con privilegi amministrativi utilizzando Test-IsElevated.
- Query della sessione: Recupera tutti gli utenti connessi tramite Get-QueryUser.
- Terminazione della sessione: Effettua un’iterazione sull’elenco degli utenti connessi. Se il nome utente corrisponde al parametro $User fornito e non è una sessione della console, l’utente viene disconnesso utilizzando logoff.exe.
Casi d’uso potenziali
Immagina uno scenario in cui un amministratore IT di una grande organizzazione osservi un’impennata inaspettata nell’utilizzo delle risorse durante l’orario di lavoro. Individua dunque sessioni multiple di utenti che sono state lasciate attive e che devono essere terminate per liberare risorse. Invece di disconnettere manualmente gli utenti, il nostro script per disconnettere da remoto gli utenti può essere distribuito su più macchine, interrompendo rapidamente le sessioni non necessarie.
Confronti
I metodi tradizionali, come l’uso di Task Manager o della GUI di Windows, richiedono un intervento manuale e non sono scalabili su più macchine. Sebbene siano disponibili strumenti di terze parti, l’uso di un tool nativo come PowerShell garantisce l’assenza di software aggiuntivi non necessari e una migliore compatibilità.
Domande frequenti
- Lo script per disconnettere da remoto gli utenti termina tutte le sessioni?
No, disconnette solo gli utenti specificati e mai la sessione della console. - Può funzionare su qualsiasi macchina Windows?
Supporta Windows 10 e Windows Server 2016 e versioni successive.
Implicazioni
Una gestione impropria delle sessioni può portare a vulnerabilità di sicurezza. Persone malintenzionate o software dannosi possono sfruttare le sessioni attive per ottenere un accesso non autorizzato. Assicurando che solo le sessioni necessarie rimangano attive, lo script per disconnettere da remoto gli utenti contribuisce in modo significativo alla sicurezza informatica.
Raccomandazioni
- Esegui sempre lo script per disconnettere da remoto gli utenti con privilegi di amministratore.
- Prima di eseguirlo in un ambiente reale, testa lo script per disconnettere da remoto gli utenti in un ambiente controllato per assicurarti che si comporti come previsto.
Considerazioni finali
Quando si tratta di gestire in modo efficiente le sessioni utente in un ambiente Windows, PowerShell offre soluzioni solide e versatili. Questo script per disconnettere da remoto gli utenti mostra solo un frammento delle sue capacità. Per coloro che cercano una piattaforma integrata per semplificare tali attività, NinjaOne offre una suite completa di strumenti che si integrano perfettamente con script di questo tipo, garantendo una gestione ottimale dell’infrastruttura IT.