| |
|
|
| Hallo Profaner...
Vorab ein (ganz, ganz) kleiner Ausblick darauf, was demnächst mit der DACL_SET.INC möglich sein wird .
Keine Angst, ist nichts Gefährliches - vielleicht (auf jeden Fall!) auch mal den Taskmanager benutzen?
Kommentar ist erwünscht, bitte aber mit Betriebssystemangabe!
Aufgabe: Unter NT/2000/XP Programm ausschalten ohne sich abzumelden (ist lösbar, wollte es nicht zu schwierig machen ) oder den Button zu drücken. Bin gespannt...
Beste Grüße
AH |
|
|
| |
|
|
|
| PS: Das Programm ändert keine Systemeinstellungen - nur die des aktuellen Prozesses!
(viel Spaß)... |
|
|
| |
|
|
|
| Würde es ja gerne testen - aber was soll ich testen? |
|
|
| |
|
|
|
Rolf Koch | @IF Einfach Taskmanager aufmachen und versuchen (ohne den Button zu klicken in der Anwendung) diese Anwendung zu killen. Danach mal den Button klicken und dann killen.
@Andreas Einwandfrei unter WinXP Pro
Rolf |
|
|
| |
|
|
|
| Nur ob es sich ausschalten läßt, egal wie (nur Herunterfahren und Abmelden ist nicht erlaubt). Unter Windows2000 sehe ich da im Augenblick noch 2 Möglichkeiten - gibt es noch mehr? Funktioniert es unter XP überhaupt??? PS: Button Drücken nur im Notfall! |
|
|
| |
|
|
|
| Nun - es lässt sich bei mir völlig problemlos wie jede Anwendung mit dem Taskmanager terminieren. (WinXPHome)
Salve, iF. |
|
|
| |
|
|
|
Rolf Koch | Hi Andreas, oder war ich zu voreilig? Anwendung beenden wird bei nicht erlaubt hervorragend verboten. Prozess beenden killt Deine Anwendung trotz nicht erlaubt
Rolf |
|
|
| |
|
|
|
| OK, da läuft also etwas anders als unter Windows2000 - ich werde mal versuchen, das Handle anders zu ermitteln... Melde mich wieder! |
|
|
| |
|
|
|
| So, jetzt muß ich erst mal was erklären: Ich habe hier dem aktuellen Prozess das Recht PROCESS_TERMINATE geklaut, und das für jeden User (außer SYSTEM).
Egal wie viele Rechte man klaut, derjenige der der Eigentümer eines Objektes ist (hier ein Prozess) behält immer die Rechte zum Listen und Ändern der Zugriffsgerechtigungen (READ_CONTROL und WRITE_DAC). Unter Windows2000 nutzt der Taskmanager diese dem Eigentümer verbleibenden Rechte nicht, um die Zugriffsrechte wieder so zu ändern, daß ein Prozess beendet werden kann - er ist dann quasi für diesen Prozess abgeschaltet (deshalb dieses Smily - da hatte MS was vergessen).
Unter XP scheint diese Unzulänglichkeit behoben zu sein - das heißt, der Taskmanager verschafft sich scheinbar vorher wieder mehr Rechte.
Versucht einmal, das Programm mittels des Kommandozeilenbefehls AT als Service im Account System zu starten, dann dürftet ihr sehen, was ich meine . |
|
|
| |
|
|
|
| Nochmals eine Bitte: Versucht mal, das Programm über diesen Code zu starten und auch wieder zu beenden. Was passiert dann? KompilierenMarkierenSeparierenDef @CreateProcess(10) !"KERNEL32","CreateProcessA"
Def @GetExitCodeProcess(2) !"KERNEL32","GetExitCodeProcess"
Def @TerminateProcess(2) !"KERNEL32","TerminateProcess"
Declare Command#,StartupInfo#,ProcessInfo#,ExitCode#
Proc CreateProcess
Parameters command$
Declare handle&
Dim Command#,Add(Len(command$),1)
Dim StartupInfo#,68
Clear startupinfo#
Long StartupInfo#,0=68
Dim ProcessInfo#,16
Clear ProcessInfo#
String Command#,0=command$
@CreateProcess(0,Command#,0,0,0,0,0,0,StartupInfo#,ProcessInfo#)
Let handle&=Long(ProcessInfo#,0)
Dispose Command#
Dispose StartupInfo#
Dispose ProcessInfo#
Return handle&
EndProc
Proc KillProcess
Parameters hprocess&
Dim exitcode#,4
@GetExitCodeProcess(hprocess&,exitcode#)
@TerminateProcess(hprocess&,@Long(exitcode#,0))
Dispose exitcode#
EndProc
Declare Terminate&,Start&,Programm$
Windowstyle 31
WindowTitle "Process starten und killen"
Window 0,0-640,440
Let Start&=@CreateButton(%HWND,"Start",20,300,100,30)
Let Terminate&=@CreateButton(%HWND,"Terminate",200,300,100,30)
Enablewindow Terminate&,0
Enablewindow Start&,1
While 0=0
Waitinput
IF @Getfocus(Terminate&)
KillProcess @&(0)
Enablewindow Terminate&,0
Enablewindow Start&,1
ElseIF @Getfocus(Start&)
Let Programm$=@Loadfile$("Eine Anwendung auswählen:","Programme|*.EXE;*.COM;*.PIF;*.BAT")
IF Programm$<>""
CreateProcess Programm$,""
Enablewindow Terminate&,1
Enablewindow Start&,0
endif
Endif
Wend
|
|
|
| |
|
|
|
| Duplicate Identifier Createprocess - schonmal schlecht. [hr:5a5b330929]Aber auch so lässt sich das Prog über den Button oder den TM einfachst terminieren.
Salve, iF.[hr:5a5b330929]PS: Ists richtig das ich alle Deine Programme mit Profan²4 teste? |
|
|
| |
|
|
|
| [quote:bc1c8f568c=iF]Duplicate Identifier Createprocess - schonmal schlecht. [hr:bc1c8f568c]Aber auch so lässt sich das Prog über den Button oder den TM einfachst terminieren. [/quote:bc1c8f568c] Au man, bin ich blöd . Der SID ist mit diesem Handle ja noch default - kann also gar nicht gehen - das Handle hole ich mir ja vor dem Ändern des SIDs. Ist mir gestern gleich nach dem Posten aufgefallen . Ich habe mal eine neue Version hochgeladen und dieser Quelltext dürfte für XP auch gehen: KompilierenMarkierenSeparierenDef @GetExitCodeProcess(2) !"KERNEL32","GetExitCodeProcess"
Def @TerminateProcess(2) !"KERNEL32","TerminateProcess"
DEF @GetWindowThreadProcessId(2) !"USER32","GetWindowThreadProcessId"
DEF @OpenProcess(3) !"KERNEL32","OpenProcess"
DEF @CloseHandle(1) !"KERNEL32","CloseHandle"
DEF @GetLastError(0) !"KERNEL32","GetLastError"
DEF @FormatMessage(7) !"KERNEL32","FormatMessageA"
Declare ExitCode#,PROCESS_ID&,Fenster&,PHandle&
Declare Terminate&,Fensterk_killen&,Programm$,Active&
Declare AHRückgabe&,AHGETERROR_Buffer#,AHGETERROR_Buffer$
Declare Fehler&
Proc KillProcess
Parameters hprocess&
Dim exitcode#,4
LET Fehler&=@GetExitCodeProcess(hprocess&,exitcode#)
Let Fehler&=@TerminateProcess(hprocess&,@Long(exitcode#,0))
IF Fehler&<>1
LET AHRückgabe&=@GetLastError()
DIM AHGETERROR_Buffer#,32000
@FormatMessage($1000,0,AHRückgabe&,0,AHGETERROR_Buffer#,32000,0) Wandelt Fehlercode in Landesspezifische Message um.
Let AHGETERROR_Buffer$=AHGETERROR_Buffer$+@STRING$(AHGETERROR_Buffer#,0)
Dispose AHGETERROR_Buffer#
@messagebox(AHGETERROR_Buffer$,"Fehlermeldung",16)
endif
Dispose exitcode#
EndProc
Windowstyle 31
WindowTitle "Process starten und killen"
Window 0,0-640,440
Let Fensterk_killen&=@CreateButton(%HWND,"Fenster killen",20,300,150,30)
Let Terminate&=@CreateButton(%HWND,"Prozess killen",300,300,150,30)
While 0=0
Waitinput
IF @Getfocus(Terminate&)
Clearlist
AddWindows ""
LET Programm$=@Listbox$("Fenster wählen",3)
IF Programm$<>""
Let Fenster&=@Findwindow(Programm$)
@GetWindowThreadProcessId(Fenster&,@ADDR(PROCESS_ID&))
LET PHandle&=@OpenProcess($401,0,PROCESS_ID&)
IF Fehler&=0
LET AHRückgabe&=@GetLastError()
DIM AHGETERROR_Buffer#,32000
@FormatMessage($1000,0,AHRückgabe&,0,AHGETERROR_Buffer#,32000,0) Wandelt Fehlercode in Landesspezifische Message um.
Let AHGETERROR_Buffer$=@STRING$(AHGETERROR_Buffer#,0)
Dispose AHGETERROR_Buffer#
endif
KillProcess PHandle&
@CloseHandle(PHandle&)
Endif
ElseIF @Getfocus(Fensterk_killen&)
Clearlist
AddWindows ""
LET Programm$=@Listbox$("Fenster wählen",3)
IF Programm$<>""
@Sendmessage(@Findwindow(Programm$),$10,0,0)
Endif
Endif
Wend
Bitte auch mal versuchen, das Prog mit AT als Service zu starten und es dann über den Taskmanager auszuschalten.
[quote:bc1c8f568c=iF] Salve, iF.[hr:bc1c8f568c]PS: Ists richtig das ich alle Deine Programme mit Profan²4 teste? [/quote:bc1c8f568c] Na ja, 7.5 wurde reichen . 4.5 habe ich hier auch noch laufen - wenn du dazu Quelltext benötigst, schreibe ich dir gerne was . |
|
|
| |
|
|