Autor Beitrag
trm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 491
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: So 29.08.10 20:44 
Hallo,

ich versuche eine Möglichkeit in mein Programm zu implementieren, mit der ich ermitteln kann, welche Computer auf eine Datei in einem Netzwerk zugreifen.

Dabewi gibt es aber einige Hindernisse:

1. Ich habe nicht die Möglichkeit auf dem Rechner (evtl. Server) ein Programm laufen zu lassen, mit dem ich die Clients kommunizieren lassen kann.
2. Der Intervall (siehe meine Idee weiter unten) sollte den eigentlichen Arbeitsprozess nicht stören.
3. Bei Bedarf sollten weitere Werte der zu ermittelnden Rechner übertragen werden.

Hier meine Idee, wie ich es realisieren wollte.

Ich nutze entweder eine Textdatei oder eine Datenbank, in der ich alle 10 Sekunden einen Eintrag überschreibe / erstelle, der folgende Werte enthält:

* Name des PC
* lokale IP des PC
* angemeldeter Benutzer des PC
* angemeldeter Benutzer des Programms, welches auf dem PC läuft
* aktueller Zeitstempel des PC, auf dem das Programm läuft (hier muss ich noch ausknobeln, wie ich die Zeit des "Servers" nutzen kann, falls die PC-Zeit asynchron zur Serverzeit ist (Dummy-Datei erstellen, Zeit der Datei auslesen, Datei löschen?)


Der Hintergrund ist, mein Programm läuft auf einem PC (Server) und alle PC nutzen dieses Programm. Bei einem Update des Hauptprogramms soll nun ermittelt werden, welche PC noch aktiv das Programm geöffnet haben, so dass diese dann explizit benachrichtigt werden können, damit das Programm geschlossen werden kann.


Alternativ zur oben aufgezeigten Idee könnte ich noch folgendes implementieren:

Beim Start wird eine Art LOCK-Datei (wie Firefox oder Thunderbird) erstellt, in die Daten wie oben eingetragen werden.

Vorteil:
Wenn das Programm abstürzt (noch nie passiert seit 1999 in verscheidenen Versionen) kann man damit auf diesen Fall reagieren. Und wenn das Programm noch offen ist, wird bei einem Update eben der entsprechende PC benachrichtigt. Außerdem muss ich somit nicht in bestimmten Intervallen den Eintrag neu machen.

Nachteil:
Fällt mir gerade nicht ein.


Meine Frage nun:

Gibt es für dieses Problem schon jemanden, der eine solche Lösung entwickelt hat und/oder hat jemand eine bessere Idee, die ohne fremde Komponenten (3rd Party) auskommt?


Danke fürs tapfere Lesen bis hier her :)


Moderiert von user profile iconNarses: Topic aus VCL (Visual Component Library) verschoben am So 29.08.2010 um 22:32

_________________
In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege ;)
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: So 29.08.10 22:35 
Moin!

user profile icontrm hat folgendes geschrieben Zum zitierten Posting springen:
Der Hintergrund ist, mein Programm läuft auf einem PC (Server) und alle PC nutzen dieses Programm. Bei einem Update des Hauptprogramms soll nun ermittelt werden, welche PC noch aktiv das Programm geöffnet haben, so dass diese dann explizit benachrichtigt werden können,
Wenn dein Programm eh der "Server" ist, wo ist denn dann das Problem? :gruebel: Wenn der schon nicht weiß, wer da verbunden ist, wer dann? :nixweiss:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
trm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 491
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: Mo 30.08.10 00:05 
Mein Programm ist nicht der Server. Das Programm liegt auf einem anderen PC, welcher ein Server sein kann. Gestartet wird es dann jedoch auf einem anderen PC. Somit läuft es nicht auf dem PC/Server sondern lokal auf einem PC-Client. Wie soll das Programm dann also einem anderen erklären können, welcher andere PC noch beteiligt ist?

_________________
In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege ;)
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 30.08.10 00:13 
Moin!

Sorry, ich check das nicht. :?!?: :nixweiss: Kannst du das nicht mal etwas konkreter beschreiben? :?

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
trm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 491
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: Mo 30.08.10 00:23 
Narses :(

1. calc.exe liegt auf einem Server (Server)
2. ein angeschlossener PC, der Zugriff auf calc.exe hat, startet das Programm (PC1)
3. ein weiterer angeschlossener PC, der Zugriff auf calc.exe hat, startet das Programm auch (PC2)
4. PC2 weiss nicht, dass PC1 das Programm gestartet hat
5. wenn PC1 das Programm beendet, PC2 aber noch nicht, kann das Programm nicht upgedatet werden (nur ein Beispiel, ich will calc.exe nicht updaten)
6. ich möchte nun eine Auflistung aller PC (PC1, PC2 ....) haben, die das Programm geöffnet haben, um dann bei einem Update diese "Verbindungen" zum Programm zu schließen

Ist das jetzt besser verständlich?

_________________
In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege ;)
Fienix
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109

Win 2K, Win XP Pro, Win 7
D 5 Pro., D 7 Ent., D 2010 Pro.
BeitragVerfasst: Mo 30.08.10 08:50 
Also wie ich das verstehe willst du eine Datei auf dem Server überschreiben, kannst dies aber nicht solange die von anderen Rechner geöffnet ist, soweit ist klar.
Ich habe das Problem gelöst indem ich die Datei auf den Client kopiere wenn diese aktueller ist und lokal starte.
Dann kann ich jederzeit die Datei auf dem Server überschreiben.

Evtl. hilft die dieser Ansatz weiter.

_________________
Wer sichert ist feige!!
trm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 491
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: Mo 30.08.10 12:10 
Hallo Fienix,

danke für Deine Idee. Leider ist die inakzeptabel, da das Programm, welches auf dem Server liegt per Verknüpfung gestartet wird.

Da ich

1. nicht weiß, welche PC alle das Programm nutzen,
2. nicht weiß, wo die Verknüpfung liegt (Desktop oder Unterordner auf dem Desktop oder ..),
3. nicht definieren kann, wie schnell ich ein Update bereitstelle (lokale Kopie wäre ja dann auch wieder fürs Update gesperrt, falls das Programm zwischenzeitlich auf dem Server nicht geschlossen wurde),
4. ich dem Anwender meines Programmes (welche/r alle weniger als "normale Benutzer" sind, also keinerlei Erfahrung im Umgang mit einem PC an sich haben) mehrfache Icons nicht zumuten kann,

ist dies leider wirklich nicht praktizierbar.

(Zu Punkt 4: Mein Programm ist intuitiv nutzbar, eine Einweisung erfolgte zusätzlich und diese Programmbedienung ist gänzlich abweichend von einer Windows-Benutzung an sich)

(Bitte keine weiteren Kommentare zu Usability von Windows :) )

_________________
In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege ;)
JoelH
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 806
Erhaltene Danke: 17

Win10
Delphi Alexandria 11.2 Patch 1
BeitragVerfasst: Mo 30.08.10 13:08 
hmm,

warum machst du es nicht so, dass du das Programm einmal austauschst und mit einem "startprogramm" ersetzt, welches dann erst das richtige Programm startet. Über eine Ini oder DB liest du die aktuell zu startende Programmversion aus und startest so das Programm. Dadurch bekommt jeder User nach einem Programmneustart die aktuelle Version und du hast kein Kopierproblem mehr.

_________________
mfg. Joel
trm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 491
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: Mo 30.08.10 13:36 
Huhu.

JoelH, das hatte ich mal gemacht in der Version 2 meines Programmes.
Das blöde an der Sache ist, sobald das Startprogramm das Hauptprogramm startet, ist dieses Hauptprogramm wieder gesperrt für Dateioperationen (ersetzen/umbenennen). Daher führt das zum gleichen Ergebnis wie der direkte Start.

Ansonsten eine gute Idee :)

_________________
In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege ;)
Fienix
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109

Win 2K, Win XP Pro, Win 7
D 5 Pro., D 7 Ent., D 2010 Pro.
BeitragVerfasst: Mo 30.08.10 13:52 
user profile icontrm hat folgendes geschrieben Zum zitierten Posting springen:


1. nicht weiß, welche PC alle das Programm nutzen,
2. nicht weiß, wo die Verknüpfung liegt (Desktop oder Unterordner auf dem Desktop oder ..),
3. nicht definieren kann, wie schnell ich ein Update bereitstelle (lokale Kopie wäre ja dann auch wieder fürs Update gesperrt, falls das Programm zwischenzeitlich auf dem Server nicht geschlossen wurde),
4. ich dem Anwender meines Programmes (welche/r alle weniger als "normale Benutzer" sind, also keinerlei Erfahrung im Umgang mit einem PC an sich haben) mehrfache Icons nicht zumuten kann


1. wofür musst du das denn wissen?
2. ist doch völlig egal
3. in die lokale Kopie kommst du doch garnicht ran(?)
4. kenn ich genau deswegen hab ich es so gelöst

- die Verknüpfung zeigt immer auf die Datei auf dem Server
- wenn diese Datei aktueller ist wird sie in ein lokaltes Verzeichniss kopiert und dort gestartet ansonsten gleich lokal gestartet
- die Datei auf dem Server wird nie geöffnet sondern nur auf die Clients kopiert

_________________
Wer sichert ist feige!!
JoelH
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 806
Erhaltene Danke: 17

Win10
Delphi Alexandria 11.2 Patch 1
BeitragVerfasst: Mo 30.08.10 14:15 
user profile icontrm hat folgendes geschrieben Zum zitierten Posting springen:
Huhu.

JoelH, das hatte ich mal gemacht in der Version 2 meines Programmes.
Das blöde an der Sache ist, sobald das Startprogramm das Hauptprogramm startet, ist dieses Hauptprogramm wieder gesperrt für Dateioperationen (ersetzen/umbenennen). Daher führt das zum gleichen Ergebnis wie der direkte Start.

Ansonsten eine gute Idee :)


Nee, so meinte ich das nicht. Du hast einen Starter und das Hauptprogramm. Das hauptprogramm nummerierst du durch, also HP001, HP002, HP003 usw. jede Version heisst anders. Das Starterprogramm liest nach dem Start aus der DB die aktuelle Versionsnummer aus und staretet diese. Damit kommst du beim Kopiervorgang nie in die Breduillie. Denn du änderst den DB Eintrag von HP003 auf HP004 natürlich zuerst wenn du das File HP 004 schon kopiert hast.

Die einzigen Props die auftreten können, dass zeitweise verschiedene Versionen parallel genutzt werden und dass du mehrere Programmversionen auf einem im Verzeichnis hast, aber ältere Versionen kannst du ja dann löschen wenn sie sie wirklich frei sind.

_________________
mfg. Joel
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 30.08.10 15:41 
Moin!

user profile icontrm hat folgendes geschrieben Zum zitierten Posting springen:
Ist das jetzt besser verständlich?
Jup, schon besser. Es geht also um ein Programm, dass nicht von dir ist, und du willst wissen, wer es im Netz verwendet, richtig? ;)

Also suchst du evtl. sowas?
Geöffnete_Dateien

cu
Narses
Einloggen, um Attachments anzusehen!
_________________
There are 10 types of people - those who understand binary and those who don´t.
Fienix
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109

Win 2K, Win XP Pro, Win 7
D 5 Pro., D 7 Ent., D 2010 Pro.
BeitragVerfasst: Di 31.08.10 08:08 
Ich glaub er will nicht wirklich wissen wer/wo das Programm geöffnet ist:

Zitat:
6. ich möchte nun eine Auflistung aller PC (PC1, PC2 ....) haben, die das Programm geöffnet haben, um dann bei einem Update diese "Verbindungen" zum Programm zu schließen

sondern nur um die Verbindung zu schließen.

_________________
Wer sichert ist feige!!
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Di 31.08.10 08:17 
Ich glaube es ja nicht. Wie kann man so aneinander vorbei reden?

@Narses:
Er will das in seinem Programm prüfen und nicht auf dem Server nachsehen.

@trm:
Der Trick ist, dass du 2 Programme verwendest. Ich mache das mit einer meiner Anwendungen seit Jahren so und es funktioniert einwandfrei.
Der Weg wurde zwar schon beschrieben, aber ich versuche es auch nochmal:
1. Du hast 2 Programme auf dem Server. Dein Hauptprogramm und ein Prüfprogramm.
2. Der Anwender startet nur das Prüfprogramm.
3. Das Prüfprogramm macht einen Versions-Check (bei mir z.B. über das Datum) zwischen dem Hauptprogramm auf dem Server und der lokalen Kopie.
4. Existiert keine lokale Kopie oder die Version ist älter als Server-Version, wird die Server-Version kopiert.
4.1 Wenn die Kopie fehlschlägt, weil die lokale Version in Benutzung ist, gibt es eine Warnung und der Vorgang wird beendet.
5. Danach startet das Prüf-Programm die lokale Kopie und beendet sich.

Die Server-Version deines Programms wird dabei nie gestartet. Ein Konflikt, wie von dir beschrieben ist dadurch nahezu ausgeschlossen.

Mögliche Probleme:
- Fehlende Berechtigungen beim Kopieren in das lokale Verzeichnis.
- Man muss wissen, wohin kopiert werden soll. (Lösung über feste Einstellungen oder z.B. über eine INI-Datei)

Bin gespannt, ob das jetzt besser verständlich ist.

Für diesen Beitrag haben gedankt: trm
trm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 491
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: Di 31.08.10 16:39 
Hallo Peter,

danke für Deine Erklärung. Jetzt habe ich das verstanden :)

Ich teste mal was, vielleicht geht es mit Deiner Idee auch bei mir.
Der Nachteil ist, dass die Benutzer, die das Programm öffnen auf Dateien im gleichen Verzeichnis wie das Hauptprogramm liegen, zugreifen müssen (setup.ini, datenbanken).

Eventuell kann ich über das "Startprogramm" den eigentlichen Arbeitspfad weitergeben, so dass im Endeffekt dann nichts von der Nutzbarkeit verloren geht.

Ich melde mich, wenn ich was brauchbares entworfen habe :)

Danke nochmal.

_________________
In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege ;)
trm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 491
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: Mi 01.09.10 10:15 
Bitte nicht schimpfen, dass ich nicht editiert habe, aber so kann ich sicher sein, dass eine Nachricht and ide betreffenden, die das hier interessiert, raus gegangen ist.

Peter: meinst Du, es wäre praktikabel, wenn Deine Idee mit Hilfe des temporären Ordners unter Windows umgesetzt wird?
Ich habe hierzu keinerlei Erfahrung und möchte dem Admin/Benutzer meiner Programme nicht zumuten, den Dateiresten hinterher zu rennen.
Daher meine Idee: Das Startprogramm kopiert eine aktuelle Version ins temporäre Verzeichnis vom angemeldeten Benutzer. Der Pfad zum Arbeitsverzeichnis (auf dem Server) wird als Parameter übergeben. Somit sollten doch alle Vorraussetzungen geschaffen sein, dass ich ohne allzuviele Änderungen im Hauptprogramm weiter arbeien kann?

Das Problem ist nun nur: kann es unter Umständen Restriktionen seitens des OS geben, dass der angemeldete Benutzer keine Berechtigung hat, im TEMP-Verzeichnis zu agieren? Müsste ich dann per Start-Programm mir irgendwelche erweiterten Rechte holen/zuweisen ?

Statt wie bisher den Pfad zum Programm zu ermitteln (extractfilepath(application.exename)) würde dann eben z.B. pfad:=paramstr[1]; erfolgen - je nachdem, woe der Pfad als Parameter übergeben wird..

_________________
In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege ;)
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 01.09.10 10:47 
Das Temporär-Verzeichnis halte ich für nicht ideal.
Du weißt sicher, dass der Anwender Verzeichnis nutzen kann, wo Schreibrechte existieren.

Du könntest folgende Routine verwenden:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
Function GetUserPersonalPath : String;
var
  pIdL: PItemIDList;
  Path: Array [0..Max_Path] Of Char;
  Allocator: IMalloc;
Begin
  // ItemIdList für den Ordner holen
  SHGetSpecialFolderLocation (0, CSIDL_PERSONAL, pIdL);

  // ItemIdList in String umwandeln lassen
  SHGetPathFromIDList (pIDL, Path);

  // Speicher wieder freigeben
  If Succeeded (SHGetMalloc (Allocator)) Then
  Begin
    Allocator.Free (pIdL);
    {$IFDEF VER100}
    Allocator.Release;
    {$ENDIF}
  End;

  Result := Path;
end;

um auf den Bereich "Eigene Dateien" zuzugreifen und dort eine entsprechendes Unterverzeichnis anzulegen.
Die Prozedur stammt ursprünglich von Tino (guggst du hier) und ist nur in dem CSIDL-Wert abgewandelt.

Datei-Reste dürfte es ja theoretisch nicht geben, da du die veraltete Datei ja bei einem Update immer wieder überschreibst. Die Idee bei der Lösung soll ja nicht sein, immer(!) die Server-Version zu kopieren, sondern nur, wenn eine neuere Variante vorliegt. Wenn es keinen Version-Unterschied gibt, kannst du den Kopier-Vorgang einfach überspringen. Das beschleunigt dann auch den Programmstart.
trm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 491
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: Mi 01.09.10 11:47 
user profile iconjasocul hat folgendes geschrieben Zum zitierten Posting springen:
Das Temporär-Verzeichnis halte ich für nicht ideal.
[..]
Die Idee bei der Lösung soll ja nicht sein, immer(!) die Server-Version zu kopieren, sondern nur, wenn eine neuere Variante vorliegt. Wenn es keinen Version-Unterschied gibt, kannst du den Kopier-Vorgang einfach überspringen. Das beschleunigt dann auch den Programmstart.


Kannst Du mir auch bitte den/die Gru/ü/nd/e nennen, warum das tmp-Verzeichnis nicht optimal sein könnte?

Hm, bei einer Programmgröße von maximal 5 MB sollte ein Kopierprozess nicht zu lange dauern und den Startvorgang nicht sonderlich verzögern. Bei einer "erzwungenen" Kopieraktion jedes mal könnte man die Versionsprüfung doch auch sein lassen. Somit wäre in jedem Fall sicher gestellt, dass die aktuelle Serverversion benutzt wird.
Sollte aus einem Grund z.B. eine ältere Version nach einer neueren Version eingesetzt werden müssen (Programmierfehler passieren jedem), dann müsste ich ja einen <> Vergleich bei der Versionprüfung durchführen, statt eines >.

Generell gefällt mir aber Deine Idee immer besser. Wenn auch ein gewisses Restrisiko besteht - in Form von Datensicherheit (aber das liegt an meiner internen Programmierung und hat mit Deinem Vorschlag eigentlich nichts zu tun).

Ich danke Dir und den anderen Helfern nochmals für die Mühe und schließe diesen Thread vorerst mit Status: Erledigt :)

_________________
In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege ;)
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 01.09.10 12:07 
user profile icontrm hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconjasocul hat folgendes geschrieben Zum zitierten Posting springen:
Das Temporär-Verzeichnis halte ich für nicht ideal.
[..]
Die Idee bei der Lösung soll ja nicht sein, immer(!) die Server-Version zu kopieren, sondern nur, wenn eine neuere Variante vorliegt. Wenn es keinen Version-Unterschied gibt, kannst du den Kopier-Vorgang einfach überspringen. Das beschleunigt dann auch den Programmstart.


Kannst Du mir auch bitte den/die Gru/ü/nd/e nennen, warum das tmp-Verzeichnis nicht optimal sein könnte?

Nach deiner Variante kann man das schon machen. Ich kenne nur den genervten Blick der Anwender, wenn der Pogramm-Start länger als 0,5 Sekunden dauert. :lol:
trm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 491
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: Mi 01.09.10 13:45 
Den Blick seh ich nicht ;)

Nein, ernsthaft, ich melde mich, wenn ich das ausprobiert habe. :)

Viele Grüße

_________________
In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege ;)