2012-06-12 5 views
0

Я хочу предотвратить shutdown в Windows 7, я успешно приобрел se_shutdown_privilege, но AbortSystemShutdown всегда терпит неудачу, я попробовал AbortSystemShutdown (NULL), AbortSystemShutdown («127.0.0.1»), AbortSystemShutdown (PcName).AbortSystemShutdown на Windows 7 не работает

Пока что никакого успеха.

+0

Вы проверяете, что возвращает GetLastError(), когда AbortSystemShutdown() возвращает 0? –

+0

Я получаю 0x0000045C Я думаю, что это «Невозможно прервать выключение системы, потому что не было выключения». Черт, я был уверен, что у меня это работает до победы 7 .... – VisaToHell

+0

Может быть, я могу заставить его работать с некоторыми настройка ключей реестра? – VisaToHell

ответ

1

Видимо, AbortSystemShutDown прерывает завершение работы вызываемого InitiateSystemShutdown (и версию этой функции Ex), а не, скажем, ExitWindows.

Функции InitiateSystemShutdown и InitiateSystemShutdownEx дисплей диалоговое окно, которое уведомляет пользователя о том, что система является закрытие. Во время тайм-аута выключения функция AbortSystemShutdown может предотвратить остановку системы .

+0

Ну его работающий штраф на XP и ниже .... – VisaToHell

+0

@VisaToHell: вы уверены? Это не должно. В каких обстоятельствах вы вызываете AbortSystemShutdown, т. Е. Почему система отключается? –

+0

@VisaToHell Документация MSDN гласит, что AbortSystemShutdown прерывает инициирование InitiateSystemShutdown. В частности, он прерывается в течение интервала времени ожидания, установленного функцией initiate. Если вы обнаружите в понедельник, что он работает в других недокументированных обстоятельствах, это не значит, что он сделает то же самое во вторник. Документация API - это контракт. – dave

0

Это отлично работает для меня в Windows 7 x64. Поскольку вы не отправляли никаких кодов, я понятия не имею, что вы делаете по-другому. Функция SetPrivilege была скопирована с этой страницы MSDN: http://msdn.microsoft.com/en-us/library/windows/desktop/aa446619%28v=vs.85%29.aspx

Я запускаю shutdown, набрав это в командной строке: «shutdown/s/t 500000» и запуск программы отменяет ее.

#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; 
}