Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Cerrar programas que no están el la lista (https://www.clubdelphi.com/foros/showthread.php?t=8609)

DarkByte 26-03-2004 21:31:44

Cerrar programas que no están el la lista
 
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:

Código:

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.
Código:

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 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

Cita:

Empezado por DarkByte
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


La franja horaria es GMT +2. Ahora son las 14:03:22.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi