d4shoernchen
Goto Top

Windows 2k3, RDP-Abmeldung via Script

Hallo, Community.

Es kommt bei uns häufiger vor, dass sich ein bestimmter User auf unserem TSE nicht ordnungsgemäß abmeldet und einfach nur die Verbindung trennt.

Dies führt zu keiner korrekten Durchführung der Datensicherung.

Dem Benutzer wurde schon mehrfach schriftlich, wie auch telefonisch, mitgeteilt wie er sich abzumelden hat. Allerdings bringt dies alles nichts - reine Gewohnheit, vergessen, oder einfach nicht zu verstehen!? Keine Ahnung.

Aus diesem Grund möchte ich nun ein Script, welches einen bestimmten Benutzer vom TSE abmeldet.

Hier im Forum bin ich auf folgenden Beitrag gestoßen:
Allerdings würde ich das Ganze gerne ohne irgendwelche Zusatzsoftware (in dem Fall xCMD.exe) gelöst bekommen.

Im Technet von Microsoft habe ich etwas gefunden, was sich allerdings auf die Session-ID's bezieht. Auch hier leider nicht wirklich hilfreich.

Hoffe Ihr kennt ein kleines Script, welches ich zu einer bestimmten Uhrzeit via Task ausführen lassen kann - welches dann einen bestimmten Nutzer (anhand des Benutzernamens) abmeldet.

Vielen Dank und

mit freundlichen Grüßen
Euer hoerncheN

NACHTRAG 11:23 Uhr
Die Konfiguration der Terminaldienste, getrennte Verbindungen nach einer gewissen Zeit selbstständig zu beenden ist nicht gewünscht.

Content-ID: 189156

Url: https://administrator.de/contentid/189156

Ausgedruckt am: 25.11.2024 um 09:11 Uhr

Penny.Cilin
Penny.Cilin 06.08.2012 um 11:31:33 Uhr
Goto Top
Zitat von @d4shoerncheN:

Hier im Forum bin ich auf folgenden Beitrag gestoßen:
> Remote Desktop per Batch trennen?
Allerdings würde ich das Ganze gerne ohne irgendwelche Zusatzsoftware (in dem Fall xCMD.exe) gelöst bekommen.

Im Technet von Microsoft habe ich etwas gefunden, was sich allerdings auf die Session-ID's bezieht. Auch hier leider nicht
wirklich hilfreich.
> http://support.microsoft.com/kb/321705/de

Halli hallo hallöle,

ich bin jetzt nicht der Skriptspezi, aber Du hast durch Deine zwei Links gute Ansätze gefunden. Nimm aus dem ersten Link das Skript und ersetze xcmd.exe durch tdiscon. Man müßte das Skript in sofern anpassen, daß anhand der Session ID die benutzerkennung ermittelt wird und dann die Session des Benutzers getrennt wird.


Gruss Penny.
d4shoerncheN
d4shoerncheN 06.08.2012 um 11:38:55 Uhr
Goto Top
Hallo,

vielen Dank für die schnelle Antwort.

Man müßte das Skript in sofern anpassen, daß anhand der Session ID die benutzerkennung ermittelt wird und dann die Session des Benutzers getrennt wird.

Da fängt es schon an...
ich bin jetzt nicht der Skriptspezi
Ich leider auch nicht. Um ehrlich zu sein, habe ich vom Scripts in jeglicher Form (abgesehen von PHP etc.) ehr gar keine Ahnung davon.

Gruß
bastla
bastla 06.08.2012 um 11:54:23 Uhr
Goto Top
Hallo d4shoerncheN und Penny.Cilin!

Vielleicht kann ich (auf Basis von Query Session - ich kann das leider nicht selbst testen) mit folgendem Oneliner-Batch (zum direkten Testen in CMD jeweils nur %i anstatt %%i) etwas assistieren:
for /f "tokens=3" %%i in ('query session^|findstr /i "Benutzername"') do tsdiscon %%i
Grüße
bastla
d4shoerncheN
d4shoerncheN 06.08.2012 aktualisiert um 11:59:58 Uhr
Goto Top
Hallo bastla,

vielen Dank für das Script.
Werde es jetzt mal testen und melde mich gleich zurück...

... wieder da.
Bekomme folgende Fehlermeldung
tsdiscon Getr. Sitzungsname Getr. nicht gefunden

Script wie folgt in der CMD.exe ausgeführt:
 for /f "tokens=3" %i in ('query session^|findstr /i "USER1"') do tsdiscon %i

Gruß
bastla
bastla 06.08.2012 aktualisiert um 12:15:54 Uhr
Goto Top
Hallo d4shoerncheN!

Der Fehlermeldung entsprechend passt die Tokennummer (4) nicht - führe zu Sicherheit bitte
query session>Sessions.txt
aus und poste den Inhalt der "Sessions.txt" unter Verwendung von "<code>"- und "</code>"-Tags.

[Edit] Da ja auch der Name der Session verwendbar sein sollte, kannst Du auch noch
for /f %i in ('query session^|findstr /i "USER1"') do tsdiscon %i
versuchen (wäre vermutlich auch sicherer) ...
[/Edit]

Grüße
bastla
d4shoerncheN
d4shoerncheN 06.08.2012 aktualisiert um 12:34:41 Uhr
Goto Top
Hallo bastla,

dein Wunsch sei mir Befehl face-smile

 SITZUNGSNAME      BENUTZERNAME             ID  STATUS  TYP         GERŽT
 console                                     0  Verb.   wdcon               
 rdp-tcp                                 65536  Abh”r.  rdpwd               
 rdp-tcp#191       USER1                        5  Aktiv   rdpwd               
 rdp-tcp#175       USER2                        2  Aktiv   rdpwd               
 rdp-tcp#176       USER3                        3  Akti    rdpwd                            
                   USER4                       14  Getr.   rdpwd               
>rdp-tcp#196       Administrator            15  Aktiv   rdpwd   

USER4 ist in dem Fall der Benutzer, der nur getrennt wurde

NACHTRAG
for /f %i in ('query session^|findstr /i "USER4"') do tsdiscon %i
Erhalte dann folgendes
C:\>tsdiscon USER4
Sitzungsname USER4 nicht gefunden
bastla
bastla 06.08.2012 aktualisiert um 12:34:43 Uhr
Goto Top
Hallo d4shoerncheN!

Wie schon vermutet, kann Token 4 natürlich nicht funktionieren - mit 3 sollte es gehen (wobei ich aber trotzdem den Sitzungsnamen bevorzugen würde) ...
[Edit] Blödsinn face-sad - 4 hatte ich ja ohnehin nicht verwendet - trotzdem sollte es mit 3 funktionieren [/Edit]
Sitzungsname USER4 nicht gefunden
ist strange, da ja nach "USER1" gefiltert wird - für
query session|findstr /i "USER1"
sollte das Ergebnis eigentlich so aussehen:
 rdp-tcp#191       USER1                        5  Aktiv   rdpwd               
und daraus müsste dann
tsdiscon rdp-tcp#191
resultieren ...

Grüße
bastla
d4shoerncheN
d4shoerncheN 06.08.2012 um 12:36:15 Uhr
Goto Top
Hallo, bastla.

Sorry - hier muss ich meinen Fehler eingestehen.
ist strange, da ja nach "USER1" gefiltert wird - für
Habe natürlich USER4 genommen, um es der Tabelle anzupassen.

Wenn ich folgendes eingebe, bekomm ich nachfolgende Fehlermeldung:
query session|findstr /i "USER4"
USER4 14  Getr.   rdpwd

Gruß
bastla
bastla 06.08.2012 um 12:38:49 Uhr
Goto Top
Hallo d4shoerncheN!

Jaja, die 4 ... face-wink

Wenn es nur um getrennte Sitzungen gehen soll, dann so:
for /f "tokens=2" %i in ('query session^|findstr /i "USER4"^|findstr /i "getr"') do tsdiscon %i
Grüße
bastla
d4shoerncheN
d4shoerncheN 06.08.2012 aktualisiert um 12:47:11 Uhr
Goto Top
Huhu bastla,

so halb hab ich dich schon geknutscht. Das Script scheint soweit zu funktionieren, es erscheint keine Fehlermeldung mehr und er zieht sich die richtige ID.

tsdiscon 14
Allerdings bleibt der Status des Benutzers weiterhin auf "Verbindung getrennt" und verschwindet nicht.
Ich vermute mal, ohne Programmierkenntnisse zu haben, dass ich es mal wie folgt testen sollte:
for /f "tokens=2" %i in ('query session^|findstr /i "USER4"^|findstr /i "getr"') do tsdiscon rdp-tcp#%i

Hat sich erledigt, kann ja auch nicht stimmen!

Gruß
bastla
bastla 06.08.2012 aktualisiert um 12:55:16 Uhr
Goto Top
Hallo d4shoerncheN!

Mit
tsdiscon rdp-tcp#14
- kannst Du auch gleich so testen - dürftest Du eher keinen Erfolg haben - das Beispiel auf der MS-Seite (und ich kann, wie gesagt, leider nicht selbst testen) ist in dieser Hinsicht suboptimal, da Die Sitzungsnummer und die ID jeweils 5 ist ...

[Edit] Da es aber mit "tsdiscon" ja eigentlich um das Trennen von Sessions geht, sind wir vielleicht ohnehin auf dem falschen Dampfer ... [/Edit]

Grüße
bastla
d4shoerncheN
d4shoerncheN 06.08.2012 um 12:53:41 Uhr
Goto Top
Hallo bastla,

- kannst Du auch gleich so testen - dürftest Du eher keinen Erfolg haben
Hatte ich bereits gemerkt, daher auch durchgestrichen oben.

Gruß
Penny.Cilin
Penny.Cilin 06.08.2012 um 12:59:18 Uhr
Goto Top
Halli hallo Hallöle,

isch werfe da mal qwinsta bzw rwinsta rein, da es sich um RDP-Sessions handelt. Die Syntax ist analog zu tdiscon.


Gruss Penny.
bastla
bastla 06.08.2012 um 13:01:41 Uhr
Goto Top
... und ich habe auf die Schnelle noch einen Thread "Script to log off DISCONNECT terminal services connections" gefunden (komme aber gerade nicht dazu, mir das näher anzusehen) ...

Grüße
bastla
d4shoerncheN
d4shoerncheN 06.08.2012 aktualisiert um 13:12:56 Uhr
Goto Top
Hey ihr Beiden,

ihr seid die Besten!

Mit
for /f "tokens=2" %i in ('query session^|findstr /i "USER4"^|findstr /i "getr"') do rwinsta %i

funktioniert es wunderbar. Vielen lieben Dank noch einmal.

P.S.: Bastla, muss ich es - wenn ich es als. bat ausführen lasse - wieder %%i nutzen, statt %i?

NACHTRAG
Habe es mit %%i in einer .bat-Datei getestet. Funktioniert wunderbar und auch nur wenn der Benutzer getrennt ist. Perfekt! Freitag kann ich es denn in der Praxis testen.

Gruß
Penny.Cilin
Penny.Cilin 06.08.2012 aktualisiert um 13:14:34 Uhr
Goto Top
Ja, musst Du

@bastla:
Könnte man dies evtl. so erweitern, daß auch auf einem englischen Sysstem läuft.
D.h. Abfrage der Sprache und dann den Befehle zum disconnecten?


Gruss Penny.
d4shoerncheN
d4shoerncheN 06.08.2012 um 13:13:24 Uhr
Goto Top
Perfekt, danke nochmals.

Somit -> GELÖST!
bastla
bastla 06.08.2012 um 14:58:42 Uhr
Goto Top
Hallo Penny.Cilin!
Abfrage der Sprache und dann den Befehle zum disconnecten?
... oder bilingual anlegen:
for /f "tokens=2" %i in ('query session^|findstr /i "USER1"^|findstr /i "getr disc"') do rwinsta %i
Noch eine Anmerkung: Damit es zB nur den "USER1" und nicht auch einen "USER12" erwischt, könnte noch das Leerzeichen vor und nach dem Usernamen mit geprüft werden:
for /f "tokens=2" %i in ('query session^|findstr /ic:" USER1 "^|findstr /i "getr disc"') do rwinsta %i
Grüße
bastla
d4shoerncheN
d4shoerncheN 06.08.2012 aktualisiert um 15:13:54 Uhr
Goto Top
Hallo, bastla.

Werde mein script auch mal so erweitern.
for /f "tokens=2" %%i in ('query session^|findstr /ic:" USER1 "^|findstr /i "getr disc"') do rwinsta %%i

Kann ich, wenn ich es wie folgt abänder, quasi mitloggen?
for /f "tokens=2" %%i in ('query session^|findstr /ic:" USER1 "^|findstr /i "getr disc"') do rwinsta %%i > C:\log.txt

Gruß
Penny.Cilin
Penny.Cilin 06.08.2012 um 15:17:38 Uhr
Goto Top
Sollte meines Wissens kein Problem darstellen. Tipp Setze vor Ausführung noch ein TIME /T, damit Du weiß wann der Disconnect ausgeführt wurde.


Gruss Penny.
(die Glaskugel ist b.a.w. in Urlaub)
d4shoerncheN
d4shoerncheN 06.08.2012 um 15:23:32 Uhr
Goto Top
Hey Penny,

Zeit bringt mir in diesem Fall nicht sonderlich viel. Da das Script jeden Freitag um 18:45 Uhr ausgeführt wird, wird natürlich auch die Anmeldung um 18:45 Uhr erfolgen.

Wie bekomm ich es denn hin, dass er das Datum mit in das .txt-File schreibt und immer den neusten Eintrag eine Zeile darunter setzt? Momentan, so wie ich es habe, müsste er ja jedes Mal meine .txt überschreiben.

Gruß
Penny.Cilin
Penny.Cilin 06.08.2012 um 15:33:14 Uhr
Goto Top
ao hängt er es an das log dran:

 for /f "tokens=2" %%i in ('query session^|findstr /ic:" USER1 "^|findstr /i "getr disc"') do rwinsta %%i >> C:\log.txt



Gruss Penny.
d4shoerncheN
d4shoerncheN 06.08.2012 um 15:35:09 Uhr
Goto Top
Zitat von @Penny.Cilin:
ao hängt er es an das log dran:

 for /f "tokens=2" %%i in ('query session^|findstr /ic:" USER1
> "^|findstr /i "getr disc"') do rwinsta %%i >> C:\log.txt



Gruss Penny.
Ups, ein > zu wenig. Stimmt.

Gruß
Holla
Holla 13.08.2012 um 10:32:52 Uhr
Goto Top
Hallo hoerncheN,

alternativ zum Script kann man den TS auch so konfigurieren, dass er nach einer definierten Zeit der Inaktivität eine Zwangstrennung bzw. Abmeldung durchführt.

Gruß
Holla
d4shoerncheN
d4shoerncheN 15.08.2012 um 09:04:20 Uhr
Goto Top
Hallo, Holla.

Vielen Dank für deine Antwort, wie oben aber von mir beschrieben:
Die Konfiguration der Terminaldienste, getrennte Verbindungen nach einer gewissen Zeit selbstständig zu beenden ist nicht gewünscht.
ist dies nicht gewünscht.

Gruß