Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:
реклама
праздничное освещение , Где накачать губы в красноярске.

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Показываем диалоговое окошко завершения работы системы

Источник: www.исходники.ru

Только Windows NT/2000/XP: Следующий завершает работу системы при помощи функции InitiateSystemShutdown на компьютере, на котором залогинен пользователь. Сначало необходимо получить привилегию SE_SHUTDOWN_NAME. Более подробно см. Привилегии.

BOOL MySystemShutdown( LPTSTR lpMsg )
{
   HANDLE hToken;              // дескриптор маркера процесса
   TOKEN_PRIVILEGES tkp;       // указатель на структуру маркера

   BOOL fResult;               // флаг завершения работы системы

   // Чтобы получить привилегию завершения работы системы, получаем
   // дескриптор маркера текущего процесса.

   if (!OpenProcessToken(GetCurrentProcess(),
        TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
      return FALSE;

   // Получаем LUID для привилегии завершения работы.

   LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
        &tkp.Privileges[0].Luid);

   tkp.PrivilegeCount = 1;  // будет установлена одна привилегия
   tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

   // Получаем привилегию завершения работы для этого процесса.

   AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
      (PTOKEN_PRIVILEGES) NULL, 0);

   // Если не удалось получить привилегию:

   if (GetLastError() != ERROR_SUCCESS)
      return FALSE;

   // Отображаем диалоговое окошко завершения работы и начинаем
   // отсчёт.

   fResult = InitiateSystemShutdown(
      NULL,    // локальный компьютер
      lpMsg,   // сообщение для пользователя
      20,      // таймаут
      FALSE,   // просить пользователя закрыть приложения ?
      TRUE);   // Перезагрузить после завершения работы ?

   if (!fResult)
      return FALSE;

   // Запрещаем привилегию завершения работы для нашего процесса.

   tkp.Privileges[0].Attributes = 0;
   AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
        (PTOKEN_PRIVILEGES) NULL, 0);

   return TRUE;
}

Если выполнить функцию AbortSystemShutdown в период таймаута, указанного в InitiateSystemShutdown, то завершения работы системы не произойдёт.

BOOL PreventSystemShutdown()
{
   HANDLE hToken;              // дескриптор маркера процесса
   TOKEN_PRIVILEGES tkp;       // указатель на структуру маркера

   // Чтобы получить привилегию завершения работы системы, получаем
   // дескриптор маркера текущего процесса.

   if (!OpenProcessToken(GetCurrentProcess(),
         TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
      return FALSE;

   // Получаем LUID для привилегии завершения работы.

   LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
         &tkp.Privileges[0].Luid);

   tkp.PrivilegeCount = 1;  // one privilege to set
   tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

   // Получаем привилегию завершения работы для этого процесса.

   AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
        (PTOKEN_PRIVILEGES)NULL, 0);

   if (GetLastError() != ERROR_SUCCESS)
      return FALSE;

   // Предотвращаем завершение работы системы.

   if ( !AbortSystemShutdown(NULL) )
      return FALSE;

   // Запрещаем привилегию завершения работы для нашего процесса.

   tkp.Privileges[0].Attributes = 0;
   AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
       (PTOKEN_PRIVILEGES) NULL, 0);

   return TRUE;
}

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
Аноним
Мне нравитсяМне не нравится
26 октября 2005, 14:34:34
"Следующий" - кто?
2.
Аноним
Мне нравитсяМне не нравится
24 октября 2005, 18:55:35
Весьма полезная статейка. По крайней мере я давно искал данную инфу
Весьма помогло)))))
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог