
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 -l
pero funciona solo para el usuario actual. También probé logoff
el 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 session
en un archivo de texto.
Luego utiliza un for
bucle, 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 I
y J
.
I
se verifica para ver si coincide con el nombre proporcionado como argumento (representado por %1
) y, de ser así, logoff
se 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)