MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Вывод логов действий с файлами"
Answer 805933
Операции с файлами по умолчанию в 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)
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.