[C] Завершение сеанса Windows по таймеру

Программирование
Админ просил проявлять писательскую деятельность :).
О вещах глобальных из мира IT я вам не поведаю, а расскажу, как боролся с непослушным младшим братом.

Предыстория


Есть компьютер c Windows Server 2008 R2 (полученной по программе ). Все учетки на паролях. Пароли знаю только я. Поэтому когда представленный выше младший брат желает поиграть в контр-страйк, залогиниться он не может. Тогда он просит, уговаривает, умоляет и всячески достает меня. В конце концов я сдаюсь, залогиниваюсь в систему и включаю ему игру при условии, что, допустим, через час он выйдет.
Проходит час. Я намекаю, что пора бы уже закругляться - <Еще 10 минут!>. Через десять минут еще 10 минут и так далее.

История


В общем подзадолбал меня такой расклад :) и решил на скорую руку состряпать программульку, которая будет выкидывать пользователя из сеанса обратно на экран логина через указанный промежуток времени.
Написал на C, компилятор из комплекта MinGW.
Собственно, код. Все прозрачно, но комментарии присутствуют :).


/*
   wlt.c - automatical logout after specific time interval
*/


/* 
   Указываем минимальную версию виндов, чтобы стали доступны
   используемые тут константы из reasons.h
*/
#define _WIN32_WINNT 0x0501
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <reason.h>


int
_tmain (int argc, LPTSTR argv[])
{
  /*
     Таймаут (в секундах) до завершения сеанса
   */
  long timeout = 0;

  /*
     Проверяем количество аргументов. Нам надо точно 2
     (имя программы тоже учитывается и помещается в arg[0])
   */
  if (argc != 2)
    {
      _tprintf (_T
                ("usage: timer <number>\n  <number> - timeout (in seconds) before logout\n"));
      exit (1);
    }
  else
    {
      /*
         Берем таймаут из командной строки
       */
      timeout = _ttol (argv[1]);

      /*
        Проверяем на корректность
      */
      if (timeout <= 0)
      {
        _tprintf (_T ("Enter positive integer number, please.\n"));
        exit (1);
      }

      /*
         Проверяем на переполнение
       */
      if (errno == ERANGE)
        {
          _tprintf (_T ("Sorry, timeout is too big.\n"));
          exit (1);
        }
      else
        {
          /*
             Выжидаем таймаут
           */
          _tprintf (_T ("Logout after %lu seconds.\n"), timeout);
          Sleep ((DWORD) timeout * 1000);
          /*
             Завершаем сеанс
           */
          _tprintf (_T ("Bye!\n"));
          ExitWindowsEx (EWX_LOGOFF,
                         SHTDN_REASON_MAJOR_OTHER | SHTDN_REASON_MINOR_OTHER |
                         SHTDN_REASON_FLAG_PLANNED);
        }
    }

  return 0;
}


Компилируется просто

gcc wlt.c -o wlt.exe

Запускается не менее просто

wlt 3600

Спасибо за внимание. That's all, folks!

4 комментария

avatar
Дома стоит 2008? И как она в сравнении с 7кой например в плане мультимедиа компутера?
avatar
По мне так то же самое. Путем нехитрых манипуляций, рецепты которых нашел на сайтах http://www.win2008workstation.com/ и http://www.win2008r2workstation.com/, получилась вполне себе десктопная система.
avatar
а память не лопает больше обычного?
avatar
Если лишние службы не грузить, не лопает. Хотя она только x64, что подразумевает как больший объем памяти, так и большее потребление.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.