Fremde Anwendung beenden die durch anderen Benutzer gestartet wurde

13/09/2012 - 12:17 von Wilfried Dietrich | Report spam
Hallo!

Ich habe folgendes Problem:

Benutzer A startet den PC und meldet sich mit seinem Benutzernamen
und Passwort an. Dabei wird eine kleine Anwendung X,
die von mir stammt, automatisch gestartet und verrichtet ihre Dienste.
Jetzt kommt Benutzer B, meldet sich über einen Benutzerwechsel
an dem selbigen PC an und führt ein kleines Updateprogramm,
welches von mir stammt und u.a.die Anwendung X beenden,
erneuern und neu starten soll, aus.
Ich bekomme es in diesem Fall nicht gebacken, per Code
die Anwendung X zu beenden und bekomme dann natürlich, beim
Versuch die Datei zu ersetzen (überschreiben), die Fehlermeldung
70 - Zugriff verweigert.

Folgende Versuche, gekürzt dargestellt, waren bisher
ohne Erfolg:

lhWnd = FindWindow(vbNullString, "Anwendung X")
...

Const WM_SYSCOMMAND = &H112
Const SC_CLOSE = &HF060
Const WM_CLOSE = &H10
lResult = SendMassage(lhWnd, WM_CLOSE, 0&, 0&)
lResult = SendMassage(lhWnd, WM_SYSCOMMAND, SC_CLOSE, 0&)

...oder

Const PROCESS_TERMINATE = &H1

Public Function TerminateTask(byVal lhWnd As Long) As Boolean
Dim lTemp As Long, lResult As Long, lTaskID As Long

lResult = GetWindowThreadProcessId(lhWnd, lTaskID)
lTemp = OpenProcess(PROCESS_TERMINATE, 0&, lTaskID)
lResult = TerminateProcess(lTemp, 1&)
lResult = CloseHandle(lTemp)
TerminateTask = (lResult = 1)
End Function


Ich suche eine sichere Methode (Function), die in jedem Fall
die Anwendung beendet und den Erfolg oder Misserfolg zurück gibt.

Gruß
Wilfried
 

Lesen sie die antworten

#1 Martin KoWi
13/09/2012 - 13:35 | Warnen spam
Hallo Wilfried,

FindWindow usw. kannst du vergessen, denn die Anwendung làuft ja auf
einem anderen Desktop/Userkontext - da kannst du kein Fenster davon finden.
Eine Möglichkeit wàre die EXE umzubenennen, das funktioniert auch wenn
sie làuft.
Dann kannst du die neue drüberkopieren, die Rechte dazu brauchst du so
oder so.
Setzt aber voraus dass sich 2 laufende Instanzen sonst nicht in die
Quere kommen.
Der andere Benutzer (im Hintergrund) bekommt die upgedatete EXE
natürlich erst, wenn sie frisch gestartet wird.
Also erst bei der nàchsten Ab/Anmeldung.

gruß, martin.

Am 13.09.2012 12:17, schrieb Wilfried Dietrich:
Hallo!

Ich habe folgendes Problem:

Benutzer A startet den PC und meldet sich mit seinem Benutzernamen
und Passwort an. Dabei wird eine kleine Anwendung X,
die von mir stammt, automatisch gestartet und verrichtet ihre Dienste.
Jetzt kommt Benutzer B, meldet sich über einen Benutzerwechsel
an dem selbigen PC an und führt ein kleines Updateprogramm,
welches von mir stammt und u.a.die Anwendung X beenden,
erneuern und neu starten soll, aus.
Ich bekomme es in diesem Fall nicht gebacken, per Code
die Anwendung X zu beenden und bekomme dann natürlich, beim
Versuch die Datei zu ersetzen (überschreiben), die Fehlermeldung
70 - Zugriff verweigert.

Folgende Versuche, gekürzt dargestellt, waren bisher
ohne Erfolg:

lhWnd = FindWindow(vbNullString, "Anwendung X")
...

Const WM_SYSCOMMAND = &H112
Const SC_CLOSE = &HF060
Const WM_CLOSE = &H10
lResult = SendMassage(lhWnd, WM_CLOSE, 0&, 0&)
lResult = SendMassage(lhWnd, WM_SYSCOMMAND, SC_CLOSE, 0&)

...oder

Const PROCESS_TERMINATE = &H1

Public Function TerminateTask(byVal lhWnd As Long) As Boolean
Dim lTemp As Long, lResult As Long, lTaskID As Long

lResult = GetWindowThreadProcessId(lhWnd, lTaskID)
lTemp = OpenProcess(PROCESS_TERMINATE, 0&, lTaskID)
lResult = TerminateProcess(lTemp, 1&)
lResult = CloseHandle(lTemp)
TerminateTask = (lResult = 1)
End Function


Ich suche eine sichere Methode (Function), die in jedem Fall
die Anwendung beendet und den Erfolg oder Misserfolg zurück gibt.

Gruß
Wilfried


Ähnliche fragen