com apagar windows xp

softcomercial
17 de Septiembre del 2004
COMPA脩EROS MUY BUENOS DIAS , NECESITO AYUDA PARA APAGAR WINDOWS XP, YO SE QUE CON WINDOWS 9X DIGO
DECLARE EXITWIDOWSEX IN "USER32.DLL" INTEGER UFLAGS, INTEGER.

PERO NO SE COMO HACERLO EN XP SERA QUE ALGUIEN ME PUEDE AYUDAR.

MIL GRACIAS.

Ken Torrealba
17 de Septiembre del 2004
Yo vengo utilizando esta funci贸n. Existe otra m谩s simple pero no funciona correctamente en Windows XP.



*!* -
*!* Por defecto - Cierra todas las aplicaciones y reinicia Windows sin preguntar.
*!* Obtenida de UniversalThread
*!* Par谩metros:
*!*
*!* tlShutdownRequested - .T. Cierra Windows, .F. (default) Reinicia Windows
*!* tlInteractiveShutdown - .T. Muestra el cuadro de di谩logo para preguntar si cerramos Windows, .F. (default) No pregunta nada y cierra Windows
*!*
*!* Esta funci贸n permite cerrar o reiniciar Windows desde VFP; hace las llamadas necesarias
*!* a funciones API de Windows para ajustar los privilegios necesarios en las plataformas Windows NT 4.0 o Windows 2000
*!* si se puede. La funci贸n devuelve .F. si no puede hacer los ajustes necesarios para garantizar que el privilegio
*!* llamado SE_SHUTDOWN_NAME sea establecido. En Windows 9x no es necesario establecer este privilegio.
*!* Probado en las plataformas WinNT 4.0 SP6, Win2K Pro, Win98 y WinME.
*!* Probado en VFP 5.0, VFP 6.0 y VFP 7.0 SP1.
*!* -
FUNCTION APAGA( tlShutdownRequested, tlInteractiveShutdown )

* Definici贸n de constantes

#DEFINE SE_SHUTDOWN_NAME "SeShutdownPrivilege" && Nombre del privilegio de Windows NT y 2000
#DEFINE SE_PRIVILEGE_ENABLED 2 && Flag para activar privilegios
#DEFINE TOKEN_QUERY 2 && Token para consultar el estado
#DEFINE TOKEN_ADJUST_PRIVILEGE 0x20 && Token para ajustar privilegios
#DEFINE EWX_SHUTDOWN 1 && Apagar Windows
#DEFINE EWX_REBOOT 2 && Reiniciar Windows
#DEFINE EWX_FORCE 4 && Forzar el cierre de las aplicaciones
#DEFINE SIZEOFTOKENPRIVILEGE 16

* API de Windows para ejecutar ShutDown - Todas las versiones
DECLARE ExitWindowsEx IN WIN32API INTEGER uFlags, INTEGER dwReserved && API call to shut down Windows

* Comprobamos la versi贸n de Windows para saber si hay que establecer privilegios
IF ('4.0' $ OS() OR '5.0' $ OS() OR 'NT' $ OS())
* APIs necesarias para manipular los permisos de los procesos

* Devuelve el LUID privilegio espec铆fico - changes each time Windows restarts
DECLARE SHORT LookupPrivilegeValue IN ADVAPI32 ;
INTEGER lpSystemName, ;
STRING @ lpPrivilegeName, ;
STRING @ pluid

* Obtiene el hToken con los permisos de un proceso
DECLARE SHORT OpenProcessToken IN Win32API ;
INTEGER hProcess, ;
INTEGER dwDesiredAccess, ;
INTEGER @ TokenHandle

* Ajusta otros privilegios de un proceso v铆a un hToken espec铆fico
DECLARE INTEGER AdjustTokenPrivileges IN ADVAPI32 ;
INTEGER hToken, ;
INTEGER bDisableAllPrivileges, ;
STRING @ NewState, ;
INTEGER dwBufferLen, ;
INTEGER PreviousState, ;
INTEGER @ pReturnLength

* Obtiene el Handle de un proceso
DECLARE INTEGER GetCurrentProcess IN WIN32API

LOCAL cLUID, nhToken, cTokenPrivs, nFlag

cLUID = REPL(CHR(0),8) && Identificador Unico Local de 64 bits de un privilegio

IF LookupPrivilegeValue(0, SE_SHUTDOWN_NAME, @cLUID) = 0
RETURN .F. && Privilegio No definido en el proceso
ENDIF

nhToken = 0 && Token de un proceso usado para manipular los privilegios del mismo

IF OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY + TOKEN_ADJUST_PRIVILEGE , @nhToken) = 0
RETURN .F. && El sistema operativo no puede garantizar los privilegios necesarios
ENDIF

* Se crea la estructura TOKEN_PRIVILEGES , los 4 primeros bytes DWORD indican permisos,
* seguidos de un array(arreglo) de 8 bytes con los LUIDs y los 煤ltimos 4 bytes son los atributos
* de los permisos.
cTokenPrivs = CHR(1) + REPL(CHR(0),3) + cLUID + CHR(SE_PRIVILEGE_ENABLED) + REPL(CHR(0), 3)
IF AdjustTokenPrivileges(nhToken, 0, @cTokenPrivs, SIZEOFTOKENPRIVILEGE, 0, 0) = 0
RETURN .F. && Privilegio denegado o no permitido
ENDIF
ENDIF

CLOSE ALL && Cierra todas las tablas de VFP
FLUSH && Fuerza la escritura en disco de los Buffers
CLEAR EVENTS && Cancela eventos pendientes
ON SHUTDOWN && Reestablece el proceso SHUTDOWN
* Se comprueban los par谩metros pasados
DO CASE
CASE tlShutdownRequested AND tlInteractiveShutdown
nFlag = EWX_SHUTDOWN
CASE tlShutdownRequested
nFlag = EWX_SHUTDOWN + EWX_FORCE
CASE tlInteractiveShutdown
nFlag = EWX_REBOOT
OTHERWISE
nFlag = EWX_REBOOT + EWX_FORCE
ENDCASE
=ExitWindowsEx(nFlag, 0) && Fuerza el Cierre o Reinicio de Windows
QUIT && Sale de VFP
ENDFUNC



Ken Torrealba
El Callao - Venezuela

Mario
17 de Septiembre del 2004
Puedes utilizar
una utilidad llamada PsShutdown es super facil y la puedes ejecutar desde foxpro por medio de un run, funciona con xp

la encuentras en:

http://www.sysinternals.com/ntw2k/freeware/psshutdown.shtml


Saludos
Mario
www.winledger.com