PDA

Ver la Versión Completa : Cerrar programas que no están el la lista


DarkByte
26-03-2004, 21:31:44
Hola compañeros foreros...

Os traigo una preguntita... estoy intentando hacer un programa que filtre una serie de ejecutables, de modo que no se pueda ejecutar, por ejemplo, el buscaminas o el messenger. Al principio usaba el truco de trucomanía:


procedure TForm1.Button1Click(Sender: TObject);

function KillTask(FileName:String):integer;
var
ContinueLoop:BOOL;
FSnapshotHandle:THandle;
FProcessEntry32:TProcessEntry32;
const
PROCESS_TERMINATE=$0001;
begin
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);
ContinueLoop:=Process32First(FSnapshotHandle,FProcessEntry32);
while integer(ContinueLoop)<>0 do
begin
if
((UpperCase(ExtractFileName(FProcessEntry32.szExeFile))=UpperCase(FileName))
or (UpperCase(FProcessEntry32.szExeFile)=UpperCase(FileName)))
then

Result:=Integer(TerminateProcess(OpenProcess(PROCESS_TERMINATE,BOOL(0),

FProcessEntry32.th32ProcessID),0));
ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
end;

begin
KillTask('calc.exe');
KillTask('msmsgs.exe');
KillTask('winamp.exe');
end;

Pero con el tiempo la lista se hizo muy grande... y estaba bastante desordenada...

A mí me gustaría poder hacer una lista de ejecutables y que un procedure me compobase si existen, y en tal caso, cerrarlo. ¿Alguien me podría hacer la modificación?. Yo no sé hacerla :( , no quiero que me haga el proyecto, sino solo modificar los procedures

Doy dos pistas: la siguiente y la que yo uso para cerrar el ejecutable.

function EstaEjecutandose (ExeFile:string): boolean;
var H:word;
begin
H := CreateFile(PChar(ExeFile), GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
Result := (H >= 65535);
CloseHandle(H);
end;

roman
26-03-2004, 21:41:33
Partes de la base de que los programas indeseables ya están abiertos y tienes que cerrarlos. ¿No sería mejor evitar que se abran desde un principio? Quizá las ideas de delphi.com.ar en este hilo (http://www.clubdelphi.com/foros/showthread.php?t=7585) te sirvan. Controlarías cualquier intento de ejecutar una aplicación, buscarías en una lista de aplicaciones no deseadas y si está impides que se ejecute.

// Saludos

DarkByte
26-03-2004, 22:13:41
ya... pero y si un listo pone la aplicación en el registro de windows y se carga antes que mi ejecutable... gracias de todos modos por la sugerencia román :)

roman
26-03-2004, 22:30:22
ya... pero y si un listo pone la aplicación en el registro de windows y se carga antes que mi ejecutable.

Pues el mismo listo borrará tu aplicación, formateará el disco duro, quemará la pc y te asustará por las noches...

... o simplemente cambiará el nombre de la aplicación.

Ni uno ni otro método son seguros. Si tanta restrición quieres pues créate un reemplazo del shell que sólo permita ejecutar las aplicaciones previamente aprobadas.

O búscale por el lado de las políticas de grupo. Hay una política para permitir ejecutar sólo las aplicaciones que se encuentren en una lista. Me parece que en términos del registro de Windows es

HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer

RestrictRun = 1 (DWord)

y la lista de aplicaciones se guarda en la clave

HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\RestrictRun.

Sólo recuerda no poner RegEdit entre las aplicaciones permitidas o bien usar otra política que impide el uso del registro.

// Saludos

roman
26-03-2004, 22:35:00
Lo olvidaba. También existe la política contraria, que te permite fijar una lista de aplicaciones prohibidas. Funciona igual que RestrictRun pero se llama DisallowRun.

// Saludos

DarkByte
26-03-2004, 22:41:43
roman... jeje, se trata de que controle yo las aplicaciones en "directo", no windows... no es una aplicación para el público... sino para mí, me he puesto el reto de hacer ese proyecto en un max. de dos semanas

roman
26-03-2004, 22:54:39
Pues entonces no hay gran cosa que hacer. Ya tienes una función para saber si la aplicación se ejecuta y un procedimiento para matarla. Simplemente guarda la lista de aplicaciones en algún lugar (un diskette para que tu alter ego no la borre), cárgala en un TStringList y recorre la lista pasándole cada ítem a tu KillTask previa verificación con EstaEjecutandose.

Este es el último mensaje que doy en este hilo. Para la próxima espero que aclares desde el principio. Siempre que me es posible y está a mi alcance doy con mucho gusto mi ayuda para tratar de encontrar la mejor solución a un problema dado pero tampoco estoy para perder el tiempo.

:mad:

DarkByte
26-03-2004, 23:14:29
roman, siento si le he ofendido. Lo que pasa es que estoy tratando la manera de sacar un procedure que me recorra un TMemo o algo así con los nombres de los ejecutables y si están abierto, los cierre. No cosas del registro ni similares. :( siento de veras si le he ofendido