Где найти файл лога Win с информацией о, например, кол-ве удалённых папок или файлов? Ну, не само количество, а, допустим, просто инфу о том, какие действия делал пользователь. Очень нужно, хочу выводить это в консоль.
Операции с файлами по умолчанию в 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
Виртуальный выделенный сервер (VDS) становится отличным выбором
Добрый вечерПишу код программы, которая должна иметь функции ввода и вывода массива типа структуры AEROFLOT
Провожу эксперименты с Arduino и решил замучать цикл while (вместо loop)Задал условие, при котором должен срабатывать цикл, но вместо срабатывания...
Как записать даные из значения переменной в файл txt?