Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Por que no graba en Win.ini (https://www.clubdelphi.com/foros/showthread.php?t=55610)

alquimista 22-04-2008 01:49:29

Por que no graba en Win.ini
 
Intento ejecutar al inicio de windows un programa y deseo implementar todos los métodos de arranque: registro, win.ini (run=), etc..

Al intentar grabar en Win.ini no graba nada. Si cambio el nombre a miwin.ini si que funciona.
¿Está protegido el Win.ini? tengo Windows Xp Sp2...
o estoy haciendo algo mal.

Código Delphi [-]
pathlog:=GetEnvironmentVariable('SYSTEMROOT');
   pathlog:=Pathlog+'\win.ini';
   Ini := TIniFile.Create(pathlog);
   try      
       Ini.writestring('Windows', 'run', Application.ExeName);
   finally
     Ini.Free;   
   end;

dec 22-04-2008 04:23:28

Hola,

¿No obtienes ningún error que puedas referir aquí? En todo caso, ¿para qué necesitas indicar un "autoinicio" en todos y cada uno de los lugares posibles? ¿No bastaría con uno, en el Registro de Windows, por ejemplo?

alquimista 22-04-2008 10:57:28

No obtengo ningún error ni de excepción ni nada.

Es para realizar un programa anti aplicaciones y juegos para alumnos.
El método de registro lo anulan entrando con msconfig y quitando todos los programas de inicio.
Como algunos son mayores se les deja como administrador de equipo (para que instalen programas como C o similar) y eso es lo peor. A pesar de ser mayores juegan o hacen otras cosas.
El método de win.ini al no ser tan nuevo, es probable que no lo conozcan y así dure mas en marcha y con poco mantenimiento.
De todos modos añadiendo el msconfig a la lista de programas no aceptados creo que podre hacerlo funcionar mas tiempo.
Lo ideal sería crear un servicio para que siempre estuviera activo el programa aunque lo cierren, pero no se como hacerlo.

El programa esta hecho pero le faltan muchos flecos de seguridad todavía.

Neftali [Germán.Estévez] 22-04-2008 10:58:12

Es posible que Windows esté protegiendo ese acceso dependiendo de los permisos que tengas.
Si haces la prueba de modificarlo "a mano" (desde el notepad, por ejemplo) ¿Tienes algun problema?

Otra cosa, es lo que comenta Dec, y en lo que coincido. ¿Para qué necesitas añadir el programa en varios sitio de "autoarranque"? Con eso sólo conseguirás que se ejecute varias veces...

alquimista 22-04-2008 11:03:40

Lo puedo editar a mano desde notepad.
El programa solo admite una ejecución.

No obtengo ningún error ni de excepción ni nada.

Es para realizar un programa anti aplicaciones y juegos para alumnos.
El método de registro lo anulan entrando con msconfig y quitando todos los programas de inicio.
Como algunos son mayores se les deja como administrador de equipo (para que instalen programas como C o similar) y eso es lo peor. A pesar de ser mayores juegan o hacen otras cosas.
El método de win.ini al no ser tan nuevo, es probable que no lo conozcan y así dure mas en marcha y con poco mantenimiento.
De todos modos añadiendo el msconfig a la lista de programas no aceptados creo que podre hacerlo funcionar mas tiempo.
Lo ideal sería crear un servicio para que siempre estuviera activo el programa aunque lo cierren, pero no se como hacerlo.

El programa esta hecho pero le faltan muchos flecos de seguridad todavía.

alquimista 22-04-2008 11:20:23

Acabo de ver con un programa anti espía que cada vez que ejecuto el programa, los cambios los quiere hacer en el registro de Windows en vez de en el archivo win.ini.
¿¿¿Es posible que la versión de delphi (2006) o el windows, pase del win.ini usando la unidad inifiles???
el caso es que con otro ini va bien.

roman 22-04-2008 16:45:14

Hasta donde yo sé, el win.ini queda sólo por compatibilidad con programas antiguos que requieran leer datos de ahí. Por lo mismo, no es de extrañar, que al escribir en él, el S.O mapee la escritura al registro. De hecho, según observé ayer, lo mapea a la clave

HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows: run

// Saludos

Black_Ocean 22-04-2008 17:25:56

Los accesos de escritura en Win.INI son monitoreados/bloqueados por la mayoría de los antivirus/antispyware actuales que estén en tiempo real (en ejecución todo el tiempo) en el PC. porque esas entradas ya no son usadas por programas modernos, por lo que, por seguridad, al detectar una escritura externa en dicho archivo, es bloqueado o simplemente se restaura inmediatamente el original o una copia del mismo, por lo que en este caso, no se generaría una excepción de escritura por la aplicación y en depuración, Delphi no mostraría tal excepción porque no existiría.

Muchos programas maliciosos tales como virus y malware en general, se valen por estas entradas de Win.INI, por lo que si tu quieres que una aplicación se inicie cada vez cuando un usuario se loguée en el sistema o comience una nueva sesión, lo correcto es agregar un valor/clave en el registro de Windows: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run y no en otras áreas de inicio, porque podría ser tomado como algo no deseado, excepto que sea en verdad un servicio, módulo, etc.

Para servicios, módulos, etc de incio, se hace de otra forma, ya que debes registralos en el sistema como tales.

Saludos y espero que te haya ayudado.

roman 22-04-2008 17:31:57

No sé si los antivirus hagan algo así. En todo caso, acabo de deshabilitar el mío y vuelto a hacer la prueba y ha sucedido como dije antes: el archivo win.ini queda sin modificar y el cambio se hace en la entrada del registro mencionada. Por ello reafimo mi opinión de que es el sistema operativo el que hace el mapeo.

// Saludos

BlueSteel 22-04-2008 18:34:44

Utiliza las directivas de grupo...
 
Hola alquimista

Si trabajas en una Red, y tienes un Servidor de Windows 2000 o 2003 Server, no te seria más conveniente utilizar las politicas de grupo ???

Windows XP posee un editor de politicas de usuario (locales), a las cuales puedes acceder como gpedit.msc... Si estas trabajando bajo dominio de 2000 o 2003 server, prevalen las politicas del servidor...

Si trabajas con usuarios puedes crear grupos de trabajo y asignarles politicas grupales para que te deje modificar el windows.. instalar programas... utilizar algun programa.. incluso puedes trabajar con el direccionamiento de perfiles.. en dondes si un usuario esta en una estacion con sus datos... al iniciar la sesión en otra estación se cargaria el mismo perfila con sus datos...(windows 2003 server permite esto.. en el 2000 server es un poco más complicado...)...

incluso puedes usar un protector de pantalla llamado winexit.src... el cual despues de un cierto tiempo de cierra la sesion (forzando el cierre de cualquier aplicación...)... en parte es bueno.. (al menos a mi me funciona...)... ya que cada usuario posee una configuración a la impresora con control de copia... y si dejan de usar la estacion por cierto tiempo esta se cierra ...(perdiendo cualquier cambio que no se haya guardado...)... si bien eso es malo... me impide que otro usuario imprima con la sesion de otro ...

Salu2:p:D

cHackAll 22-04-2008 19:32:57

Cita:

Empezado por alquimista (Mensaje 281674)
...Es para realizar un programa anti aplicaciones y juegos para alumnos.
El método de registro lo anulan entrando con msconfig y quitando todos los programas de inicio.
Como algunos son mayores se les deja como administrador de equipo (para que instalen programas como C o similar) y eso es lo peor. A pesar de ser mayores juegan o hacen otras cosas.
El método de win.ini al no ser tan nuevo, es probable que no lo conozcan y así dure mas en marcha y con poco mantenimiento.
De todos modos añadiendo el msconfig a la lista de programas no aceptados creo que podre hacerlo funcionar mas tiempo.
Lo ideal sería crear un servicio para que siempre estuviera activo el programa aunque lo cierren, pero no se como hacerlo.

El programa esta hecho pero le faltan muchos flecos de seguridad todavía.

Con la tercera repetición juraría que nos estas intentando convencer.

En fin; el código que pondre no lo pensé para un INI, pero dado el contenido "por defecto" del archivo en cuestión funciona puesto que no existe la seccion "windows";

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
 hFile, Size: Integer;
 FileName: array [0..MAX_PATH-1] of Char;
 Buffer: array [0..1023] of Char;
begin
 GetWindowsDirectory(@FileName, MAX_PATH);
 hFile := _lopen(lstrcat(@FileName, '\win.ini'), 0);
 Size := _lread(hFile, @Buffer, SizeOf(Buffer));
 CloseHandle(hFile);
 hFile := _lcreat(@FileName, 0);
 _lwrite(hFile, @Buffer, Size);
 _lwrite(hFile, '[windows]'#13#10'run=', 15);
 _lwrite(hFile, @FileName, GetModuleFileName(0, @FileName, MAX_PATH));
 CloseHandle(hFile);
end;

La idea aplicable a cualquier otro codigo es; [open > read > close > erase > create > write > close].

EDITO; Ahora que leo detenidamente el mensaje doblemente repetido, entiendo mejor que lo que se esta intentando hacer es de una forma heterodoxa. La seccion que se requiere de dicho archivo de configuracion en NT es otra a la mostrada "arriba".

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
 hKey: Windows.HKEY;
 FileName: array [0..MAX_PATH-1] of Char;
begin
 RegOpenKey(HKEY_LOCAL_MACHINE, 'software\microsoft\windows nt\currentversion\winlogon', hKey);
 RegSetValueEx(hKey, 'run', 0, REG_SZ, @FileName, GetModuleFileName(0, @FileName, SizeOf(FileName)));
 RegCloseKey(hKey);
end;

Saludos

alquimista 23-04-2008 00:20:01

Las repeticiones no han sido de forma deliberada:):):):)
La verdad es que parece que Windows Xp protege a ciertos archivos del S.O.
Intenté eliminar msconfig del pc y lo volvía a restaurar.
Cita:

Si trabajas en una Red, y tienes un Servidor de Windows 2000 o 2003 Server, no te seria más conveniente utilizar las politicas de grupo ???
Lamentablemente es un sistema sin centralizar y cada pc es un coladero de software, juegos y virus incluso a los pocos dias de restaurar un pc con programas tipo ghost.

Gracias por las respuestas, ya me queda todo más claro. Ahora solo me queda lo de crear un servicio que intente dejar en ejecución el programa matacosas. Any sugerencia???
Saludos maestros de delphi....

cHackAll funciona ok tu primer procedure. Asombroso!!!! Parece que este sea el foro de C++.:):) (_lwrite, _lopen etc..) :D:D:D


La franja horaria es GMT +2. Ahora son las 10:40:13.

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