Исходники.Ру - Программирование
Исходники
Статьи
Книги и учебники
Скрипты
Новости RSS
Магазин программиста

Главная » Статьи по программированию » Visual C++ - Система »

Обсудить на форуме Обсудить на форуме

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

Только 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;
}

Может пригодится:


Автор:
Прочитано: 5177
Рейтинг:
Оценить: 1 2 3 4 5

Комментарии: (0)

Добавить комментарий
Ваше имя*:
Ваш email:
URL Вашего сайта:
Ваш комментарий*:
Код безопастности*:

Рассылка новостей
Рейтинги
© 2007, Программирование Исходники.Ру