PDA

Ver la Versión Completa : Capturar eventos en un directorio (antes para poder evitarlos )


Wonni
17-07-2006, 13:51:06
He buscado en el club y con google y he encontrado información sobre este tema, pero no me soluciona lo que yo quiero hacer. Lo mas que he encontrado es aqui en el club, como impedir que borren un directorio y su contenido, asi como evitar que modifiquen o renombren. Pero esto solo mientras la aplicacion corre. Con esto pensé, pues creo un servicio que interactue con mi aplicacion principal para proteger dicho directorio. Lo cree pero con un TTimer, y yo pensaba si seria mejor capturar los mensajes de Windows. Pero no se como hacerlo.
He visto ejemplos de como detectar cambios en un directorio, pero esto no me sirve, pues los detecta despues de haber ocurrido. Osea que despues de borrar un archivo, mi aplicacion se entera de ello.

Me baje una demo de un programa que sirve para proteger directorios y la carpeta que protege resulta que no aparece en la parte izquierda del explorador de windows. Si aparece en la derecha con el icono d una carpeta con un signo de prohibicion. ¿es que acaso ya no sera un directorio? he pensado que tal vez es una especie d archivo encryptado.
Bueno, pero yo lo que quiero hacer es desde mi aplicacion, proteger el directorio de la misma, pero no solo cuando mi aplicacion este ejecutandose, sin no siempre. Esto, pues creando un servicio que no deje eliminarse. Ya se que poder se podria. Pero solo pretendo llegar a un cierto nivel de protección para accidentes de usuarios torpecillos, nada mas.

¿como trabajan estas aplicaciones que protegen el directorio que le digas?

¿alguna info? ¿alguna idea? ¿alguna alternativa? ::rolleyes:

Saludos !!

Lepe
17-07-2006, 16:20:10
Una opción simple y efectiva, es copiar todos los archivos de tu aplicación a otra carpeta (por ejemplo dentro de Windows), manteniendo así una copia de seguridad.

En caso de no encontrar un archivo determinado, copias los archivos desde la copia. Puedes incluso crearte un programita que verifique la existencia de los archivos al iniciarse windows (menú inicio, registro de windows). Si el usuario hace algo raro, un simple reinicio lo soluciona.

Saludos

Wonni
17-07-2006, 17:48:48
Gracias Lepe, me parece muy bien la alternativa que me propones. Entonces seria algo asi como que al cerrar el programa hiciera la copia ( no solo de la base de datos, que ahora mismo ya lo hago ). Todo el directorio empakado en un archivo zip por ahi escondidito en \Windows, por ejemplo.
Entonces, con este sistema, lo ideal seria que al iniciar la aplicacion descomprimiera todo en el directorio de mi aplicacion. Digo esto, porque a parte de comprobar si falta algun archivo, tambien queria evitar cambios. Tengo un par de tablas .dbf a las que accedo sin BDE ( Utilizo el TDbf ) ya que son para los datos de configuracion y otros parametros.
Pues, puede ocurrir que se realice algun cambio en dichas tablas ( o cualquier otro archivo ) y eso no podria evitarlo simplemente comprobando si falta algun archivo. No se si me explico. Osea que para lo de que eliminen algun archivo, me sirve perfectamente tu idea, pero no para modificaciones.

No se yo si me obsesiono demasiado. La verdad es que en los ordenadores donde tengo mis programas, no hay peligro de manipulaciones malintencionadas ( o al menos eso creo yo ). Pero ya puestos a implementar un sistema de seguridad, pues queria hacerlo completito.


Saludos !!

seoane
17-07-2006, 18:30:25
Vamos por partes, si entiendo bien la situación tienes una serie de archivos que quieres evitar que sean modificados por accidente. Una primera solución seria marcarlos como "solo lectura", esto nos da cierta protección contra borrados accidentales pero un usuario podría saltarse todas las advertencias y borrarlo por "accidente". Otra solución seria utilizar otro programa, un servicio como sugerías al principio, que abriera el archivo y solo permitiera el acceso de otros programas para leer, esta solución si que protegería de forma efectiva contra accidentes, se tendría que detener el servicio para poder modificar los archivos y eso ya no seria tan accidental, supondría que el presunto borrador sabia lo que hacia.

Por ultimo, si te gusto la idea de guardar tus archivos en lugar seguro y restaurar la información en caso de accidente, puedes hacerlo de manera sencilla. Te sugiero utilizar un archivo de texto donde guardar el md5 de cada archivo, al iniciar la aplicación solo tienes que calcular el md5 de los archivos y comprobar que no ha cambiado, si lo ha hecho puedes restaurar la copia guardada en algún lugar seguro.

Bueno, son 3 alternativas, si alguna te gusta podemos entrar a discutir mas a fondo cualquiera de ellas.

dec
17-07-2006, 18:37:46
Hola,

Puestos a probar cosas, tal vez te interese echar un vistazo al componente "ShellNotify" (http://delphi.com.ar/vcl/index.html) del compañero Federico (delphi.com.ar (http://delphi.com.ar/)). Si no recuerdo mal dicho componente puede avisarte cuando un determinado archivo se borra de un directorio, o se renombra, entre otras circunstancias.

Me parece que, al no haber leído este Hilo completamente, mi respuesta no va a servirte de mucho en este caso, pero, de todos modos he querido hacer saber de este componente en este Hilo, porque se acerca mucho a una posible solución, si nos ceñimos al título del mismo. ¿No? :)

Wonni
17-07-2006, 19:19:00
...Otra solución seria utilizar otro programa, un servicio como sugerías al principio, que abriera el archivo y solo permitiera el acceso de otros programas para leer, esta solución si que protegería de forma efectiva contra accidentes, se tendría que detener el servicio para poder modificar los archivos y eso ya no seria tan accidental, supondría que el presunto borrador sabia lo que hacia.
.

Esta fue mi primera idea. De hecho cree un servicio con este codigo en el OnCreate:


var hFile: THandle = INVALID_HANDLE_VALUE; // Variable global// Para bloquearlo hFile:= CreateFile(PChar('Archivo.doc'),GENERIC_READ,FILE_SHARE_READ,nil,OPEN_EXISTING,0,0);// Para desbloquearloif hFile<>INVALID_HANDLE_VALUE then CloseHandle(hFile);

Por cierto, esto lo puso seoane en este hilo:

http://www.clubdelphi.com/foros/showthread.php?t=30249&highlight=borren+archivo

Entonces, al iniciar mi aplicacion principal, esta deberia comunicarse con el servicio para que este permita trabajar a la aplicacion. Por que si no, pues ni siquiera puedo abrir las tablas. Pero no tengo ni idea de como comunicarme con el servicio. Y hay mas cosas:
¿como impido que eliminen el servicio? A esta pregunta me sugirio mi sobrino "ixMike" que al cerrarse el servicio llamara a otro que lo volviera a crear. Pero es que si finalizo el proceso, ¿como lo capturo?, porque en el evento OnClose si se intercepta si finalizas la aplicacion desde la lista de tareas (ojo, la aplicacion) pero no el proceso. Si finalizo el proceso, na de na :(

En cuanto a la opcion del md5, pues no tengo ni idea de que es. Te agradeceria que me lo explicases. Y ese caso ¿donde convendria que colocase el archivo .txt?

La verdad, esque mi la opcion q mas me atrae es la del "guardian", llamemoslo "dbguardian" y el el "dbguardianres" (para guardar al guardian).
Esto tal vez sea algo muy lioso, o no. ¿que os parece?

En cuanto a los recursos que pueda consumir esto, por ejemplo, no creo que sea algo grave, ¿no?

Gracias por vuestra ayuda

Saludos !!

seoane
17-07-2006, 19:48:58
Por lo que cuentas, ya no estamos hablando de proteger archivos contra accidentes, sino protegerlos contra personas malintencionadas dispuestas a parar servicios, borrar archivos, y quien sabe que mas. Llegados a este punto, me pregunto por que esa persona tiene acceso como administrador a ese equipo, si es realmente el administrador y pone tanto empeño en destrozar el programa el sabrá lo que hace, y si no lo es, por que esta como administrador y no como un usuario limitado. Un usuario limitado no puede parar, y menos eliminar, servicios.

Por norma general, no se puede proteger nada de un administrador. Un administrador tiene los privilegios suficientes para destrozar cualquier cosa si se toma su tiempo para hacerlo ;)