AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Programm in Citrix Session beenden..
Thema durchsuchen
Ansicht
Themen-Optionen

Programm in Citrix Session beenden..

Ein Thema von erich.wanker · begonnen am 6. Jul 2009 · letzter Beitrag vom 6. Jul 2009
Antwort Antwort
Benutzerbild von erich.wanker
erich.wanker

Registriert seit: 31. Jan 2008
Ort: im schönen Salzburger Land
454 Beiträge
 
Delphi XE4 Professional
 
#1

Programm in Citrix Session beenden..

  Alt 6. Jul 2009, 12:16
Hallo Forum,

Wenn auf einem Win2008 Server Citrix läuft, und mein Programm mehrfach in Sessions läuft, würd ich gerne ein SendMessage oder so schießen, damit alle Programme sich schließen ... hat jemand Erfahrungen oder Vorschäge

vielen Dank

Erich
Erich Wanker - for life:=1971 to lebensende do begin ..
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.763 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Programm in Citrix Session beenden..

  Alt 6. Jul 2009, 12:26
Hab eigentlich wenig Ahnung von Terminalservern, und wenn ich totalen Müll labere bitte ich um Nachsicht. Aber ist es nciht das Konzept von Terminalservern, daß die einzelnen Sessions eben nix voneinander wissen, sich also nicht stören können?

Sherlock
Oliver
  Mit Zitat antworten Zitat
Benutzerbild von Codewalker
Codewalker

Registriert seit: 18. Nov 2005
Ort: Ratingen
945 Beiträge
 
Delphi XE2 Professional
 
#3

Re: Programm in Citrix Session beenden..

  Alt 6. Jul 2009, 13:44
Ich kenne auch nur Code von den Schweitzern, mit dem man ermitteln kann, ob das Programm in einer Terminal Session läuft - aber sessionübergreifende Nachrichten dürften auch miener Meinung nicht möglich sein. Hilft es dir denn nicht schon, wenn du weißt, ob das Programm in einer Terminal Session läuft? Was genau hast du denn vor? Evtl. finden wir eine andere Lösung
  Mit Zitat antworten Zitat
Alt 6. Jul 2009, 13:53     Erstellt von mjustin
Dieser Beitrag wurde von mkinzler gelöscht. - Grund: Versehentlicher Doppelpost (Zitat statt Edit) Beiträge wurden verschmolzen
mjustin

Registriert seit: 14. Apr 2008
3.005 Beiträge
 
Delphi 2009 Professional
 
#4

Re: Programm in Citrix Session beenden..

  Alt 6. Jul 2009, 14:12
Zitat von erich.wanker:
Hallo Forum,

Wenn auf einem Win2008 Server Citrix läuft, und mein Programm mehrfach in Sessions läuft, würd ich gerne ein SendMessage oder so schießen, damit alle Programme sich schließen ... hat jemand Erfahrungen oder Vorschäge

vielen Dank

Erich
Named Pipes bieten sich da an:
http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx

Oder eine einfache Lösung:
eine Datei an einer bestimmten Stelle als Signal verwenden. Wenn sie da ist, beenden sich die Programme. Setzt aber voraus, dass die Programme Zeit und Lust haben, an dieser Stelle ab und zu vorbeizuschauen.

Viele Grüße,

[edit=mkinzler]2 Beiträge zusammengefasst Mfg, mkinzler[/edit]
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
gvita

Registriert seit: 28. Okt 2004
10 Beiträge
 
#5

Re: Programm in Citrix Session beenden..

  Alt 6. Jul 2009, 14:26
Unter WTS oder Citrix machst du so etwas am besten mit einem globalen mutex

http://support.microsoft.com/kb/310153

Gruß
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: Programm in Citrix Session beenden..

  Alt 6. Jul 2009, 15:24
Allerdings sollte man genau überlegen, ob auch in Zukunft wirklich nur ein Terminalserver zum Einsatz kommt.
In größeren Firmen sind davon auch gern mal mehrere, auf die sich die Anwender dynamisch bei Anmeldung verteilen.
Da scheint mir eine Komunikation der einzelnen Instanzen per Netzwerk erforderlich.
Denkbar z.B. auch über einen gemeinsamen Datenbankserver.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#7

Re: Programm in Citrix Session beenden..

  Alt 6. Jul 2009, 15:29
Auf einem Terminalserver kann ein Programm erst dann upgedated werden, wenn auch der letzte User das Programm beendet hat.
Bei 20 und mehr Usern kann das zum Problem werden.
Einfach mit dem Taskmanager alle Prozesse abschiesen ist auch keine saubere Lösung.
Daher:
Der Admin startet das Programm mit dem Übergabeparameter /shutdown.
Das Programm sendet daraufhin eine Windows-Message an alle Nachbarprozesse, listet alle ProzessIDs in der Konsole auf und beendet sich selbst.
Alle anderen Prozesse erhalten die Message und geben dem Benutzer z.B. folgende Mitteilung:
Zitat:
Bitte speichern Sie Ihre Änderungen und beenden Sie dieses Programm!
90% der Benutzer wird wahrscheinlich der Aufforderung nachkommen.
Die Leute, die nicht gespeichert haben, haben Pech gehabt, denn nach 3 Min probiert der Admin das Gleiche nochmal.
Und wird dann die restlichen Prozesse gnadenlos abschiesen (oder vielleicht vorher anrufen, wenn er nett ist).
In der Unit JclAppInst der JCL gibt es die Klasse TJclAppInstances.
Damit kann man wohl alle oben beschriebenen Aufgaben erledigen.

Nachtrag: ja, es klappt mit TJclAppInstances recht gut.
Andreas
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.005 Beiträge
 
Delphi 2009 Professional
 
#8

Re: Programm in Citrix Session beenden..

  Alt 6. Jul 2009, 15:36
Zitat von shmia:
Auf einem Terminalserver kann ein Programm erst dann upgedated werden, wenn auch der letzte User das Programm beendet hat.
Sicher? Wir benennen die Exe-Datei auf dem Fileserver einfach nur um und kopieren dann die neue Version in dieses Verzeichnis, mit dem gleichen Namen. Das funktioniert hier unter Citrix in 99% aller Fälle, früher (unter Novell) war es noch anders.

Viele Grüße,
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#9

Re: Programm in Citrix Session beenden..

  Alt 6. Jul 2009, 15:47
Zitat von mjustin:
Wir benennen die Exe-Datei auf dem Fileserver einfach nur um...
Das hängt wohl irgendwie vom OS ab.
Unter Windows Server 2003 (kein Citrix, nur Terminserver von MS) ist das nicht möglich ("cannot rename xxx. Its being used by another person or program. Close any Programs....").
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von erich.wanker
erich.wanker

Registriert seit: 31. Jan 2008
Ort: im schönen Salzburger Land
454 Beiträge
 
Delphi XE4 Professional
 
#10

Programm in Citrix Session beenden..

  Alt 6. Jul 2009, 18:35
Vielen Dank für die vielen Info´s ..

Sendmessage geht nicht, Timer mit Textfile will ich eher nicht, Datei einfach umbenennen geht auch nicht, Mutex .. hmm .. tja .. mal schauen ..


Momentane Überlegung:
  • Timer und Datenbank als "Kommunikationsschnittstelle"...






Info betreffend: WIESO Programm in Citrix-Session schließen und die momentane Vorstellung des Ablaufes:

2 Programme: Ein Updateprogramm und die Anwendung(die mehrfach in Instanzen ausgeführt wird)...

Delphi-Quellcode:
Firebird 2.1.0 . (via ZEOS)
Table: UPDATE_INFO
Field: UPDATE_EXISTS Boolean
Field: RUNNING_SYSTEMS Integer

Wird ein Update eingespielt, setzt das Updateprogramm UPDATE_EXISTS auf True, setzt RUNNING_SYSTEMS auf null und wartet 20 Sek.

Die Anwendung kontrolliert alle 15 Sek. den UPDATE_EXISTS-Wert. Ist der true, dann wird der Wert RUNNING_SYSTEMS um 1 erhöht und die UPDATE_EXISTS-Überprüfung abgebrochen. Hinweis an User: "Stell die Arbeit ein und schließe das Programm - in 5 Minuten wird es Zwangsgeschlossen" - zeitaufwändige Rechenoperationen sind ab nun nicht mehr möglich..

Beim OnClose der Anwendung wird der Wert RUNNING_SYSTEMS um 1 reduziert .. (aber nur, wenn Anwendung zuvor RUNNING_SYSTEMS um 1 erhöht hat)

Das Updateprogramm wartet so lange, bis RUNNING_SYSTEMS = 0 und ersetzt dann die Anwendungsdatei und setzt UPDATE_EXISTS auf False

Wenn Anwendung gestartet wird, und UPDATE_EXISTS auf True gesetzt ist - Anwendung sofort wieder schließen...



Probleme:
User startet Anwendung - Anwendung schließt sich aber sofort wieder, weil UPDATE_EXISTS=True (kein Showmessage oder so möglich )

User weiß eigentlich nicht - wann das Update fertig eingespielt ist, und er die Software wieder verwenden kann..

Umso mehr Spielraum beim "Zwangsschließen" (in dem Beispiel 5 Minuten) - umso länger müssen die anderen User warten, die sofort ausgestiegen sind.

Zufällig könnte die Anwendung genau dann gestartet werden, wenn sie gerade ersetzt wird.. dann schmiert entweder die Anwendung ab, oder das Updateprogramm kann die Anwendung nicht ersetzen, weil sie gerade verwendet wird.. da das Zeitfenster ja doch einigermaßen groß ist . (Software als Instanz starten, fbclient.dll als Instanz starten, Zeos aufbauen.. Verbindung herstellen -- Query´s öffnen .. UPDATE_EXISTS auslesen)


... mir wird erst jetzt bewußt, das nicht das "killen" der Instanz ein Problem darstellt, sondern die ganze Logistik

vielen Dank

Erich
Erich Wanker - for life:=1971 to lebensende do begin ..
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz