Как проверить, просматривает / открывает файл кто-то?

Здесь требуется отслеживать конфиденциальные файлы в определенной папке с помощью C #. Допустим, у меня есть «C: / Secrets», программа должна отслеживать доступ к этой папке для чтения или копирование данных из этой папки.

Я пробовал использовать FileSystemWatcher Class, но, насколько я понимаю, мы можем отслеживать только события Changed, Created, Deleted, используя это. Ниже приведен пример кода из документации.

using System;
using System.IO;
using System.Security.Permissions;

public class Watcher
{
    public static void Main()
    {
        Run();
    }

    [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
    private static void Run()
    {
        string[] args = Environment.GetCommandLineArgs();

        // If a directory is not specified, exit program.
        if (args.Length != 2)
        {
            // Display the proper way to call the program.
            Console.WriteLine("Usage: Watcher.exe (directory)");
            return;
        }

        // Create a new FileSystemWatcher and set its properties.
        using (FileSystemWatcher watcher = new FileSystemWatcher())
        {
            watcher.Path = args[1];

            // Watch for changes in LastAccess and LastWrite times, and
            // the renaming of files or directories.
            watcher.NotifyFilter = NotifyFilters.LastAccess
                                 | NotifyFilters.LastWrite
                                 | NotifyFilters.FileName
                                 | NotifyFilters.DirectoryName;

            // Only watch text files.
            watcher.Filter = "*.txt";

            // Add event handlers.
            watcher.Changed += OnChanged;
            watcher.Created += OnChanged;
            watcher.Deleted += OnChanged;
            watcher.Renamed += OnRenamed;

            // Begin watching.
            watcher.EnableRaisingEvents = true;

            // Wait for the user to quit the program.
            Console.WriteLine("Press 'q' to quit the sample.");
            while (Console.Read() != 'q') ;
        }
    }

    // Define the event handlers.
    private static void OnChanged(object source, FileSystemEventArgs e) =>
        // Specify what is done when a file is changed, created, or deleted.
        Console.WriteLine($"File: {e.FullPath} {e.ChangeType}");

    private static void OnRenamed(object source, RenamedEventArgs e) =>
        // Specify what is done when a file is renamed.
        Console.WriteLine($"File: {e.OldFullPath} renamed to {e.FullPath}");
}

Как мы можем контролировать доступ для чтения к папке? А можно ли отслеживать действие копирования?


person Joe Dewt    schedule 25.04.2020    source источник
comment
Вы создаете своего рода механизм аудита? Вы уже проверяли Аудит файловой системы Windows? docs.microsoft.com/en- us / windows / безопасность / защита от угроз /   -  person user2297037    schedule 25.04.2020
comment
Ваше наблюдение неверно. Как поясняется в документации OnChanged вызывается, когда вносятся изменения в размер, системные атрибуты, время последней записи, время последнего доступа или разрешения безопасности для файла или каталога в отслеживаемом каталоге. Хотя для этого требуется, что файловая система записывает время последнего доступа. Что по умолчанию отключено во всех поддерживаемых версиях Windows.   -  person IInspectable    schedule 25.04.2020
comment
вам нужен драйвер минифильтра   -  person RbMm    schedule 25.04.2020
comment
Вы можете попробовать пакет nuget Microsoft.Diagnostics.Tracing.TraceEvent, как показано здесь: stackoverflow.com/a/51722043/403671   -  person Simon Mourier    schedule 25.04.2020
comment
@ user2297037 - Да, нужен механизм аудита, но для этого нужно программно, поэтому мы указываем папку, и для нее должен быть включен аудит с журналами.   -  person Joe Dewt    schedule 26.04.2020


Ответы (1)


используйте File.GetLastAccessTime

Вот ссылка на документацию: - https://docs.microsoft.com/en-us/dotnet/api/system.io.file.getlastaccesstime?view=netcore-3.1

person user12402443    schedule 25.04.2020
comment
Время последнего доступа обновляется только после закрытия дескриптора, ссылающегося на файл. Это не позволяет отслеживать доступ для чтения. И по умолчанию он отключен, начиная с Windows Vista. Даже если он включен, программа может активно отключать обновление времени последнего доступа. - person IInspectable; 25.04.2020