niraxx
Goto Top

RDP User per Skript abmelden

Hallo zusammen,
wir haben einen RDP-Server auf Windows Server 2019.

Ich würde gerne regelmäßig alle getrennten User außer einem bestimmten User automatisch abmelden.

Hat jemand eine Idee, wie man das umsetzen kann.

Da es sich nur um wenige User handelt, wollte ich ein Skript erstellen, was die User nacheinander abmeldet. Rwinsta oder logoff benötigen aber immer die Session-ID.
Kann ich irgendwie die Session-ID eines Users abfragen und übergeben?

Content-ID: 671422

Url: https://administrator.de/forum/rdp-user-per-skript-abmelden-671422.html

Ausgedruckt am: 20.02.2025 um 10:02 Uhr

OlliSe
OlliSe 17.02.2025 um 12:04:35 Uhr
Goto Top
Hi,
Per GPO, sollte am einfachsten sein face-wink
ukulele-7
ukulele-7 17.02.2025 um 12:32:19 Uhr
Goto Top
Mit qwinsta bekommst du die IDs der aktiven Sessions.
https://www.windows-faq.de/2018/08/29/rdp-informationen-abfragen-mit-qwi ...
niraxx
niraxx 17.02.2025 um 12:39:08 Uhr
Goto Top
Das weiß ich. Aber wie kann ich in einem Skript die Session-ID eines bestimmten Users auslesen?
kpunkt
kpunkt 17.02.2025 um 12:54:39 Uhr
Goto Top
Ich hätte ja auch eher die GPO dafür bemüht
Benutzerkonfiguration -> Richtlinien -> Administrative Vorlagen -> Windows-Komponente -> Remotedesktopdienste -> Remotedesktopsitzungs-Host -> Sitzungszeitlimits
insidERR
Lösung insidERR 17.02.2025 aktualisiert um 13:23:34 Uhr
Goto Top
Vor einigen Jahren hatte ich hier ne ähnliche Frage gestellt, weil auch so ein Problem mit RDP-Usern habe. Ein User hier hat mir folgenden Code gebastelt.

@chcp 1252
@echo on
@cls
echo.
echo Dieses Script meldet alle Benutzer(ausser USERNAME_1,USERNAME_2, Administrator) mit dem Status "Getrennt" ab  
echo.
for /f "tokens=1-3" %%a in ('query user ^| findstr /ilc:"Getr." ^| findstr /ilvc:"USERNAME_1" ^| findstr /ilvc:"USERNAME_2" ^| findstr /ilvc:"administrator"') do logoff %%b  
exit

Ich lasse dieses Script alle 15 Minuten über die Aufgabenplanung laufen.
UnbekannterNR1
UnbekannterNR1 17.02.2025 um 13:31:21 Uhr
Goto Top
Ich stimme auch ganz klar hier für die GPO Lösung mit Sitzungslimit. Aber ich habe gerade ein ähnliches Problem und bastel gerade an einem Speziellen PowerShell Skript dafür. Fragt Benutzer ab und meldet diesen an allen Server im Array ab, wenn getrennt.

Ist noch absolut im Entwicklungsstadium, aber vielleicht hilft es Dir ja. Funktion ist schon so weit gegeben müsste halt aufgehübscht werden und mehr Fehler Korrekturen haben.
## Abmelde Skript für Benutzer an Servern. 
<#
Informationen abfragen= Benuztername 

#>
$Benutzerzumabmelden = $null



function readuser321 () { 
[Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic') | Out-Null  
$msg = 'Enter User name:'  
$title = 'UserName'  
#$default = $null  # optional default value
$default = ""  # optional default value  
$global:Benutzerzumabmelden = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title, $default)
}

while (!($Benutzerzumabmelden)) {  
 #Write-host "true"  
 readuser321
 #Write-Output ""schleife" + $Benutzerzumabmelden"   
   }

#############################

$title    = 'Benutzer abmelden'  
$question = 'Wirklich überall abmelden ?'  
$choices  = '&Ja', '&Nein'  
$ergebnisseTabelle = @()
$remotecomputerArray = @()
$ergebnisseTabelle = @()
$pcNamen = @() 


$remotecomputerArray += 
"server1.de",  
"192.168.0.1",  
"server02.contoso.de"  



cls

# Überprüfen, ob die Computer online sind
foreach ($computer in $remotecomputerArray) {
    if (Test-Connection -ComputerName $computer -Count 1 -Quiet) {
        $pcNamen  += $computer
    }else {
    Write-Output "$computer Offline"}  

}

foreach ($pcName in $pcNamen) {

    try {
        $SitzungsID = $null
        # Führe die quser-Abfrage aus, um den angemeldeten Benutzer zu erhalten
        $quserOutput = quser /server:$pcName 2>$null
        $SitzungsID =  (($quserOutput | Select-Object -Skip 1 | Where-Object { $_ -like $Benutzerzumabmelden }) -split ‚ + ‚ )[1]
        $gefundene = "Server: " + $pcName + ($quserOutput | Select-Object -Skip 1| Where-Object { $_ -like $Benutzerzumabmelden })   
        #write-output " Gefunden auf: $gefundene"  
        #$SitzungsID = ((quser /server:$pcName | Where-Object { $_ -match $Benutzerzumabmelden }) -split ‚ + ‚ )[1]
        
        if ($SitzungsID){ 
        $ergebnis = [PSCustomObject]@{
                'server' = $pcName  
                'benutzer' = $Benutzerzumabmelden  
                'ID' = $SitzungsID  
          }
        $ergebnisseTabelle += $ergebnis
       
        } else {
            Write-Output "Benutzername nicht gefunden oder niemand angemeldet auf $pcName."  
        } #>
    } catch {
        Write-Output "Fehler beim Abrufen von Informationen für $pcName."  
    }
}


Write-Output  "Gefundene Anmeldungen:"  
Write-Output  $ergebnisseTabelle |ft -AutoSize
#Write-Output  $ergebnisseTabelle.Count

#logoff /server:$pcName $SitzungsID
Write-Output  "Sollen diese Abgemeldet werden?"  


$decision = $Host.UI.PromptForChoice($title, $question, $choices, 1)
if ($decision -eq 0) {

foreach ($server in $ergebnisseTabelle) 
    {
     Write-Output "Melde ab:  $($server.server) ID:  $($server.ID)"  
     logoff /server:$server.server $server.ID
      } 

}else {
      write-Output "Abgebochen"}  
Dbgrox
Dbgrox 17.02.2025 um 13:36:34 Uhr
Goto Top
Hallo,

wir benutzen derzeit über die Aufgabenplanung in Windows dies hier:

@echo off
query session >session.txt
for /f "eol=> skip=2 tokens=1,2,3," %%i in (session.txt) DO (
REM Nutzer prüfen, ob er "netadmin" ist
if "%%i"=="%hier Name eingeben%" (
echo Nutzer %%i wird nicht abgemeldet.
) else (
if "%%k" == "Getr." (
REM Getrennte Verbindungen killen
echo Getrennte Sitzung: %%i %%j
logoff %%j
) else (
REM Aktive Verbindungen killen
echo Aktive Sitzung: %%i %%k
logoff %%k
)
)
)
del session.txt
niraxx
niraxx 17.02.2025 um 13:46:49 Uhr
Goto Top
Vielen Dank für die Skripte, die werde ich mal austesten.
Sehen jedenfalls passend aus!

Bei der Lösung per GPO müsste ich eine Gruppe erstellen, auf deren Mitglieder die Einstellung wirken soll.
Ist in der Umgebung hier kompliziert umzusetzen ...
ukulele-7
ukulele-7 17.02.2025 um 13:49:18 Uhr
Goto Top
Sitzungslimit müsste (glaube ich) eine Computer GPO sein, wirkt also auf den ganzen Session Host.
OlliSe
OlliSe 17.02.2025 um 13:57:36 Uhr
Goto Top
Zitat von @niraxx:

Vielen Dank für die Skripte, die werde ich mal austesten.
Sehen jedenfalls passend aus!

Bei der Lösung per GPO müsste ich eine Gruppe erstellen, auf deren Mitglieder die Einstellung wirken soll.
Ist in der Umgebung hier kompliziert umzusetzen ...

Ja,
hört sich erstmalso an, aber, du hast eine Zentrale Steuerung des Ganzen.
Mit Skripts hast du weitere Fehlerquellen, und bei der Fehlersuche ... face-wink