Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Programm an fremden PC beenden (https://www.delphipraxis.net/25470-programm-fremden-pc-beenden.html)

Micha 7. Jul 2004 08:35


Programm an fremden PC beenden
 
Ich habe ein Programm auf einem Laufwerk liegen.
Auf dieses Programm greifen mehrere User gleichzeitig über eine Verknüpfung (die am Desktop) liegt zu.

Wenn ich jetzt die exe-Datei durch eine neue Version ersetzen will, und es arbeiten gerade welche in dem Programm, kommt natürlich die Meldung, dass die exe nicht ersetzt werden kann.
Es gibt aber auch User, die haben die Anwendung immer laufen und ich kann somit die exe nie ersetzen.

Gibt es eine Möglichkeit, diese best. Anwendung an einem fremden PC zu beenden?

Da das Programm eh mit Datenbanken arbeitet, könnte man es so machen, dass das Programm meinetwegen jede Minuten nachschauen soll, ob in einer Tabelle meinetwegen eine 1 steht, dann beende das Programm, wenn 0 drin steht, dann einfach nichts machen.

Is natürlich nicht sehr schön diese Lösung da evtl. ungespeicherte Datensätze verloren gehen würden.

Weiß jemand eine andere Lösung?

BluesKid 7. Jul 2004 10:07

Re: Programm an fremden PC beenden
 
Moin moin

wir haben hier ne ähnliche Situation (gleichzeitiger zugriff auf exe usw.)...um die zu tauschen benennen wir immer die alte exe um (Programm_old.exe) und kopieren die neue exe ins Verzeichniss, so dass die Verknüpfungen auf die neue Version Zeigen (Programm.exe).

So haben dann alle Benutzer zumindest beim nächsten öffnen die neuste Version :-) sprich manche dann erst am nächsten Tag weil sie eben bis Abends mit dem Programm arbeiten müssen...wird bei euch wirklich rund um die Uhr mit dem Programm gearbeitet ??


schönen Gruß

Sam

alcaeus 7. Jul 2004 10:14

Re: Programm an fremden PC beenden
 
Entwickelt ihr die entsprechende exe selbst? Wenn ja, dann gibt es mehrere Möglichkeiten:
1. Ein Programm, das ihr auf alle Rechner kopiert, auf dem die Anwendung läuft. Dieses Programm gibt eine Meldung aus, dass das Prog in 1 Minuten oder 2 geschlossen wird, und der Benutzer so lange Zeit hat zu Speichern. Mit Adminrechten kannst du ja remote auch Prozesse ausführen. Sobald die 2 Minuten vorbei sind, kannst du beruhigt kopieren.

2. Ihr baut eine dynamische Updatefunktion ein, die mit einem Paket vom Netzwerk aus aktiviert wird. Sobald ein bestimmtes Datenpaket ankommt, wird das Programm beendet und die Bestätigung zurückgesendet.

Falls es nicht unbedingt mit Delphi gemacht werden soll, dann empfehle ich die Dameware NT Utilities, mit denen kann man Prozesse remote beenden. Dort läuft allerdings auch ein Client...

Greetz
alcaeus

Micha 7. Jul 2004 10:54

Re: Programm an fremden PC beenden
 
@BluesKid: Manche lassen ihren Rechner Tag und Nacht laufen und dann eben auch immer gleich das Programm, dass sie es nicht immer öffnen müssen. Is halt so. *g*

Das mit dem Umbennen hat mich jetzt gerade schon ein bisschen verblüfft. Hab es nämlich auch so gemacht. Hätte aber eigentlich eine Meldung beim Umbennen erwartet, dass ich das nicht darf (weil's offen ist). - Aber es hat funktioniert.

Dann werde ich es wohl vorerst so machen.


@alcaeus:
jep, ist ein eigenes Programm mit Delphi
zu 1.: Ja, des wär so ne ähnliche Möglichkeit, wie ich auch schon (oben) gemeint hab.
zu 2.: sorry, versteh ich überhaupt net

Dameware habe ich. Aber um das Nutzen zu können brauche ich doch den PC-Namen oder? Den hab ich ja eigentlich nicht. Außer ich lasse ihn mir beim Starten des Programmes wegschreiben.

Christian Seehase 7. Jul 2004 10:58

Re: Programm an fremden PC beenden
 
Moin Micha,

schau Dir mal die APIs NetFileEnum und NetFileGetInfo an.
Damit könntest Du herausbekommen welcher User die Datei sperrt.
(und ggf. via NetSend darüber informieren, dass sie das Programm neu starten/beenden müssen)

Bowler 7. Jul 2004 11:06

Re: Programm an fremden PC beenden
 
Hi.

Mal ne andere Idee, wobei ich nicht genau weiss, ob sowas in der Richtung schon mit der Updatefunktion gemeint war.

Wäre es nicht möglich, in der Anwednung einen UDP-Server einzubauen (Indy), der auf einem Port horcht? Und Du kannst dann per UDP-Client ein Broadcast ins Netz senden, mit einem bestimmten Befehl/Code, auf den der Server reagiert. Z.B. in dem er eine Meldung ausgibt, dass die Anwendung geschlossen wird bzw. die Anwendung sofort beendet, oder sowas?

Das wäre doch ne ganz feine Lösung, oder übersehe ich da etwas?

Gruß
Christian

Micha 7. Jul 2004 11:46

Re: Programm an fremden PC beenden
 
Zitat:

APIs NetFileEnum und NetFileGetInfo
Sorry, hab keine Ahnung wie ich da ran komm.

Phoenix 7. Jul 2004 11:51

Re: Programm an fremden PC beenden
 
Zitat:

Zitat von Micha
Zitat:

APIs NetFileEnum und NetFileGetInfo
Sorry, hab keine Ahnung wie ich da ran komm.

Guckst Du MSDN-Library durchsuchenNetFileGetInfo

Micha 7. Jul 2004 12:01

Re: Programm an fremden PC beenden
 
Habe ich mittlerweile auch gefunden, danke.

Aber ich weiß nicht, wie das Ding aufrufen kann.

Zitat:

NET_API_STATUS NetFileGetInfo(
LMSTR servername,
DWORD fileid,
DWORD level,
LPBYTE* bufptr
);

Christian Seehase 7. Jul 2004 12:52

Re: Programm an fremden PC beenden
 
Moin Micha,

mal ein kleines Beispiel für NetFileEnum, für dass Du noch ein Memo und einen Button brauchst.

Delphi-Quellcode:
const
  MAX_PREFERRED_LENGTH = DWORD(-1);
  NERR_Success        = 0;

type
  PFILE_INFO_3 = ^FILE_INFO_3;
  FILE_INFO_3 =
    packed record
      fi3_id         : DWord;
      fi3_permissions : DWord;
      fi3_num_locks  : DWord;
      fi3_pathname   : PWChar;
      fi3_username   : PWChar;
    end;

  NET_API_STATUS = DWORD;

  function NetFileEnum(
    const servername   : PWChar;
    const basepath     : PWChar;
    const username     : PWChar;
    const level        : DWord;
    const bufptr       : Pointer;
    const prefmaxlen   : DWord;
    const entriesread  : PDWord;
    const totalentries : PDWord;
    const resume_handle : PDWord
    ) : NET_API_STATUS; stdcall; external 'netapi32.dll';

  function NetApiBufferFree(
    const Buffer : Pointer
    ) : NET_API_STATUS; stdcall; external 'netapi32.dll';

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);

var
  pfi3     : PFILE_INFO_3;
  pfi3Work : PFILE_INFO_3;
  dwRead  : DWORD;
  dwTotal : DWORD;
  i       : integer;
  dwResult : DWORD;

begin
  dwResult := NetFileEnum('\\<SERVERNAME>',nil,nil,3,@pfi3,MAX_PREFERRED_LENGTH,@dwRead,@dwTotal,nil);
  if dwResult = NERR_SUCCESS then begin
    try
      Memo1.Lines.Clear;
      pfi3Work := pfi3;
      for i := 1 to dwRead do begin
        Memo1.Lines.Add(pfi3Work.fi3_Username + ' - '+pfi3Work.fi3_pathname);
        inc(pfi3Work);
      end;
    finally
      NetApiBufferFree(pfi3);
    end;
  end else begin
    ShowMessage(SysErrorMessage(dwResult));
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:42 Uhr.
Seite 1 von 2  1 2      

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