Wenn man auf einem (Windows 2008) Server eine RDP-Sitzung trennt (nicht
beendet, damit die Server-Applikation weiterläuft) und später wieder
öffnet, wird in 99% der Fälle die bereits laufende Session wieder
angezeigt. Gut so.
Aber nach einem mir bisher nicht nachvollziehbaren Muster kommt es hin
und wieder vor, dass eine weitere Session gestartet wird und damit
dummerweise auch die (per Autostart verküpfte) Serveranwendung. Die
läuft dann zweimal, was die Clients in hohem Maße verunsichert und auch
fehlerhafte Einträge in der lokalen SQLite-Datenbank verursacht. Wie
kann man sowas verhindern?
Die Benutzung von Mutex-Mechanismen bringt leider Nichts, die wirkt nur
innerhalb der gleichen Session.
(Es geht übrigens immer um den gleichen Benutzer)
Noch brutaler: Eine echte Serveranwendung nehmen, die als Dienst läuft
und nicht auf einen angemeldeten Benutzer angewiesen ist.
Wenn es die für dieses Programm nicht gibt, wechseln, oderwenigstens auf
die Konsole anmelden ( mit /console oder /admin je nach Version des RDP
Client) denn an der Konsole kann immer nur einer angemeldet sein.
Was wenn der Server aus irgendeinem Grund nachts neu startet. (z.B. von
der Notstrom)
Serverdienste sollen nach einem Neustart laufen, auch ohne das jemand
angemeldet ist.
Chris
Frank Esselbach schrieb:> Wie kann man sowas verhindern?
Mit der Terminalserveradministration lässt sich konfigurieren, daß ein
Benutzer nicht mehrere simultane Sitzungen betreiben darf. Wo das jetzt
genau beim W2K8 versteckt wird, kann ich Dir im Moment nicht sagen, bei
W2K3 findest Du es unter
Verwaltung->Terminaldienstekonfiguration->Servereinstellungen, "Nur eine
Sitzung pro Benutzer zulassen".
Das müsste Dein Problem lösen helfen.
Die Kommunikation zwischen Server und Clients läuft über (quittierte)
UDP-Messages - so gesehen gibt es keinen dauernd geöffneten Port.
Idee:
Ich werde dann wohl zusätzlich einen lauschenden TCP-Port einbauen.
Bei Programmstart werde ich versuchen, genau auf diesen Port einen
Connect zu machen.
Gelingt dieser, läuft schon ein Server und ich beende das Programm
wieder. Gelingt er nicht, kann der Start der Aplikation fortgestzt
werden ... Passt das?
Rufus Τ. Firefly schrieb:> Mit der Terminalserveradministration lässt sich konfigurieren, daß ein> Benutzer nicht mehrere simultane Sitzungen betreiben darf. Wo das jetzt
Guter Tip, das habe ich erstmal so gemacht. Nun muss ich nur noch
verhindern, dass ein anderer das Programm manuell ein zweites mal
startet.
Nachfrage: Haben die Netzwerkadapter einer physischen Maschine
eigentlich in allen Sessions die gleiche IP-Adresse? Wohl eher nicht ...
gibt es dfür eine spezielle Loopback-Adresse? Geht 127.0.0.1? Fragen
über Fragen ...
Frank Esselbach schrieb:> Die Benutzung von Mutex-Mechanismen bringt leider Nichts, die wirkt nur> innerhalb der gleichen Session.
Stimmt nicht!
http://msdn.microsoft.com/de-de/library/system.threading.mutex.aspx
"Auf einem Server, der die Terminaldienste ausführt, kann ein benannter
Systemmutex eine von zwei Sichtbarkeitsebenen aufweisen. Wenn der Name
mit dem Präfix "Global\" beginnt, ist der Mutex in allen
Terminalserversitzungen sichtbar. Wenn der Name mit dem Präfix "Local\"
beginnt, ist der Mutex nur in der Terminalserversitzung sichtbar, in der
er erstellt wurde. In diesem Fall kann ein separater Mutex mit demselben
Namen in jeder Terminalserversitzung auf dem Server vorhanden sein. Wenn
Sie beim Erstellen eines benannten Mutex kein Präfix angeben, wird das
Präfix "Local\" verwendet. Innerhalb einer Terminalserversitzung stellen
zwei Mutexe, deren Namen sich lediglich im Präfix unterscheiden, zwei
separate Mutexe dar. Beide Mutexe sind für alle Prozesse in der
Terminalserversitzung sichtbar. Das heißt, die Präfixnamen "Global\" und
"Local\" beschreiben den Gültigkeitsbereich des Mutexnamens relativ zu
Terminalserversitzungen und nicht relativ zu Prozessen."
fchk
Frank Esselbach schrieb:> Nun muss ich nur noch verhindern, dass ein anderer das Programm> manuell ein zweites mal startet.> Die Benutzung von Mutex-Mechanismen bringt leider Nichts, die wirkt nur> innerhalb der gleichen Session.
Wenn der Name des Mutex mit "Global\" anfängt, sollte es
sitzungsübergreifend sein.
Alternativ kannst Du Dir wie von Läubi vorgeschlagen mit einem Socket
ein Mutex selberbasteln.
Christoph Hoell schrieb:> Noch brutaler: Eine echte Serveranwendung nehmen, die als Dienst läuft> und nicht auf einen angemeldeten Benutzer angewiesen ist.
Das ist die einzig sinnvolle Lösung. Alles andere hat Bastler-Status.
Ich bekomme jedesmal einen Mega-Hals, wenn ich sowas installieren muß.
Brrr..
Frank Esselbach schrieb:> Nachfrage: Haben die Netzwerkadapter einer physischen Maschine> eigentlich in allen Sessions die gleiche IP-Adresse? Wohl eher nicht ...
Warum sollte sich die IP ändern? Natürlich bleibt die gleich.
> Warum sollte sich die IP ändern? Natürlich bleibt die gleich.
Wenn auf einer physischen Maschine mehrere Sessions parallel laufen,
dann können die ja wohl kaum die gleiche IP-Adresse haben - oder wie
können die einzelnen Nutzer dann z.B. unabhängig surfen oder Daten
schreiben/lesen?
Wieso denn nicht? Wozu gibt es Ports? Weshalb können auf einem Rechner
mit nur einer einzigen IP mehrere Anwendungen gleichzeitig
Netzwerkverkehr haben? Mach ein paar Sessions auf und frag in jeder per
ipconfig die IP-Adresse ab.
Icke ®. schrieb:> Wieso denn nicht? Wozu gibt es Ports? Weshalb können auf einem Rechner> mit nur einer einzigen IP mehrere Anwendungen gleichzeitig> Netzwerkverkehr haben? Mach ein paar Sessions auf und frag in jeder per> ipconfig die IP-Adresse ab.
DAS ist klar - aber du hast mich missverstanden. Es geht um die gleichen
Anwendungen (z.B. Browser) auf einer physischen Maschine, aber in
verschiedenen (Benutzer-) Sessions. Die können ja in der Paraxis auch
untereinander kommunizieren, was mit der gleichen IP wohl kaum
funktioniern dürfte.
Zusatzfrage: Welche Ordner sind denn für alle Benutzer auf einem
Windows-System physikalisch gleich? Ich würde mal checken, ob sich das
mit einer Datei regeln lässt, in der Datum und Uhrzeit regelmäßig
auktualisiert werden. Das ist notwendig, um die Gültigkeit der Datei zu
bestimmen, falls die Applikation mal abstürzt. Existiert die Datei UND
(!) sind Datum/Uhrzeit aktuell (z.B. höchstens 30 Sekunden alt), läuft
schon eine Instanz ...
Frank Esselbach schrieb:> DAS ist klar - aber du hast mich missverstanden. Es geht um die gleichen> Anwendungen (z.B. Browser) auf einer physischen Maschine, aber in> verschiedenen (Benutzer-) Sessions.
Das ist schon klar, und das hat "icke" auch richtig verstanden.
> Die können ja in der Paraxis auch> untereinander kommunizieren,
Zwei Browser? Wohl nicht. Browser sind Socket-Clients, die kommunizieren
mit korrespondierenden Socket-Servern (wie z.B. Webserver), aber nicht
miteinander.
> was mit der gleichen IP wohl kaum funktioniern dürfte.
Doch, ist so. Ob zwei Browser in einer Sitzung oder in getrennten
Sitzungen laufen macht exakt keinen Unterschied aus. Die IP-Adresse
gehört dem Rechner, nicht den darauf laufenden Sitzungen.
Wenn Du versuchst, zwei Socket-Server auf dem gleichen Rechner zu
starten, die die gleiche Portnummer verwenden, dann gibt es eine
Fehlermeldung, ganz unabhängig davon, ob die beiden Server in der
gleichen oder in unterschiedlichen Sitzungen laufen.
Und das ist der "Trick", wie Du Dir ein Mutex basteln könntest, indem Du
eben einen Port aufmachst und auf eingehende Verbindungen wartest, ganz
so, wie es z.B. ein Webserver macht.
Das kann mit einer gegebenen Portnummer nur ein Programm auf dem
Rechner, ganz unabhängig davon, wieviele Sitzungen gerade aktiv sind.
> Zusatzfrage: Welche Ordner sind denn für alle Benutzer auf einem> Windows-System physikalisch gleich?
Windows fängt Zugriffe auf etliche Verzeichnisse ab, wenn die sie
durchführenden Anwendungen nicht im Exe-Header ein Flag gesetzt haben,
das sie als "Terminalserverfähig" kennzeichnet:
http://msdn.microsoft.com/en-us/library/01cfys9z%28v=vs.80%29.aspx
Frank Esselbach schrieb:> DAS ist klar - aber du hast mich missverstanden. Es geht um die gleichen> Anwendungen (z.B. Browser) auf einer physischen Maschine, aber in> verschiedenen (Benutzer-) Sessions. Die können ja in der Paraxis auch> untereinander kommunizieren, was mit der gleichen IP wohl kaum> funktioniern dürfte.
Ich denke, du hat da was mißverstanden. Normale Anwendungen bauen
Verbindungen abgehend ZU einem bestimmten Zielport auf. Ein Browser
bspw. zu einem entfernten Server auf Zielport 80. Unterschiedlich muß
nur der lokale Port sein, damit die Antworten der richtigen Anwendung
zugeordnet werden. Du kannst ohne weiteres mehrere Browser öffnen und in
allen die selbe Webseite aufrufen. Funktioniert problemlos. Mit den
Sessions auf einem Terminalserver verhält es sich ähnlich. Es wäre was
anderes, wenn in den Sessions Serveranwendungen gestartet werden, die
auf einem Port lauschen. Also wenn z.B. in jeder Session ein Webserver
läuft. Die müßten dann auf verschiedenen Ports arbeiten (bspw. 80, 81,
82, usw.). Die physische Netzwerkschnittstelle benötigt aber trotzdem
nur eine IP-Adresse.
Ich habe bestimmt zwei Dutzend Terminalserver da draußen und ich
schwöre, die haben alle nur eine einzige IP. Es wäre netzwerktechnisch
auch sehr unpraktikabel, wenn jede Session eine eigene IP bräuchte, denn
die Range in einem C-Netz wäre dann ratzfatz aufgebraucht.
> Zusatzfrage: Welche Ordner sind denn für alle Benutzer auf einem> Windows-System physikalisch gleich?
Dafür eignet sich am besten der Ordner "ProgramData", dessen Pfad in der
Variable %ALLUSERSPROFILE% hinterlegt ist.
EDIT: Rufus war ein wenig schneller.
Eine eigene Frage?
Dieser Thread ist über 15 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.