Вывод логов действий с файлами

208
29 марта 2018, 09:22

Где найти файл лога Win с информацией о, например, кол-ве удалённых папок или файлов? Ну, не само количество, а, допустим, просто инфу о том, какие действия делал пользователь. Очень нужно, хочу выводить это в консоль.

Answer 1

Операции с файлами по умолчанию в Windows не заносятся в журнал событий (так как при этом бы туда сыпалось слишком много неинформативных записей). Их логирование можно включить, как описано здесь. Тогда информация о работе с файлами будет попадать в журнал аудита, откуда ее можно считать с помощью WinAPI.

Однако, для NTFS-дисков кое-какую информацию об операциях с файлами можно получить из USN-журнала тома, без необходимости в изменении настроек системы. Недостаток способа в том, что записей там много, их считывание идет медленно, а отфильтровать их можно только последовательным проходом всего журнала до необходимого времени. Код для вывода первых 50 записей из USN-журнала (для запуска требуются права администратора):

#include <Windows.h>
#include <WinIoCtl.h>
#include <stdlib.h>
#include <locale.h>
#include <stdio.h>
#define BUF_LEN 4096
//вывод содержимого журнала USN для тома
void PrintJournal(TCHAR* volume,UINT max_count){
   HANDLE hVol;
   CHAR Buffer[BUF_LEN];
   USN_JOURNAL_DATA JournalData;
   READ_USN_JOURNAL_DATA ReadData = {0, 0xFFFFFFFF, FALSE, 0, 0};
   PUSN_RECORD UsnRecord; 
   SYSTEMTIME st;
   int c=0;
   DWORD dwBytes;
   DWORD dwRetBytes;
   hVol = CreateFile( volume, 
               GENERIC_READ | GENERIC_WRITE, 
               FILE_SHARE_READ | FILE_SHARE_WRITE,
               NULL,
               OPEN_EXISTING,
               0,
               NULL);
   if( hVol == INVALID_HANDLE_VALUE )
   {
      printf("CreateFile failed (%d)\n", GetLastError());
      goto End;
   }
   if( !DeviceIoControl( hVol, 
          FSCTL_QUERY_USN_JOURNAL, 
          NULL,
          0,
          &JournalData,
          sizeof(JournalData),
          &dwBytes,
          NULL) )
   {
      printf( "Query journal failed (%d)\n", GetLastError());
      goto End;
   }
   ReadData.UsnJournalID = JournalData.UsnJournalID;
   printf( "Journal ID: 0x%I64x\n", JournalData.UsnJournalID );
   printf( "FirstUsn: 0x%I64x\n\n", JournalData.FirstUsn );
   while(true)
   {
      memset( Buffer, 0, BUF_LEN );
      if( !DeviceIoControl( hVol, 
            FSCTL_READ_USN_JOURNAL, 
            &ReadData,
            sizeof(ReadData),
            &Buffer,
            BUF_LEN,
            &dwBytes,
            NULL) )
      {
         printf( "Read journal failed (%d)\n", GetLastError());
         goto End;
      }
      dwRetBytes = dwBytes - sizeof(USN);
      // Find the first record
      UsnRecord = (PUSN_RECORD)(((PUCHAR)Buffer) + sizeof(USN));  
      printf( "****************************************\n");
      // This loop could go on for a long time, given the current buffer size.
      while( dwRetBytes > 0 )
      {
          //получаем время записи...
         if(FileTimeToSystemTime((FILETIME*)&(UsnRecord->TimeStamp),&st)==false){
             printf( "\nfailed to get time\n");
             goto End;
         }      
         //выводим данные
         printf( "%4d.%02d.%02d %2d:%02d\n",(int)st.wYear,(int)st.wMonth,(int)st.wDay,(int)st.wHour,(int)st.wMinute); //время записи
         printf("Reference number: 0x%I64x\n", UsnRecord->FileReferenceNumber ); //ID файла
         printf("File name: %.*S\n", UsnRecord->FileNameLength/2, UsnRecord->FileName ); //имя файла         
         printf( "Reason: 0x%x", UsnRecord->Reason ); //причина изменений
         if( (UsnRecord->Reason & USN_REASON_FILE_DELETE)>0)printf( " (File deleted)" );    
         if( (UsnRecord->Reason & USN_REASON_FILE_CREATE)>0)printf( " (File created)" );
         if( (UsnRecord->Reason & USN_REASON_DATA_OVERWRITE)>0)printf( " (Data overwrite)" );
         if( (UsnRecord->Reason & USN_REASON_DATA_EXTEND)>0)printf( " (Data extend)" );
         printf( "\n\n" );       
         c++;
         if(c>=max_count) goto End;//если прочитано указанное количество записей, выходим
         dwRetBytes -= UsnRecord->RecordLength;
         // Find the next record
         UsnRecord = (PUSN_RECORD)(((PCHAR)UsnRecord) + 
                  UsnRecord->RecordLength); 
      }
      // Update starting USN for next call
      ReadData.StartUsn = *(USN *)&Buffer; 
   }
   End:
   CloseHandle(hVol);  
}
int wmain(int argc, wchar_t **argv)
{
    setlocale(LC_ALL,"Russian");    
    PrintJournal(TEXT("\\\\.\\c:"),50);
    getchar();
    return 0;
}

Пример вывода:

Journal ID: 0x1d213cf6845e9c2
FirstUsn: 0x160b40000
****************************************
2018.03.25  6:01
Reference number: 0xb80000000256ed
File name: GetStateWorker20180325.log
Reason: 0x2 (Data extend)
2018.03.25  6:02
Reference number: 0x21f0000000356fb
File name: cache.dat
Reason: 0x80000200 (File deleted)
2018.03.25  6:02
Reference number: 0x78000000038ae2
File name: asw-8d99b330-1115-4672-8629-c820c1720c18.tmp
Reason: 0x1103 (File created) (Data overwrite) (Data extend)
2018.03.25  6:02
Reference number: 0x78000000038ae2
File name: cache.dat
Reason: 0x2103 (File created) (Data overwrite) (Data extend)
2018.03.25  6:02
Reference number: 0x78000000038ae2
File name: cache.dat
Reason: 0xa103 (File created) (Data overwrite) (Data extend)
2018.03.25  6:02
Reference number: 0x78000000038ae2
File name: cache.dat
Reason: 0x8000a103 (File created) (Data overwrite) (Data extend)

MSDN - Walking a Buffer of Change Journal Records

READ ALSO
Ошибка памяти или синтаксиса С++

Ошибка памяти или синтаксиса С++

Добрый вечерПишу код программы, которая должна иметь функции ввода и вывода массива типа структуры AEROFLOT

218
Почему не работает цикл while?

Почему не работает цикл while?

Провожу эксперименты с Arduino и решил замучать цикл while (вместо loop)Задал условие, при котором должен срабатывать цикл, но вместо срабатывания...

236
Не работает цикл while в Arduino?

Не работает цикл while в Arduino?

Вот код на дёргание светодиода каждую секунду:

228
Записать даные из значения переменной в файл .txt Builder C++

Записать даные из значения переменной в файл .txt Builder C++

Как записать даные из значения переменной в файл txt?

214