5

Windows Benutzer remote abmelden mit CMD

Wie kann man einen Windows Benutzer remote abmelden? In dem Fall, dass man sich nicht mehr remote anmelden kann an einem System, oder sonst irgendwelche Fehler dazwischenfunken, stellt man sich oft diese Frage. Aber es ist natürlich möglich einen Logoff eines Windows Benutzers am Computer anzustoßen. Microsoft Windows gibt uns die Möglichkeit mit einem einfachen CMD Befehl einen anderen User am Windows abmelden zu lassen. Wie das in der Windows Kommandozeile (CMD) funktioniert, zeigen wir euch in diesem Beitrag. Dies kann oft sehr hilfreich sein.

geralt / Pixabay

 

Warum sollte man einen User remote abmelden wollen?

Es gibt natürlich viele verschiedene Gründe einen Benutzer Remote vom Computer abmelden zu wollen. Einige Gründe, beziehungsweise Beispiele sind hier aufgelistet:

  • Ein Benutzerprofil hängt beim Anmelden
  • Ein Benutzerprofil wird nicht richtig geladen
  • Es ist keine Benutzer Eingabe mehr möglich
  • Der Server darf nicht neu gestartet werden, weil wichtige Dienste laufen ?
  • Der Benutzer der noch angemeldet ist nicht mehr im Haus

Es gibt wahrscheinlich noch viele weitere Gründe, warum man den User abmelden lassen will. Doch wie gehen wir jetzt vor? Der Windows User Logoff ist relativ einfach umzusetzen.

 

Benutzer remote abmelden – Windows kann´s!

Jeder der ein wenige Affin mit Windows Betriebssystemen ist sollte es schaffen den User Logoff zu machen. Hierzu sind nur ein paar wenige Befehle in der Eingabeaufforderung (CMD) notwendig. Zuerst muss man die Session ID der Windows Maschine finden, danach kann man mit dieser ID den User abmelden. Man muss allerdings Administrator auf dem Windows Computer sein um aus der Ferne auf die Systeme zugreifen zu können.

 

Session ID des angemeldeten Benutzers ermitteln

Um den Befehl zum Remote abmelden des Benutzer unter Windows nutzen zu können, müssen wird als Erstes die Session ID des angemeldeten Benutzers am System ermitteln. Dies machen wir über die Kommandozeile (CMD):

qwinsta.exe /Server:<servername>

Der Befehl “qwinsta.exe” listet alle aktiven oder getrennten Sessions des angegebenen Windows Servers, beziehungsweise Windows Clients auf. Der Paramter /<servername> muss natürlich durch den Computernamen, also den Hostname getauscht werden. Aber das sollte selbsterklärend sein.

windows benutzer remote abmelden

Führt man diesen Befehl aus, so werden alle aktiven und inaktiven Sessions, also Verbindungen von Benutzern aufgelistet. Hier suchen wir uns den gewünschten Benutzernamen und merkten uns die ID des Users. Diese User ID ist notwendig um unser gewünschtes Ziel zu erreichen.

 

Benutzer remote abmelden mit logoff unter Windows

Mit dem Befehl logoff lassen sich die Benutzer remote vom Windows System abmelden. Es spielt dabei keine Rolle, ob der Benutzer verbunden oder getrennt ist. Hier wird einfach die Session beendet und der angemeldete User abgemeldet.

Der Grundbefehl zum remote abmelden lautet folgendermaßen:

logoff <Sitzungs-ID> /server:<Servername>

Am Beispiel oben, würde der Befehl für den Benutzer “huberj” (ID 2) nun so lauten:

logoff 2 /server:myserver1

Zum erfolgreichen Logoff muss die Session-ID und der Hostname des Remote-Systems mitgegeben werden. Alternativ kann auch der Sitzungsname verwendet werden. Das Problem ist hierbei nur, dass dieser Sitzung-Namen nicht immer verfügbar ist. Deswegen empfehle ich das Verwenden der Sitzungs-ID.

Nachdem der Befehl abgesetzt wurde, sollte sich der angemeldete User automatisch abmelden und das System ist frei. Der Benutzer ist nun nicht mehr angemeldet und man könnte sich mit dem Benutzer neu anmelden.

 

Benutzer von allen Servern in Domäne abmelden

Das einzelne Abmelden von einem Server sollte nun geklärt sein und funktionieren. Doch ist es auch möglich den gewünschten Benutzer von allen Servern im Netzwerk, beziehungsweise innerhalb der Domäne abzumelden? Klar! Dafür müssen wir allerdings anders vorgehen und schwenken um auf Windows PowerShell. Hier haben wir mehr Möglichkeiten, beziehungsweise ist es sehr viel einfacher das Abmelden von allen Servern umzusetzen. Hierzu habe ich ein PowerShell Script geschrieben. Kommentare habe ich hinzu gefügt.

<#
.SYNOPSIS
  Benutzer von allen Servern abmelden
.DESCRIPTION
  Dieses Script meldet den angegebenen Benutzer von allen Servern im Netzwerk ab,
.NOTES
  Version:        1.0
  Author:         www.ITnator.net | Huber Johannes
  Creation Date:  30.09.2019
.EXAMPLE
  <Example goes here. Repeat this attribute for more than one example>
#>

######### set username #########
$YourUser = "huberjadmin"
################################


Import-Module activedirectory


function Get-TSSessions {
    param(
        $ComputerName = ""
    )

    qwinsta /server:$ComputerName |
    #Parse output
    ForEach-Object {
        $_.Trim() -replace "\s+",","
    } |
    #Convert to objects
    ConvertFrom-Csv
}


#Get Server list (AD Import or List)
#$serverlist = Get-ADComputer -SearchBase 'OU=Server,OU=Computer,DC=ads,DC=swing' -Filter * -Properties * | select Name
$serverlist = @("server1","server2")

#for each server in list
foreach($server in $serverlist) {

#clear sessionID
$sessionID = ""

#Get Session ID of user
$sessionID = Get-TSSessions -ComputerName $server | ? { $_.Username -eq $YourUser } | select ID

#if user is logged on
if ($sessionID -ne "") {

#Logoff User
logoff.exe $sessionID.ID /server:$server

echo "Benutzer $youruser von $server abgemeldet."
}
}

In meinem Script muss lediglich der Benutzername in Zeile 15 angegeben werden, welcher abgemeldet werden soll. In Zeile 38-39 kann man noch selbst Servernamen angeben, oder sich die Server-Liste aus der Active-Directory Domäne importieren lassen. Hierzu muss lediglich die gewünschte Zeile auskommentiert werden.

Nach Absetzen des PowerShell Scripts wird der User von allen Servern abgemeldet, welche in der Server-Liste angegeben sind.

 

Administrator-Berechtigungen zum Abmelden

Eine wichtige Voraussetzung, damit das remote abmelden funktioniert ist, dass der CMD Befehl mit einem Benutzer ausgeführt wird, der auch Administratorrechte auf dem anderen Server hat. Somit verwendet man am Besten einen Domänen Administrator.

Außerdem kann anstatt der Sitzungs ID auch der Sitzungsname verwendet werden. Dieser Sitzungsname ist aber nicht immer verfügbar. Zur Sicherheit sollte also besser die Sitzungsnummer verwendet werden um die Aufgabe erfolgreich zu erledigen.

Johannes Huber
 

In seiner Freizeit macht Johannes nichts lieber, als für ITnator Beiträge zu schreiben. Input bekommt er hierfür von Problemen in der IT Administration von Servern, Clients und vielen weiteren IT Komponenten.

  • Thomas Hollenbeck sagt:

    Hallo,

    ich bin auf den Script gestoßen und finde ihn sehr hilfreich. Vieln dank schon einmal dafür.
    Ich bin allerdings auf das Problem gestoßen, dass wenn ein Benutzer Mehrfach auf einem Terminalserver angemeldet ist, der Script nicht arbeitet. (Das passiert z.B. wenn man der RemoteApp und direkter RDP Sitzung angemeldet ist, oder war).
    Meine Kenntnisse lassen es leider nicht zu hier eine schleife zu bauen. Hat hier jemand eine Idee?

    • Hallo Thomas,

      versuche es doch mal so (ab Zeile 50), ungetestet:


      foreach ($session in $sessionID){

      #if user is logged on
      if ($session -ne "") {

      #Logoff User
      logoff.exe $session.ID /server:$server

      echo "Benutzer $youruser von $server abgemeldet."
      }
      }

      Gruß Johannes

      • Thomas Hollenbeck sagt:

        Vielen Dank,
        hat auf anhieb funktioniert.
        Für alle die Copy & Paste haben möchten:

        <#
        .SYNOPSIS
        Benutzer von allen Servern abmelden
        .DESCRIPTION
        Dieses Script meldet den angegebenen Benutzer von allen Servern im Netzwerk ab,
        .NOTES
        Version: 1.1
        Author: http://www.ITnator.net | Huber Johannes
        Creation Date: 30.09.2019
        Edit Date: 25.01.2021
        .EXAMPLE

        #>
        ######### set username #########
        $YourUser = $env:UserName
        ################################
        #Import-Module activedirectory
        function Get-TSSessions {
        param(
        $ComputerName = “”
        )
        qwinsta /server:$ComputerName |
        #Parse output
        ForEach-Object {
        $_.Trim() -replace “s+”,”,”
        } |
        #Convert to objects
        ConvertFrom-Csv
        }
        #Get Server list (AD Import or List)
        #$serverlist = Get-ADComputer -SearchBase ‘OU=Server,OU=Computer,DC=ads,DC=swing’ -Filter * -Properties * | select Name
        #$serverlist = @(“terminal.knaup.local”,”server2″)
        $serverlist = @(“terminal.knaup.local”)
        #for each server in list

        foreach($server in $serverlist) {
        #clear sessionID
        $sessionID = “”
        #Get Session ID of user
        $sessionID = Get-TSSessions -ComputerName $server | ? { $_.BENUTZERNAME -eq $YourUser } | select ID
        #if user is logged on

        foreach ($session in $sessionID){

        if ($session -ne “”) {
        #Logoff User
        logoff.exe $session.ID /server:$server
        echo “Benutzer $youruser mit $session.ID von $server abgemeldet.”
        }
        }
        Read-Host -Prompt “Um fortzufahren ENTER drücken…”
        }

        • Thomas Hollenbeck sagt:

          Ich habe den Script gerade noch einmal etwas verfeinert; für den Bereich falls kein User angemeldet ist. Da war noch ein kleiner Haken drin.

          <#
          .SYNOPSIS
          Benutzer von allen Servern abmelden
          .DESCRIPTION
          Dieses Script meldet den angegebenen Benutzer von allen Servern im Netzwerk ab,
          .NOTES
          Version: 1.1
          Author: http://www.ITnator.net | Huber Johannes
          Creation Date: 30.09.2019
          Edit Date: 25.01.2021
          .EXAMPLE

          #>
          ######### set username #########
          $YourUser = $env:UserName
          ################################
          #Import-Module activedirectory
          function Get-TSSessions {
          param(
          $ComputerName = “”
          )
          qwinsta /server:$ComputerName |
          #Parse output
          ForEach-Object {
          $_.Trim() -replace “s+”,”,”
          } |
          #Convert to objects
          ConvertFrom-Csv
          }
          #Get Server list (AD Import or List)
          #$serverlist = Get-ADComputer -SearchBase ‘OU=Server,OU=Computer,DC=ads,DC=swing’ -Filter * -Properties * | select Name
          $serverlist = @(“server1″,”server2”)
          #for each server in list

          foreach($server in $serverlist) {
          #clear sessionID
          $sessionID = “”
          #Get Session ID of user
          $sessionID = Get-TSSessions -ComputerName $server | ? { $_.BENUTZERNAME -eq $YourUser } | select ID
          #if user is logged on

          if ($sessionID -notmatch ” “) {
          foreach ($session in $sessionID){

          if ($session -ne “”) {
          #Logoff User
          logoff.exe $session.ID /server:$server
          echo “Benutzer $youruser mit $session.ID von $server abgemeldet.”
          }
          }
          Read-Host -Prompt “Um fortzufahren ENTER drücken…”
          }
          }

  • sidebar
    >