Ducky escribió el 08/11/2004 21:27 :
> *FUNCTION APAGA( tlShutdownRequested, tlInteractiveShutdown )
> * 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.
> * 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_logoff 0
> #DEFINE ewx_shutdown 1 && Apagar Windows
> #DEFINE ewx_reboot 2 && Reiniciar Windows
> #DEFINE ewx_force 4 && Forzar el cierre de
> las aplicaciones
> #DEFINE ewx_poweroff 8
> #DEFINE ewx_forceifhung 16
> #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 a la funcion
> * 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
>
> nflag = ewx_shutdown
>
> =exitwindowsex(nflag, 0) && Fuerza el Cierre o Reinicio de Windows
> * Declaracion de llamadas a la API (las se se usaran posteriormente)
>
> QUIT && Sale de VFP
> ENDFUNC
>
> "Juany" escribió en el mensaje
> news:
>> Hola a todos!
>> Tengo una función para apagar un equipo, pero ésta
>> función en algunos
>> equipos la apaga por completo y en otros equipos manda el mensaje "Puede
>> apagar su equipo con seguridad", mi pregunta es: Se debe al bios de la
>> maquina?, o le hace falta algo a mi función?
>> Si alguien me puede ayudar mucho se los agradeceré.
>>
>>
>> PortalFox :: Nada corre como un zorro
>>
http://www.portalfox.com
>>
>> PortalFox - NNTP Forum Gateway
>>
>
Donde debo copiar este codigo..?? xq si lo copio en el evento click de algun
boton me da un error...