Есть ли точная запись в журнале для проверки завершения работы и запуска системы? - PullRequest
0 голосов
/ 18 июня 2020

Мне нужно рассчитать количество времени, в течение которого компьютер работал в месяц.

Кажется, есть разные сообщения для проверки различных событий, которые выключают P C:

Завершение работы

  • Идентификатор события 41 Система перезагрузилась без предварительного завершения работы. Эта ошибка может быть вызвана тем, что система перестала отвечать, аварийно завершила работу или неожиданно потеряла питание.
  • Идентификатор события 1074 Регистрируется, когда приложение (например, Windows Обновление) вызывает перезапуск системы или когда пользователь инициирует перезапуск или выключение.
  • Идентификатор события 6006 Зарегистрировано как чистое завершение работы. Выдает сообщение «Служба журнала событий была остановлена». 6008 Зарегистрировано как грязное завершение работы. Выдает сообщение «Предыдущее выключение системы в указанное время было неожиданным».
  • Идентификатор события 1074 (альтернативный): «Процесс X инициировал перезагрузку / выключение компьютера от имени пользователя Y по следующей причине: Z.» Указывает, что приложение или пользователь инициировали перезапуск или завершение работы.
  • Событие с кодом 1076 (альтернативный): «Причина, указанная пользователем X для последнего неожиданного выключения этого компьютера: Y». Записывает, когда первый пользователь с правами завершения работы входит в систему на компьютере после неожиданного перезапуска или выключения, и указывает причину возникновения.

Запуск

  • идентификатор события 12: операционная система запущена в системное время
  • идентификатор события 6005 (альтернативный): «Служба журнала событий была запущена». Это синоним запуска системы.
  • Идентификатор события 6009 (альтернативный): указывает на Windows название продукта, версию, номер сборки, номер пакета обновления и тип операционной системы, обнаруженные во время загрузки.
  • Идентификатор события 6013: Отображает время безотказной работы компьютера после последней перезагрузки

Есть ли одно сообщение журнала, которое я могу просмотреть в журнале событий Windows, чтобы поймать все время P C завершился / перезапущен?

Всегда ли отправляется событие с кодом 12 независимо от причины, по которой произошло отключение?

1 Ответ

0 голосов
/ 19 июня 2020

Вот центральная часть моего C кода, который используется с 2001 года:

// Open the Systemevent log. 

h = OpenEventLog(name,  // NULL = use local computer 
         "System");     // source name 
if (h == NULL) 
    fatal("Could not open the System event log"); 

pevlr = (EVENTLOGRECORD *) &bBuffer; 

time(&startTime);

startTime   -= 30*24*3600L;         //  30 days (~ 4 weeks) before now
start        = 0;
prevDay      = 0;
earliestTime = 0;
duration     = 0;

// Opening the event log positions the file pointer for this 
// handle at the beginning of the log. Read the records 
// sequentially until there are no more. 

while (ReadEventLog(h,                // event log handle 
            EVENTLOG_FORWARDS_READ |  // reads forward 
            EVENTLOG_SEQUENTIAL_READ, // sequential read 
            0,            // ignored for sequential reads 
            pevlr,        // pointer to buffer 
            BUFFER_SIZE,  // size of buffer 
            &dwRead,      // number of bytes read 
            &dwNeeded))   // bytes in next record 
{
    while (dwRead > 0) 
    { 
        // The source name is just past the end of the 
        // formal structure. 

        sourceName = (LPSTR) ((LPBYTE) pevlr + sizeof(EVENTLOGRECORD));
        id         = pevlr->EventID & 0x01FFF;
        now        = (time_t)(pevlr->TimeGenerated);


        if (((id == EL_START) || (id == EL_END)) && 
            (now >= startTime) &&
            !strcmp(sourceName, "EventLog"))
          {
            if (!earliestTime)
              earliestTime = now;

            dwThisRecord++;

            tm  = localtime(&now);
            day = tm->tm_mday;

            if (day != prevDay)
              {
                printf("\n%s ", DateStamp(&now));
                if (id == EL_END)
                  printf("      ... ");
              }
            else if (id == EL_START)
              printf("\n            ");

            if (id == EL_START)
              {
                if (start)
                  {
                    printf("%s ...        (no end time!)", TimeStamp(&start));
                    printf("\n       %s", TimeStamp(&now));
                  }
                else
                  {
                    printf("%s ... ", TimeStamp(&now));
                  }
                start = now;
              }
            else
              {
                if (start)
                  {
                    printf("%s  ", TimeStamp(&now));                        
                    printf("%s", Duration(now - start));
                    duration += (now - start);
                  }
                else
                  {
                    printf(" ... %s  (no start time!)", TimeStamp(&now));
                  }
                start = 0;
              }

            prevDay = day;
          }

        dwRead -= pevlr->Length; 
        pevlr   = (EVENTLOGRECORD *) ((LPBYTE) pevlr + pevlr->Length); 
    } 

    pevlr = (EVENTLOGRECORD *) &bBuffer; 
} 

CloseEventLog(h); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...