Come disconnettere da remoto gli utenti Windows con PowerShell

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

Ottieni l’accesso

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.

Passi successivi

La creazione di un team IT efficiente ed efficace richiede una soluzione centralizzata che funga da principale strumento per la fornitura di servizi. NinjaOne consente ai team IT di monitorare, gestire, proteggere e supportare tutti i dispositivi, ovunque essi si trovino, senza la necessità di una complessa infrastruttura locale.

Per saperne di più su NinjaOne Endpoint Management, fai un tour dal vivo, o inizia la tua prova gratuita della piattaforma NinjaOne.

Categorie:

Ti potrebbe interessare anche

×

Guarda NinjaOne in azione!

Inviando questo modulo, accetto La politica sulla privacy di NinjaOne.

Termini e condizioni NinjaOne

Cliccando sul pulsante “Accetto” qui sotto, dichiari di accettare i seguenti termini legali e le nostre condizioni d’uso:

  • Diritti di proprietà: NinjaOne possiede e continuerà a possedere tutti i diritti, i titoli e gli interessi relativi allo script (compreso il copyright). NinjaOne ti concede una licenza limitata per l’utilizzo dello script in conformità con i presenti termini legali.
  • Limitazione d’uso: Puoi utilizzare lo script solo per legittimi scopi personali o aziendali interni e non puoi condividere lo script con altri soggetti.
  • Divieto di ripubblicazione: In nessun caso ti è consentito ripubblicare lo script in una libreria di script appartenente o sotto il controllo di un altro fornitore di software.
  • Esclusione di garanzia: Lo script viene fornito “così com’è” e “come disponibile”, senza garanzie di alcun tipo. NinjaOne non promette né garantisce che lo script sia privo di difetti o che soddisfi le tue esigenze o aspettative specifiche.
  • Assunzione del rischio: L’uso che farai dello script è da intendersi a tuo rischio. Riconosci che l’utilizzo dello script comporta alcuni rischi intrinseci, che comprendi e sei pronto ad assumerti.
  • Rinuncia e liberatoria: Non riterrai NinjaOne responsabile di eventuali conseguenze negative o indesiderate derivanti dall’uso dello script e rinuncerai a qualsiasi diritto legale o di equità e a qualsiasi rivalsa nei confronti di NinjaOne in relazione all’uso dello script.
  • EULA: Se sei un cliente NinjaOne, l’uso dello script è soggetto al Contratto di licenza con l’utente finale (EULA) applicabile.