Windows-Befehlszeile zum Abmelden des Benutzers

Windows-Befehlszeile zum Abmelden des Benutzers

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 -laber es funktioniert nur für den aktuellen Benutzer. Habe auch logoffden 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 sessionin eine Textdatei.

Anschließend wird eine forSchleife verwendet, wobei die ersten beiden Zeilen übersprungen werden, um die Token für Benutzernamen und Sitzungs-ID für jede Zeile in Iund zu laden J.

Iwird überprüft, ob es mit dem als Argument angegebenen Namen (dargestellt durch %1) übereinstimmt und wird ggf. logoffmit 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).

verwandte Informationen