lowrider614
Goto Top

Erkennen ob Remoterechner gesperrt ist

Hallo,

wie kann ich ermitteln, ob auf einem Remoterechner gerade eine aktive Session ohne Bildschirmschoner läuft?

Umgebung:
Windows 7 64bit

Hintergrund:
Wir installieren auf den Rechnern unserer Mitarbeiter keine Sondersoftware mehr, sondern nur noch Standard-Office Programme. Für Sondersoftware steht unseren Mitarbeitern ein "Remotecluster" zur Verfügung. Bitte an dieser Stelle nicht verwirren lassen, das Remotecluster besteht aus älteren Rechnern die im Keller stehen und von den Mitarbeitern mittels MS RDP genutzt werden.
Das Problem ist nun, dass die Mitarbeiter nicht wissen, welchen Rechner sie gerade nutzen können. Um Ihnen diese Information mitteilen zu können, möchte ich wissen, ob am Remoterechner gerade gearbeitet wird. Dazu muss ich folgende drei Fälle unterscheiden und je nach Fall die Info "frei" oder "belegt" an den Mitarbeiter weitergeben (dies geschieht auf einer Website, aber das ist nicht Teil der hier gestellten Frage).

Fall 1: Wie direkt nach einem Neustart
Es ist kein User auf dem Rechner angemeldet und demnach existieren auch keine aktiven oder inaktiven Sessions.

Fall 2: Aktive Remotesession vorhanden, es arbeitet jemand am Remoterechner.
Ein Mitarbeiter arbeitet aktiv mit dem Remoterechner und eine Nutzung durch einen zweiten Mitarbeiter ist nicht möglich. Versucht der zweite Mitarbeiter nun sich am Remoterechner anzumelden, erhält der erste Mitarbeiter eine Anfrage, ob er seine eigene Verbindung trennen lassen möchte. Dies kann der erste Mitarbeiter ablehnen oder annehmen.

Fall 3: Aktive Remotesession vorhanden, es arbeitet aber niemand am Remoterechner, der Bildschirm ist gesperrt.
In diesem Fall hat der erste Mitarbeiter seinen Arbeitsplatz verlassen und vom Remoterechner wird der Bildschirm gesperrt. Ein anderer Mitarbeiter könnte den Rechner nutzen.

Ich habe mir vorgestellt, dass Ganze in ein Batch- oder PowerShell Skript zu stecken und dieses bei Bedarf oder automatisiert ausführen zu lassen. Als Ergebnis kommt "frei" oder "belegt" raus.
Grundsätzlich bin ich auch allen anderen Lösungen gegenüber aufgeschlossen, allerdings bin ich außer bei Batch und Powershell nur wenig bewandert was die Programmierung angeht.

Schon mal vielen Dank für's Lesen dieser Zeilen, hoffentlich kann mir jemand bei meinem Problem helfen!

Schöne Grüße

Tim

Content-Key: 289120

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

Printed on: April 19, 2024 at 05:04 o'clock

Member: spinnifex
spinnifex Nov 23, 2015 at 13:19:57 (UTC)
Goto Top
Hallo lowrider,

ohne Dir weder die PS noch batch-Details liefern zu können, vielleicht hilft folgende Idee: Über die Computerverwaltung lässt sich z.B. die Ereignisanzeige (und dort An- und Abmeldeinformationen) eines Remote-Computers auslesen. Was ich (als PS-Laie) manuell über Systemsteuerung > Computerverwaltung > Ereignisanzeige > Verbindung mit anderem Computer herstellen ... bewerkstellige, wird Dir ein PS-Profi (oder Du selbst) sicher in ein Skript umsetzen können.

Nur am Rande: Laufen denn Deine Kellerkinder auch mit Win7?

Achja, und noch eine ganz andere Lösung: Weise die Keller-PCs doch einfach jeweils einer Arbeitsgruppe zu, die sich dann per Flurfunk über die Verfügbarkeit verständigt... face-wink

Gruß Spinnifex
Member: DerWoWusste
Solution DerWoWusste Nov 23, 2015 updated at 17:51:47 (UTC)
Goto Top
Hi.

Ich schlage folgenden einfachen Weg vor: stell im taskscheduler der Clusterrechner ein paar Tasks ein, die von einem Trigger gestartet werden, der wahlweise "on workstation lock" oder "at logoff" usw. ist. Dann lässt Du die Tasks einfach eine Datei auf eine Freigabe schreiben: %computername%_istfrei / %computername%_inVerwendung / %computername%_ist_gesperrt
Mitglied: 114757
114757 Nov 23, 2015 at 13:48:10 (UTC)
Goto Top
Mit Powershell kann man so ermitteln ob der Rechner gerade auf dem Anmeldebildschirm hängt:
if (!(gwmi win32_process -ComputerName COMPUTERXYZ -Filter "Name = 'logonui.exe'")){  
    write-host "Benutzer sind aktiv"  
}else{
    write-host "Anmeldebildschirm aktiv"  
}
Gruß jodel32
Member: Lowrider614
Lowrider614 Nov 23, 2015 at 14:08:13 (UTC)
Goto Top
Hallo spinnefix,

ja auch meine Kellerkinder laufen mit Win7 64bit.

Das mit der Arbeitsgruppe funktioniert leider nicht, da nicht nur Mitarbeiter sondern auch Studenten auf die Rechner im Remotecluster zugreifen.
Aber danke für deine Antwort!
Member: Clijsters
Clijsters Nov 23, 2015 at 14:09:44 (UTC)
Goto Top
Hallöchen,

Der TO spricht aber von Remote Sessions...
Grundsätzlich beantwortet das seine Frage nach Sperrbildschirm und/oder Screensaver, aber in diesem Fall würde die LogonUI immer laufen. Denn die Anwender sind ja vie RDP verbunden.

Es wäre also sinnvoller, die jeweiligen Sessions zu enumerieren und dessen Status zu prüfen.
Somit könnte man dann sogar - wenn man es rechnerübergreifend gestaltet - eine Art Dispatcher selbst bauen.

Beste Grüße
Dominique
Member: Lowrider614
Lowrider614 Nov 23, 2015 at 14:42:06 (UTC)
Goto Top
Hallo,

schon mal danke für die Lösungsvorschläge!

Der Reihe nach:

@DerWoWusste:
Idee ist prinzipiell prima, würde mir reichen. Ich würde das Ganze dann so regeln, das je nach Zustand eine andere Zahl (0 = frei, 1 = belegt) in eine Datei geschrieben wird.
Nun probiere ich gerade ein wenig mit den Triggern für die Aufgabe rum.
Es gibt also wieder verschiedene Fälle:

Fall 1: Rechner gerade neu gestartet, kein Benutzer angemeldet.
Trigger: Beim Start des Computers -> Zustand = 0

Fall 2: User meldet sich an (ob nach Neustart oder durch "Kicken" einer gesperrten Session ist dabei ja egal)
Trigger: Beim Anmelden -> Zustand = 1

Fall 3: User meldet sich ab
Trigger: Bei Protokollierung eines bestimmten Ereignisses->Hier bräuchte ich eure Hilfe -> Zustand = 0

Fall 4: Bildschirm wird gesperrt
Trigger: Bei Protokollierung eines bestimmten Ereignisses->Hier bräuchte ich eure Hilfe -> Zustand = 0

Fall 5: Bildschirm wird wieder entsperrt
Trigger: Bei Protokollierung eines bestimmten Ereignisses->Hier bräuchte ich eure Hilfe -> Zustand = 1

Bei den Fällen 3-5 bräuchte ich nochmal Hilfe, welches Protokoll ich auswählen muss, was dann die Quelle ist und welche Ereignis-ID die richtige wird. Ich nehme mal an, dass dies einem Filter in der Ereignisanzeige entspricht, allerdings fehlt mir gerade der zündende Gedanke welchen man da setzen muss.

@Clijsters
Könntest du das noch ein wenig genauer ausführen? Den Code von jodel32 habe ich nämlich ausprobiert und es ist genau das von dir vorhergesagte Verhalten eingetreten. Vielleicht muss man den Code ja auch nur noch ein bisschen anpassen und dann geht's?
Prinzipiell fände ich eine Lösung über Abfrage der WMI Ereignisse zumindest interessant, wer weiß wozu man sowas mal wieder brauchen kann.

Vielen Dank noch einmal für eure Mühen.

Tim
Member: Clijsters
Clijsters Nov 23, 2015 updated at 14:56:57 (UTC)
Goto Top
Hallo Tim,
Jodel32s Lösung fragt, ob der Prozess "LogonUI" läuft.
Dieser repräsentiert die Anmeldemaske. An einem normalen Client, an dem sich nur über die Console Session (Direkt vor dem Schirm) angemeldet wird, funktioniert die Abfrage genau, wie sie soll.
Ist der Rechner gesperrt, läuft LogonUI; ist er in Verwendung, läuft er nicht.

In deiner Konstellation melden sich die User aber via MSTSC an dem Gerät an - also über Netzwerk.
Das bedeutet, gehst du in den Keller und schaust auf den Monitor (wenn vorhanden), wirst du eine Anmeldemaske sehen.
LogonUI läuft also, egal ob der User angemeldet ist oder nicht.

Es gäbe da noch _Query User_, welches eine Tabelle der aktuell angemeldeten User ausgibt.
Diese könnte ein Script im Vorfeld remote ausführen. Du könntest auch einen weiteren Rechner aufbauen, der als eine Art Dispatcher fungiert und den Status regelmäßig abfragt. Ein Script auf den Clients holt sich diesen Status und verbindet anhanddessen automatisch auf das richtige, noch freie System.

Beste Grüße
Dominique
Mitglied: 114757
114757 Nov 23, 2015 at 14:55:40 (UTC)
Goto Top
Remote Sessions lassen sich über die WMI Klasse Win32_LogonSession abfragen, wobei man dann den LogonType auf den Wert 2 und 10 auswertet.
https://msdn.microsoft.com/en-us/library/windows/desktop/aa394189(v=vs.8 ...

Gruß jodel32
Member: DerWoWusste
DerWoWusste Nov 23, 2015 at 15:30:26 (UTC)
Goto Top
Fall 4 und 5 sind doch ebenso als Tasktrigger direkt drin: "on workstation lock/unlock".
Member: Lowrider614
Lowrider614 Nov 23, 2015 at 17:57:54 (UTC)
Goto Top
So, das Problem ist gelöst.
Ich habe DerWoWusstes Lösung umgesetzt, funktioniert einwandfrei.
Die einzelnen Ereignisse die ich als Trigger eingesetzt habe:

Remotesession trennen/wiederverbinden:
Protokoll: Sicherheit
Quelle: Microsoft-Windows-Sicherheitsüberprüfung
Ereignis-ID: 4779/4778

Rechner sperren/entsperren:
Protokoll: Sicherheit
Quelle: Microsoft-Windows-Sicherheitsüberprüfung
Ereignis-ID: 4800/4801

Abmelden/Anmelden:
Protokoll: System
Quelle: Microsoft-Windows-Winlogon
Ereignis-ID: 7002/7001

Danke an alle die mitgeholfen haben!

Schöne Grüße

Tim
Member: Lowrider614
Lowrider614 Nov 26, 2015 at 07:18:45 (UTC)
Goto Top
Achja, die Aufgaben habe ich per GPO auf dem Remotecluster erstellt.
Member: -BassT-
-BassT- Jul 01, 2016 at 08:43:01 (UTC)
Goto Top
Hallo,

ich kann die Lösung nicht so ganz nachvollziehen, bräuchte aber etwas ähnliches, kannst du mir auf die Sprünge helfen, wie ich hier vorgehen muss?
Bei uns sind die Remote-Rechner z.T. virtualisiert (Hyper-V), teils physikalisch, unter Windows XP, 7 und 10
Member: Lowrider614
Lowrider614 Jul 01, 2016 at 12:08:42 (UTC)
Goto Top
Wo ist denn das Problem? Mit
Zitat von @-BassT-:

ich kann die Lösung nicht so ganz nachvollziehen,
kann ich leider nicht viel anfangen...