AbortSystemShutdown en Windows 7 no funciona

Quiero evitar el apagado en Windows 7. Adquirí se_shutdown_privilege con éxito, pero AbortSystemShutdown siempre falla. Intenté AbortSystemShutdown (NULL), AbortSystemShutdown ("127.0.0.1"), AbortSystemShutdown (PcName).

Hasta ahora ningún éxito.

preguntado el 12 de junio de 12 a las 19:06

¿Comprueba lo que devuelve GetLastError() cuando AbortSystemShutdown() devuelve 0? -

Obtengo 0x0000045C, creo que es "No se puede cancelar el apagado del sistema porque no se estaba apagando". Maldita sea, estaba bastante seguro de que esto funcionó antes en Win 7 ... -

¿Tal vez pueda hacerlo funcionar con algunos ajustes de claves de registro? -

2 Respuestas

Al parecer, AbortSystemShutDown aborta un apagado invocado por InitiateSystemShutdown (Y el Ex versión de esa función) en lugar de, digamos, ExitWindows.

Las funciones InitiateSystemShutdown e InitiateSystemShutdownEx muestran un cuadro de diálogo que notifica al usuario que el sistema se está cerrando. Durante el período de tiempo de espera de apagado, la función AbortSystemShutdown puede evitar que el sistema se apague.

Respondido el 12 de junio de 12 a las 21:06

@VisaToHell: ¿estás seguro? no debería ¿En qué circunstancias está llamando a AbortSystemShutdown, es decir, por qué se está apagando el sistema? - Harry Johnston

@VisaToHell La documentación de MSDN dice que AbortSystemShutdown cancela lo que inicia InitiateSystemShutdown. Específicamente, abortará durante el intervalo de tiempo de espera establecido por la función de inicio. Si descubre el lunes que funciona en otras circunstancias indocumentadas, eso no significa que hará lo mismo el martes. La documentación de la API es el contrato. - Dave

Esto funciona bien para mí en Windows 7 x64. Como no publicaste ningún código, no tengo idea de qué estás haciendo de manera diferente. El SetPrivilege La función se copió de esta página de MSDN: http://msdn.microsoft.com/en-us/library/windows/desktop/aa446619%28v=vs.85%29.aspx

Comienzo el apagado escribiendo esto en un símbolo del sistema: 'shutdown /s /t 500000' y ejecutar el programa lo cancela.

#include <Windows.h>
#include <stdio.h>

BOOL SetPrivilege(HANDLE hToken, LPCTSTR lpszPrivilege, BOOL bEnablePrivilege) 
{
    TOKEN_PRIVILEGES tp;
    LUID luid;

    if ( !LookupPrivilegeValue(NULL, lpszPrivilege, &luid ) )
    {
        printf("LookupPrivilegeValue error: %u\n", GetLastError() ); 
        return FALSE; 
    }

    tp.PrivilegeCount = 1;
    tp.Privileges[0].Luid = luid;
    tp.Privileges[0].Attributes = bEnablePrivilege ? SE_PRIVILEGE_ENABLED : 0;

    if ( !AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES) NULL, (PDWORD) NULL) )
    { 
        printf("AdjustTokenPrivileges error: %u\n", GetLastError() ); 
        return FALSE; 
    } 

    if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
    {
        printf("The token does not have the specified privilege. \n");
        return FALSE;
    } 
    return TRUE;
}

int main()
{
    HANDLE hToken;
    OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken);
    if(!SetPrivilege(hToken, SE_SHUTDOWN_NAME, TRUE))
    {
        printf("Could not adjust privileges\n");
    }
    if(!AbortSystemShutdown(NULL))
    {
        printf("AbortSystemShutdown failed (%08x)", GetLastError());
    }
    CloseHandle(hToken);
    return 0;
}

Respondido el 13 de junio de 12 a las 03:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.