Кто удалил файл из общей сетевой папки в Windows?

С помощью аудита событий доступа к объектам файловой системы можно определить конкретного пользователя, который создал, удалил или изменил определенный файл. В этой статье мы покажем, как настроить аудит событий удаления объектов в общей сетевой папке на файловом сервере Windows Server 2025/2022/2019. После настройки аудита, вы можете с помощью информации в журнале событий Event Viewer найти пользователя, который удалил файл или папку на файловом сервере.

Включаем политику аудита доступа к файлам и папкам в Windows

По умолчанию в Windows Server не включен аудит событий доступа к объектам на файловой системе. Если аудит не был включен на момент удаления файла, вы не сможете ретроспективно определить пользователя, удалившего файл.

Включить и настроить аудит событий доступа к файлам и папкам можно с помощью групповых политики. Настроить политику аудита можно с помощью доменной GPO (настраивается с помощью консоли управления gpmc.msc), или из локального редактора локальной политики ( gpedit.msc ) на конкретном хосте:

  1. Перейдите в раздел GPO с расширенными политиками аудита Windows Settings -> Security Settings -> Advanced Audit Policy Configuration -> Object Access;
  2. Включите политику Audit File System и укажите, что нужно логировать только успешные события доступа к объектам файловой системы (Configure the following audit events -> Successвключить политику аудита доступа к сетевым папкам в windows server
  3. Сохраните изменения и обновите настройки групповых политик на компьютере с помощью команды gpupdate /force .

Настройка аудита событий удаления файлов из конкретной папки

Теперь нужно настроить аудит в свойствах общей сетевой папки, доступ к которой вы хотите отслеживать. Запустите проводник и откройте свойства общей папки. Перейдите на вкладку Security. Нажмите кнопку Advanced -> вкладка Auditing.

Если появится сообщение You must be an administrator or have been given the appropriate privileges to view the audit properties of this object, нажмите кнопку Continue.

настройка аудита доступа к сетевой папке в windows

Нажмите кнопку Add и укажите имя пользователя или группы, для которых нужно записывать события аудита (если нужно отслеживать события для всех пользователей, укажите группу Everyone).

Чтобы в Event Viewer писались только события удаления файлов, нажмите кнопку Show advanced permissions. В списке событий оставьте аудит только для событий удаления папок и файлов — Delete и Delete subfolders and files.

Совет. Включение аудита доступа к объектам Windows накладывает дополнительные расходы на ресурсы системы. Всегда старайтесь минимизировать количество объектов и событий аудита, которые нужно отслеживать.

отслеживание удаления файлов в сетевой папке

Совет. Вы можете включить аудит удаления файлов в папке с помощью через PowerShell:

$Path = "D:\Public"
$AuditChangesRules = New-Object System.Security.AccessControl.FileSystemAuditRule('Everyone', 'Delete,DeleteSubdirectoriesAndFiles', 'ContainerInherit,ObjectInherit', 'None', 'Success')
$Acl = Get-Acl -Path $Path
$Acl.AddAuditRule($AuditChangesRules)
Set-Acl -Path $Path -AclObject $Acl

Теперь, если пользователь удаляет файл в отслеживаемой сетевой папке, в журнале Event Viewer -> Security файлового сервера будут появляться события от источника Microsoft Windows security auditing.

Откройте mmc консоль Event Viewer ( eventvwr.msc ), разверните секцию Windows Logs -> Security. Включите фильтр событий по EventID 4663, 4659:

  • 4663 – событие удаления из локальной папки
  • 4659 – событие удаления из сетевой папки (по сети через UNC путь или через смонтированный сетевой диск) или локальное удаление мимо корзины ( SHIFT+DEL )

В описании события будет указан пользователь, удаливший файл (Subject: Account Name) и имя удаленного файла (Object Name). Access Mask 0x10000 и 0x10080 указывают, что файл был удален.

При удалении файла из сетевой папки, он удаляется сразу, а не отправляется в корзину. Список открытых по сети файлов в сетевой папке можно получить так.

событие удаления файла из папки на сервере в event viewer с кодом 4663 и 4659

Дополнительно вы можете отслеживать кто изменил NTFS права доступа к папке или файлу.
A handle to an object was requested with intent to delete.
Subject:
	Security ID:		WINITPRO\aaivanov2
	Account Name:		aaivanov2
	Account Domain:		WINITPRO
	Logon ID:		0xD9F590
Object:
	Object Server:	Security
	Object Type:	File
	Object Name:	C:\Docs\report2025.pdf
	Handle ID:	0x0
Process Information:
	Process ID:	0x4
Access Request Information:
	Transaction ID:	{00000000-0000-0000-0000-000000000000}
	Accesses:	DELETE
				ReadAttributes			
	Access Mask:	0x10080
	Privileges Used for Access Check:

После настройки аудита, события в журнале Security позволят вам определить:

  • Кто и когда удалил файл в сетевой папке;
  • Из какого приложения удален файл;
  • На какой момент времени нужно восстанавливать бэкап данного каталога.

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

В этом случае вы можете записывать события удаления файлов во внешнее хранилище. Например:

  • Оптимально отправлять события в специализированный лог коллектор, например GrayLog или Elasticsearch (в статье на сайте есть пример сбора событий Windows в GrayLog)
  • Текстовый файл
  • Базу данных

Запись информации о событиях удаления файлов в текстовый файл

В самом простом случае можно просто выгружать события удаления файлов в текстовый файл на сервере. Следующий PowerShell скрипт выберет все события с EventID 4663 и 4659 за сегодняшний день из журнала Security, извлечет из них имя удаленного файла/папки и имя пользователя, который удалили его, и сохранит результат в текстовый лог файл:

$outputFile = "C:\ps\delete-file-log.txt"
$auditfolder= "C:\Docs\*"
$eventIds = 4663, 4659
$computer = $env:COMPUTERNAME
$startTime = [datetime]::Today
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=$eventIds; StartTime=$startTime} | ForEach-Object {
$xml = [xml]$_.ToXml()
$user = $xml.Event.EventData.Data | Where-Object { $_.Name -eq 'SubjectUserName' } | Select-Object -ExpandProperty '#text'
$file = $xml.Event.EventData.Data | Where-Object { $_.Name -eq 'ObjectName' } | Select-Object -ExpandProperty '#text'
if ($file -and $file -like $auditfolder) {
"$computer`t$($_.TimeCreated)`t$user`t$file" | Add-Content -Path $outputFile
}
}

текстовый лог со списком удаленных файлов в windows

Запись событий удаления файлов в SQL базу (MySQL/MSSQL)

Другой вариант – отправлять события удаления файлов из папки во внешнею SQL базу данных. Для хранения событий можно использовать Microsoft SQL Server, Elasticsearch, PostgreSQL, MySQL/MariaDB или любую другую БД.

В этом примере мы покажем, как записывать события аудита в отдельную таблицу БД на сервере MariaDB. Формат таблицы:

  • Имя сервера;
  • Имя удаленного файла
  • Время удаления;
  • Имя пользователя, удалившего файл.

SQL запрос на создание такой таблицы в MariDB будет выглядеть так:

CREATE TABLE track_del (id INT NOT NULL AUTO_INCREMENT, server VARCHAR(100), file_name VARCHAR(255), dt_time  DATETIME, user_name VARCHAR(100),  PRIMARY KEY (ID));

Примечание. Особенности работы с различными базами данных из PowerShell:

Выше рассмотрен пример PowerShell скрипта для получения событий удаления файлов (4663 и 4659) из журнала Security. Теперь вместо текстового файла будет отправлять данные в таблицу на MariaDB сервере.

Для подключения к базе данных будем использовать PowerShell модуль SimplySql. Его нужно установить из PowerShell галереи (или установить PowerShell модуль вручную),

Install-Module -Name SimplySql

Для подключения к базе данных MariaDB на удаленном сервере добавим следующий код:

import-module SimplySql
$dbhost="192.168.158.179"
$dbname="aduser"
$dbuser="posh"
$dbpass="P@ssw0rd"
$pwSecure = ConvertTo-SecureString $dbpass -AsPlainText -Force
$creds = New-Object System.Management.Automation.PSCredential($dbuser, $pwSecure)
$sqlConnect = Open-MySqlConnection -ConnectionName MyDBCon -Server $dbhost -Database $dbname -Credential $creds -Port 3306 -Verbose

Далее идет код выборки событий и записи данных в таблицу:

$auditfolder= "C:\Docs\*"
$eventIds = 4663, 4659
$computer = $env:COMPUTERNAME
$startTime = [datetime]::Today
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=$eventIds; StartTime=$startTime} | ForEach-Object {
$xml = [xml]$_.ToXml()
$user = $xml.Event.EventData.Data | Where-Object { $_.Name -eq 'SubjectUserName' } | Select-Object -ExpandProperty '#text'
$file = $xml.Event.EventData.Data | Where-Object { $_.Name -eq 'ObjectName' } | Select-Object -ExpandProperty '#text'
if ($file -and $file -like $auditfolder) {
$time = $_.TimeCreated.ToString('yyyy-MM-dd HH:mm:ss')
$fileEscaped = $file -replace '\\', '\\\\'
$query = "INSERT INTO track_del (server, file_name, dt_time, user_name) VALUES ('$computer', '$fileEscaped', '$time', '$user');"
Invoke-SqlQuery -ConnectionName MyDBCon -Query $query
}
}
Close-SqlConnection -ConnectionName MyDBCon

Т.к. в таблице MariaDB нельзя хранить пути с обратными слешами типа c:\docs\folder1\file.txt, их приходится экранировать, заменяя на двойные.

Теперь, чтобы найти кто удалил конкретный файл, можно выполнять поиск по базе данных MySQL. В этом примере мы ищем любые удаленные файлы, содержащие в имени report2026.

$fileSearch = "%report2026%"
$pwSecure = ConvertTo-SecureString $dbpass -AsPlainText -Force
$creds = New-Object System.Management.Automation.PSCredential($dbuser, $pwSecure)
$sqlConnect = Open-MySqlConnection -ConnectionName MyDBCon -Server $dbhost -Database $dbname -Credential $creds -Port 3306 -Verbose
$fileSearchEscaped = $fileSearch -replace '\\', '\\\\'
$query = @"
SELECT server, REPLACE(file_name, '\\\\', '\\') AS file_name, dt_time, user_name FROM track_del
WHERE file_name LIKE '%$fileSearchEscaped%'
ORDER BY dt_time DESC;
"@
$data = Invoke-SqlQuery -ConnectionName MyDBCon -Query $query
$data | Format-Table -AutoSize
Close-SqlConnection -ConnectionName MyDBCon

В результате в консоли PS появится имя пользователя и время удаления файла.

Запрос PowerShell к sql БД для получении инфомации о пользователе, удалившем файл

  • Скрипт сохранения данных из журнала событий в БД можно выполнять один раз в конце дня по планировщику или повесить триггер на событие удаления (On Event), что более ресурсоемко. Все зависит от требования к системе.
  • Убедитесь, что на файловом сервере задан достаточно большой максимальный размер для журнала безопасности, чтобы в него помещались все события за день. Иначе придется запускать задания сброса данных из журнала в базу чаще, чем 1 раз в день, или вообще по триггеру.
  • После сохранения событий во внешнюю базу данных, если вам не нужны другие логи, этот журнал Event Viewer можно очистить.

Можно создать простую веб страницу на php для получения информации о событиях удаления файлов в более удобном виде.

Важный совет. При наличии в журнале информации об удалении файла пользователем, не спешите однозначно интерпретировать его как преднамеренное или даже злонамеренное. Многие программы (особенно этим грешат программы пакета MS Office), при сохранении изменений, сначала создают временный файл, записывают в него данные, а старая версия файла удаляется. В этом случае имеет смысл дополнительной записи в БД имени процесса, которым было выполнено удаление файла (поле ProcessName события), и вести анализ событий удаления файлов с учетом этого факта. Либо можно фильтровать события от некоторых процессов, например, winword.exe, excel.exe и пр. Также для уменьшения количества событий в базе данных или файле, можно не записывать в нее события удаления временных файлов (*.tmp, *.temp)

Итак, мы предложили идею и некий общий каркас системы аудита и хранения информации об удаленных файлах в сетевых папках. Вы можете ее с лёгкостью модифицировать под ваши нужды.


Предыдущая статья Следующая статья


Комментариев: 67 Оставить комментарий

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Я не робот( Обязательно отметьте)