Línea de comando de usuario para cerrar sesión en Windows

Línea de comando de usuario para cerrar sesión en Windows

Me gustaría cerrar la sesión de un usuario usando la línea de comando, lo cual debe hacerse usando el nombre de usuario, no la identificación de sesión, debe hacerse con fuerza

Lo intenté: shutdown -lpero funciona solo para el usuario actual. También probé logoffel comando pero requiere un nombre de sesión.

EDITADO: Probé un script de cierre de sesión pero no funciona. ¿Alguien puede solucionarlo?

ARCHIVO POR LOTES

@echo off
query session > logoff.txt
for /f "skip=2 tokens=2,3" %%i in (logoff.txt) DO if [%%i]==[%1] logoff %%j

CIERRE CIERRE.TXT

 SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE 
 services                                    0  Disc                        
 console                                     1  Conn                        
>rdp-tcp#0         Administrator             2  Active                      
                   hi                        3  Disc                        
                   h                         4  Disc                        
                   Abdou                     5  Disc                        
                   Abdou76                   6  Disc                        
 rdp-tcp                                 65536  Listen                      

PROBANDO EL GUIÓN... PERO FALLÓ

C:\dir>logoff.bat Abdou76

C:\dir>

El usuario Abdou76 todavía está conectado

Respuesta1

Lote:

Que yo sepa, no existe ninguna utilidad integrada de Windows para "cerrar sesión por nombre".

Puede utilizar un archivo por lotes para consultar las sesiones actuales, seleccionar los nombres y los ID de sesión y luego cerrar sesión en los usuarios coincidentes:

@echo off
query session > sessioninfo.txt
for /f "skip=2 tokens=2,3" %%i in (sessioninfo.txt) DO if [%%i]==[%1] logoff %%j
del sessioninfo.txt

Uso:

batchfile.bat username

El lote carga los resultados query sessionen un archivo de texto.

Luego utiliza un forbucle, omitiendo las dos primeras líneas, para cargar el nombre de usuario y los tokens de ID de sesión para cada línea en Iy J.

Ise verifica para ver si coincide con el nombre proporcionado como argumento (representado por %1) y, de ser así, logoffse usa con el ID de sesión correspondiente.


Después de algunos comentarios y detalles sobre los usuarios "desconectados", creo que sería mejor hacerlo en PowerShell.

Potencia Shell:

Aquí hay un script de PowerShell que cerrará todas las sesiones que coincidan con el nombre de usuario que le proporciona, y esto funciona si el usuario está activo o desconectado.

param (
    [string]$username = $(throw "-username is required.")
)

function Get-Sessions
{
    $queryResults = query session
    $starters = New-Object psobject -Property @{"SessionName" = 0; "UserName" = 0; "ID" = 0; "State" = 0; "Type" = 0; "Device" = 0;}
    foreach ($result in $queryResults)
    {
        try
        {
            if($result.trim().substring(0, $result.trim().indexof(" ")) -eq "SESSIONNAME") {
                $starters.UserName = $result.indexof("USERNAME");
                $starters.ID = $result.indexof("ID");
                $starters.State = $result.indexof("STATE");
                $starters.Type = $result.indexof("TYPE");
                $starters.Device = $result.indexof("DEVICE");
                continue;
            }

            New-Object psobject -Property @{
                "SessionName" = $result.trim().substring(0, $result.trim().indexof(" ")).trim(">");
                "Username" = $result.Substring($starters.Username, $result.IndexOf(" ", $starters.Username) - $starters.Username);
                "ID" = $result.Substring($result.IndexOf(" ", $starters.Username), $starters.ID - $result.IndexOf(" ", $starters.Username) + 2).trim();
                "State" = $result.Substring($starters.State, $result.IndexOf(" ", $starters.State)-$starters.State).trim();
                "Type" = $result.Substring($starters.Type, $starters.Device - $starters.Type).trim();
                "Device" = $result.Substring($starters.Device).trim()
            }
        } 
        catch 
        {
            $e = $_;
            throw "ERROR: " + $e.PSMessageDetails
        }
    }
}

$username = $username.ToLower()
$userSessions = Get-Sessions | ? { ($_.UserName).ToLower() -eq $username } | Select ID, UserName
$numberOfSessions = ($userSessions | measure).Count

if ($numberOfSessions -gt 0) {
    foreach ($session in $userSessions)
    {
       $sessionInfo = $session.Username + " (" + $session.ID + ")"
       Write-Host "Found $sessionInfo"
       logoff $session.ID /V
    }
} else {
    Write-Host """$username"" not found in session list."
}

Uso (desde PowerShell): .\LogEmOff.ps1 Abdou76

El argumento del nombre de usuario NO distingue entre mayúsculas y minúsculas (es decir: AbDoU76 = Abdou76 = ABDOU76 = abdou76)

Respuesta2

He encontrado la solución: usandocódigo de lote

@echo off
query user > logoff.txt
for /f "tokens=1,2" %%i in (logoff.txt) DO if /I [%%i]==[%1] logoff.exe %%j

Uso:
cerrar sesión nombre de usuario

NOTA :El argumento del nombre de usuario NO distingue entre mayúsculas y minúsculas (es decir: nombre de usuario = Nombre de usuario = NOMBRE DE USUARIO = Nombre de USUARIO)

información relacionada