|
Sobre lo que dices, x2006, yo opino que tienes toda la razón en general. Pero pueden haber casos particulares en los que se utiliza el windows server pero no precisamente como un servidor crítico. En alguno de esos casos particulares puede ser necesario lo que pide pochy.
Yo realmente no conozco ningún programa que haga eso. Yo hace tiempo atrás busqué lo mismo y no lo encontré (No lo buscaba parar windows server sino para xp). Entonces decidí hacerme uno.
Utilicé la función del kernel de windows.
Es necesario hacer lo siguiente: Dar a tu programa los privilegios de apagar la computadora. Eso se hace con las siguientes funciones: OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,htoken)
LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tp.Privileges[0].Luid) tp.PrivilegeCount:=1; tp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(htoken,f,tp,0,nil,nil);
Y luego, llamar a la función que apaga el windows
exitwindowsex(EWX_restart+EWX_FORCE, 0);
Si se quiere reiniciar, se debe utilizar EWX_restart, y para apagar, EWX_shutdown. Es necesario incluir EWX_FORCE ya que si no se lo hace, no apagará si algún programa no lo permite. Por ejemplo si quedó abierto el word con un documento sin archivar, entonces el word no permitirá el apagado poniendo un mensajito en pantalla preguntando si se quiere apagar. Obviamente no habrá nadie ese momento. Hay que manejar con cuidado ese detalle, o se pueden perder los archivos abiertos sin grabar.
Es necesario notar también que en windows server los usuarios no administradores no tienen derecho a apagar la computadora (en la configuración por defecto), por lo que si este programa funciona bajo un usuario no administrador, no apagará nada.
Saludos.
|