der-phil
Goto Top

Windows 2012 R2 RDP-Server - Skript bei Disconnect und Reconnect

Hallo!

Ich habe gerade zwei Anforderungen, bei denen ich einfach nicht weiterkomme...

Im Einsatz sind diverse Windows 2012 R2 Terminalserver. Was ich nun bräuchte sind zwei Funktionen:


1. Skript beim Disconnect
Findet ein Disconnect statt, soll ein Skript ausgeführt werden (keine Abmeldung, sondern Verbindungsunterbrechung oder ähnlich)

2. (noch wichtiger) Skript ausführen beim Reconnect
Wird der automatische Reconnect ausgeführt, soll auch hier ein Skript gestartet werden.


Habt ihr eine Idee, wie ich das umsetzen könnte?

Danke und Gruß
Phil

Content-ID: 295274

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

Ausgedruckt am: 22.11.2024 um 02:11 Uhr

126919
126919 05.02.2016 aktualisiert um 14:18:45 Uhr
Goto Top
Eventlogtrigger auf die jeweiligen Connect- und Disconnect Events ?
https://ithompson.wordpress.com/2009/12/01/tracking-rdp-logons/

fk
colinardo
colinardo 05.02.2016, aktualisiert am 15.03.2016 um 15:46:53 Uhr
Goto Top
Hallo Phill,
ich würde es wie @126919 sagt über das Eventlog machen, leider ist der obige Link nicht mehr sehr aktuell und zeigt nicht die richtigen Eventlog-IDs.

Dazu gehst du wie folgt vor:
back-to-top1. Aktivieren des Auditings für Anmeldeereignisse auf dem Server an dem sich die User anmelden
Dazu setzt man entweder per GPO die Überwachungsrichtlinie für Anmeldeereignisse:
Computerkonfiguration > Richtlinien > Windows-Einstellungen > Sicherheitseinstellungen > Lokale Richtlinien > Überwachungsrichtlinie > "Anmeldeereignisse überwachen" > Erfolg

Oder alternativ ohne GPO über die lokale Sicherheitsrichtline per secpol.msc
Sicherheitseinstellungen > Lokale Richtlinien > Überwachungsrichtlinie > "Anmeldeereignisse überwachen" > Erfolg

back-to-top2. Anlegen der Eventlog-Trigger:
Dazu erstellst du jeweils einen Task für den Re- und den Disconnect und gibst unter Trigger einen neuen Ereignis-Trigger mit folgenden Eigenschaften an :

back-to-topFür den Re-Connect eines Users
Eventlog-ID: 4778
0124f6dd7bb8b82518a7b7a7dc661db8

back-to-topFür den Disconnect eines Users
Eventlog-ID: 4779
cedc0932d8801072e8af9eb46b9fcda3

Dann trägst du noch deine jeweiligen Scripte unter Aktion ein, fertig.
Alternativ dazu könntest du auch die vorhandenen Trigger im Task-Scheduler dazu benutzen:

0fc944ae9e034b90329e061e1a9c2d71

167db1c8169ad70fb6fb448f49534134

Achtung dazu noch dieser Hinweis: Mit der Methode hatte ich aber in manchen Situationen/Konfigurationen das Problem, dass sie zweimal kurz hintereinander triggert, gerade wenn man sich wieder mit einer Session verbindet. Das konnte ich mit obigem Workaround über die Eventlog-IDs erfolgreich umgehen, deswegen bevorzuge ich die erste Methode.

back-to-topZusätzliche Hinweise wenn man die Eigenschaften des Events an sein Skript weiterleiten möchte:
Man kann den jeweiligen User der sich angemeldet hat oder auch den Computer von dem aus sich dieser angemeldet hat aus dem Task an dein Script als Variable übergeben. Wie man dazu den Task anpassen muss habe ich in folgenden zwei Beiträgen schon mal beschrieben:
Wie kann ich per Aufgabenplanung einen Wert an ein Script übergeben
Auf geblockte eingehende oder ausgehende Verbindungen der Windows Firewall mit der Aufgabenplanung reagieren
http://aymanstechblog.blogspot.de/2012/05/passing-event-details-as-argu ...

Kurzversion um die Tasks um die Variablen zu ergänzen:
  • Task als XML exportieren
  • XML-Datei öffnen und im Knoten EventTrigger folgendes XML-Schnippsel hinzufügen:
<ValueQueries>
        <Value name="AccountName">Event/EventData/Data[@Name='AccountName']</Value>
        <Value name="ClientName">Event/EventData/Data[@Name='ClientName']</Value>
        <Value name="AccountDomain">Event/EventData/Data[@Name='AccountDomain']</Value>
        <Value name="ClientAddress">Event/EventData/Data[@Name='ClientAddress']</Value>
        <Value name="SessionName">Event/EventData/Data[@Name='SessionName']</Value>
        <Value name="Logged">Event/System/TimeCreated/@SystemTime</Value>
</ValueQueries>
  • Task dann wieder in den Taskplaner importieren
  • Jetzt können die Variablen z.B. unter Argumente an dein PS Script übergeben werden indem man sie so schreibt $(AccountName)

back-to-topZur Veranschaulichung hier ein Beispiel für ein Powershell-Skript das diese Variablen benutzt um einen User nach dem Session-Disconnect direkt abzumelden:

Dazu erstellt man eine ps1-Datei mit folgendem Inhalt:
param([string]$username)
Import-Module RemoteDesktop
Get-RDUserSession | ?{$_.SessionState -eq 'STATE_DISCONNECTED' -and $_.Username -eq $username} | Invoke-RDUserLogoff -Force  
Alternativ für ältere Systeme (Server 2008R2) die das neue RemoteDesktop-Powershell-Modul nicht haben geht es auch mit folgendem Skript:
param([string]$username)
rwinsta ([regex]::match((qwinsta),"(?i)\b$username\b\s*(\d+)").Groups[1].Value)  
Und trägt dann im Task-Scheduler in den Task als Aktion folgendes ein:

Programm starten
Programm/Skript: powershell.exe
Argumente hinzufügen: -File "C:\Pfad\zum\Script\ForceLogoffAfterDisconnect.ps1" "$(AccountName)"

screenshot

Viel Erfolg
Grüße Uwe
126919
126919 05.02.2016 aktualisiert um 19:03:41 Uhr
Goto Top
@colinardo
Respekt - besser hätte man es nicht beschreiben können !

fk
colinardo
colinardo 15.03.2016 um 15:45:54 Uhr
Goto Top
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen. Merci.