Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Prüfen, ob EXE in Benutzung ist (https://www.delphipraxis.net/170434-pruefen-ob-exe-benutzung-ist.html)

Guido R. 17. Sep 2012 11:19

Prüfen, ob EXE in Benutzung ist
 
Hallo !

Folgende Situation :
Auf einem verbundenen Netzlaufwerk ('N:\') befindet sich eine EXE-Datei ('Programm.EXE'), die von mehreren PCs im Netzwerk aufgerufen werden kann (auch gleichzeitig). Nirgendwo wird festgehalten, wie viele PCs gerade diese Datei geöffnet haben. Nun soll von einem dieser verbundenen PCs das Programm aktualisiert werden und zwar mittels eines eigenen Programms ('Update.EXE').
Wie kann ich sicherstellen, dass keiner der anderen PCs die Programm.EXE noch geöffnet hat?

Die Lösungen mit IsFileInUse, die man hier im Forum finden kann, haben hier zu keinem akzeptablen Ergebnis geführt. Die scheinbar simple Lösung die Exe-Datei zu Löschen und bei Erfolg die neue EXE in das Verzeichnis zu kopieren hat unter Win7 ebenfalls versagt. Das Löschen scheint zu funktionieren, obwohl die EXE auf einem anderen PC genutzt wird, beim Schreiben kommt es aber zu Problemen.

Kennt noch jemand eine Methode festzustellen, ob die EXE in Benutzung ist?

Gruß
Guido R.

Klaus01 17. Sep 2012 11:24

AW: Prüfen, ob EXE in Benutzung ist
 
Hallo,

da der Prozess der Applikation auf den entfernten Rechner läuft,
dürfte es sich schwierig gestalten herauszufinden von wem die Applikation noch geöffnet ist.

Alle Netzwerkrechner abfragen ist keine Möglichkeit?

Grüße
Klaus

Nersgatt 17. Sep 2012 11:25

AW: Prüfen, ob EXE in Benutzung ist
 
Schreibe ein kleines Zusatzprogramm. Dieses wird von den Clients aufgerufen. Es kopiert dann die EXE vom Netzwerklaufwerk und startet dann die Kopie. So ist die Exe nie in Verwendung. Beim nächsten Neustart der Clients holen die sich die neue Exe.
Ggf. könntest Du es noch etwas intelligenter machen. Mach z.B. zusätlich zu der eigentlichen Exe eine kleine Textdatei, wo die Version der Netzwerk-Exe drin steht. Das Startprogramm vergleicht dann die Version aus der Textdatei mit der lokalen Kopie und kopiert die Exe nur, wenn die Netzwerk-Exe neuer ist. So muss nicht jedes Mal die EXE über das Netzwerk transportiert werden, sondern nur, wenn es ein Update gab.

Morphie 17. Sep 2012 11:34

AW: Prüfen, ob EXE in Benutzung ist
 
Was hat der "Server" für ein Betriebssystem?
Unter Windows 7 kann man über die "Computerverwaltung > System > Freigegebene Ordner > Geöffnete Dateien" einen Überblick erhalten, welche Dateien von welchem Rechner geöffnet sind. Dort sollte eigentlich auch deine Exe-Datei drin stehen.
Wenn das so ist, müsste man mal herausfinden, wie Windows an diese Informationen gelangt.

Unter Windows Server 2008 R2 findest du diese Übersicht im "Server-Manager > Rollen > Dateidienste > Freigabe -und Speicherverwaltung > Geöffnete Dateien verwalten"

himitsu 17. Sep 2012 11:55

AW: Prüfen, ob EXE in Benutzung ist
 
Server 2011 und eventuell auch in allen normalen Windowsen?
Compoterverwaltung \ System \ Freigegebene Ordner \ Geöffnete Dateien

Nja, darin stehen die Dateien, welche über's Netzwerk offen sind, aber der Server hat die Datei ja auch geöffnet, um sie überhaupt weiterreichen zu können und dieses ist dann genauso testbar, wie andere lokal geöffnete Dateien (Unlocker und Co.)

In Win7 gibt es doch auch eine neue API, welche man nach Programen fragen kann, die eine Datei offen hält.

stOrM 17. Sep 2012 12:09

AW: Prüfen, ob EXE in Benutzung ist
 
Also um zu erkennen ob der Prozess auf einer Remotekiste rennt könntest du z.B. Jwscl

Oder WMI nutzen

Oder hier nachgucken, siehe Luckies post

Oder das hier

Guido R. 17. Sep 2012 12:25

AW: Prüfen, ob EXE in Benutzung ist
 
@Klaus
Das upzudatende Programm ist eine Clipper - Altlast :kotz:
Dort etwas einzubauen, was auf eine IP-Anfrage reagiert ist ...
...aufwendig bis gewagt.

@Nersgatt
An sich eine sehr gute Idee. Jedoch wurde das Programm von jmd. geschrieben,
der von Programmierung eigentlich wenig Ahnung hatte. Pfade zu Datenbankdateien,
Berichtvorlagen etc. sind nicht unbedingt mit glob. Pfadvariablen verknüpft.
Also müsste man an hundterten Stellen eben diese einfügen. In CLIPPER :kotz:
2. Problem : Es könnte zu Dateninkonsistenzen kommen, wenn zwei unterschiedliche
Programmversionen auf die gleiche Datenbank-Datei zugreifen.

@Morphie, Himitsu
Das sollte mit jeder Windows-Version ab XP laufen. In den meisten Fällen wird wohl kein "echter" Server zum Einsatz kommen, aber ausschließen kann ich das nicht. Die Sache mit den "geöffneten Dateien" klingt vielversprechend. Jetzt müsste ich "nur" noch wissen, wie ich diese mit Delphi abfragen kann.

Bernhard Geyer 17. Sep 2012 12:39

AW: Prüfen, ob EXE in Benutzung ist
 
Zitat:

Zitat von Guido R. (Beitrag 1183254)
Nirgendwo wird festgehalten, wie viele PCs gerade diese Datei geöffnet haben.

Doch, wird es. Der Server von dem die Datei gestartet wird hat eine Verwaltungsliste welche Dateien von wem in Benutzung sind. Man kann auch über WinAPI wenn der Prozess die entsprechenden Admin-Rechte hat diese Liste abfragen.

Zitat:

Zitat von Guido R. (Beitrag 1183254)
Die scheinbar simple Lösung die Exe-Datei zu Löschen und bei Erfolg die neue EXE in das Verzeichnis zu kopieren hat unter Win7 ebenfalls versagt. Das Löschen scheint zu funktionieren, obwohl die EXE auf einem anderen PC genutzt wird, beim Schreiben kommt es aber zu Problemen.

Das Löschen funktioniert auch nicht. Nur der Windows-Explorer denkt das die Datei gelöscht wäre. Ein aktualisieren der Anzeige bringt die Exe wieder zum vorschein.

Aber umbennenen geht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz