
Ich möchte einen Benutzer über die Befehlszeile abmelden, was mit dem Benutzernamen und nicht mit der Sitzungs-ID erfolgen sollte. Dies sollte zwangsweise erfolgen
ich habe es versucht: shutdown -l
aber es funktioniert nur für den aktuellen Benutzer. Habe auch logoff
den Befehl versucht, aber dafür ist ein Sitzungsname erforderlich
BEARBEITET: Ich habe es mit einem Abmeldeskript versucht, aber es funktioniert nicht. Kann das jemand reparieren?
Batch-Datei
@echo off
query session > logoff.txt
for /f "skip=2 tokens=2,3" %%i in (logoff.txt) DO if [%%i]==[%1] logoff %%j
LOGOFF.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
Habe es mit dem Skript versucht … aber es ist fehlgeschlagen
C:\dir>logoff.bat Abdou76
C:\dir>
Benutzer Abdou76 ist noch angemeldet
Antwort1
Charge:
Mir ist kein integriertes Windows-Dienstprogramm zum „Abmelden per Namen“ bekannt.
Sie könnten eine Batchdatei verwenden, um die aktuellen Sitzungen abzufragen, die Namen und Sitzungs-IDs herauszusuchen und dann die entsprechenden Benutzer abzumelden:
@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
Verwendung:
batchfile.bat username
Der Batch lädt die Ergebnisse query session
in eine Textdatei.
Anschließend wird eine for
Schleife verwendet, wobei die ersten beiden Zeilen übersprungen werden, um die Token für Benutzernamen und Sitzungs-ID für jede Zeile in I
und zu laden J
.
I
wird überprüft, ob es mit dem als Argument angegebenen Namen (dargestellt durch %1
) übereinstimmt und wird ggf. logoff
mit der entsprechenden Sitzungs-ID verwendet.
Nach einigen Kommentaren und Details zu „getrennten“ Benutzern bin ich der Meinung, dass dies besser in PowerShell erledigt werden könnte.
Power Shell:
Hier ist ein PowerShell-Skript, das alle Sitzungen abmeldet, die mit dem eingegebenen Benutzernamen übereinstimmen. Dies funktioniert unabhängig davon, ob der Benutzer aktiv oder getrennt ist.
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."
}
Verwendung (innerhalb von PowerShell):
.\LogEmOff.ps1 Abdou76
Beim Benutzernamenargument wird absichtlich NICHT zwischen Groß- und Kleinschreibung unterschieden (z. B.: AbDoU76 = Abdou76 = ABDOU76 = abdou76).
Antwort2
ich habe die Lösung gefunden: mitBatch-Code
@echo off
query user > logoff.txt
for /f "tokens=1,2" %%i in (logoff.txt) DO if /I [%%i]==[%1] logoff.exe %%j
Verwendung :
Abmelden Benutzername
NOTIZ :Beim Benutzernamenargument wird absichtlich NICHT zwischen Groß- und Kleinschreibung unterschieden (z. B.: Benutzername = Benutzername = BENUTZERNAME = BENUTZERname).