Como fazer o logoff remoto de usuários no Windows com o PowerShell

No cenário moderno de TI, o gerenciamento de sessões de usuários é fundamental. Seja para garantir que as sessões não utilizadas não consumam recursos ou para manter os protocolos de segurança, garantindo que as sessões não autorizadas sejam encerradas, é necessário um gerenciamento eficiente das sessões. Essa importância é enfatizada quando consideramos o aumento do trabalho remoto e as várias sessões iniciadas em vários locais. O PowerShell, com sua versatilidade, oferece uma excelente solução para esse desafio por meio deste script que fará o logoff remoto dos usuários

Histórico

O script fornecido tem uma finalidade simples, mas crucial: fazer logoff de usuários especificados de uma máquina Windows, com exceção da sessão do console. Embora muitos profissionais de TI e provedores de serviços gerenciados (MSPs) possam se perguntar sobre sua utilidade, dada a disponibilidade de ferramentas baseadas em GUI, lembre-se de que as soluções automatizadas e dimensionáveis geralmente exigem abordagens baseadas em scripts. Esse script permite que os administradores integrem perfeitamente os recursos de logout do usuário em fluxos de trabalho de automação maiores, o que é crucial para empresas com várias sessões de usuário para gerenciar.

O roteiro

#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 {}

 

Acesse mais de 300 scripts no NinjaOne Dojo

Obter acesso

Detalhamento

  • Inicialização: O script começa com uma série de comentários, ou ‘.SYNOPSIS’, ‘.DESCRIPTION’ e ‘.EXAMPLE’, que fornecem uma visão geral, uma descrição detalhada e exemplos de uso, respectivamente.
  • Parâmetros: O bloco param define que o script requer uma entrada($User), que é o(s) nome(s) de usuário para fazer logoff.
  • Funções: Duas funções primárias são definidas:
  • Test-IsElevated: Determina se o script é executado com privilégios de administrador.
  • Get-QueryUser: Obtém uma lista de usuários conectados usando o comando do Windows query.exe user e, em seguida, formata essa saída para facilitar o consumo pelo PowerShell.
  • Bloco de processo: As principais operações ocorrem aqui:
  • Verificação de permissão: Verifica se o script está sendo executado com privilégios administrativos usando o Test-IsElevated.
  • Consulta de sessão: Recupera todos os usuários conectados por meio de Get-QueryUser.
  • Encerramento da sessão: Itera pela lista de usuários conectados. Se o nome de usuário corresponder ao parâmetro $User fornecido e não for uma sessão de console, o usuário será desconectado usando o logoff.exe.

Casos de uso em potencial

Imagine um cenário em que um administrador de TI de uma grande organização observa um aumento inesperado no uso de recursos fora do horário comercial. Eles identificam várias sessões de usuário que foram deixadas ativas e precisam ser encerradas para liberar recursos. Em vez de fazer o logoff dos usuários manualmente, nosso script pode ser implementado em várias máquinas, encerrando rapidamente as sessões desnecessárias.

Comparações

Os métodos tradicionais, como o uso do Gerenciador de Tarefas ou da GUI do Windows, exigem esforço manual e não são escalonáveis em várias máquinas. Embora existam ferramentas de terceiros disponíveis, o uso do PowerShell nativo garante a ausência de sobrecarga de software adicional e melhor compatibilidade.

Implicações

O gerenciamento inadequado da sessão pode levar a vulnerabilidades de segurança. Entidades mal-intencionadas podem explorar sessões ativas para obter acesso não autorizado. Ao garantir que apenas as sessões necessárias permaneçam ativas, o script contribui significativamente para a segurança de TI.

Recomendações

  • Sempre execute o script com privilégios de administrador.
  • Antes de executar em um ambiente ativo, teste o script em uma configuração controlada para garantir que ele se comporte conforme o esperado.

Considerações finais

Quando se trata de gerenciar com eficiência as sessões de usuário em um ambiente Windows, o PowerShell oferece soluções robustas e versáteis. Este script apresenta apenas uma parte de seus recursos. Para aqueles que buscam uma plataforma integrada para simplificar essas tarefas, a NinjaOne oferece um conjunto abrangente de ferramentas que se integram perfeitamente a scripts como esse, garantindo o gerenciamento ideal da infraestrutura de TI.

FAQs

Não, ele faz o logoff apenas dos usuários especificados e nunca da sessão do console.

Ele é compatível com o Windows 10 e o Windows Server 2016 em diante.

Próximas etapas

Montar uma equipe de TI eficaz requer uma solução centralizada que seja a principal ferramenta de entrega de serviços. Com NinjaOne, a TI monitora, gerencia, protege e oferece suporte a todos os dispositivos, onde quer que estejam, dispensando infraestrutura complexa no local.

Saiba mais sobre a solução NinjaOne Remote Script Deployment, agende uma demonstração, ou inicie sua avaliação gratuita da plataforma NinjaOne.

Categories:

You might also like