Какой пользователь вызвал события FileSystemWatcher?

Например, я могу перехватить событие Delete для различных файлов в дереве папок, но как определить, какой пользователь вызвал удаление?

Я не смог найти ничего очевидного в документации MSDN для FileSystemWatcher, так что, возможно, это просто невозможно. Однако мне было бы любопытно, есть ли решение.


person Ash    schedule 17.08.2009    source источник


Ответы (3)


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

person Scott Dorman    schedule 17.08.2009
comment
Знаете ли вы, возможно ли это вообще в приложении .NET? Или мне нужно углубиться в Win API? - person Ash; 17.08.2009
comment
@Ash: вам нужно будет использовать вызовы Win32 API, если это вообще возможно. Я не уверен, какие API вам нужно будет использовать, но в конечном итоге вы, по сути, напишете свою собственную версию наблюдателя за файловой системой. - person Scott Dorman; 17.08.2009

Это возможно с помощью аудита папок (Свойства папки > Безопасность > Дополнительные параметры > Аудит), а затем поиска в журнале событий безопасности после срабатывания события FileSystemWatcher.

string GetUser(string path) {
    object nowDate = Now;
    GetUser = "Unknown";
    Threading.Thread.Sleep(1000);
    // # Search user in the security event log
    object secLog = new EventLog("Security", EVENTLOGSERVER);
    EventLogEntry entry;
    for (int i = (secLog.Entries.Count - 1); (i <= Math.Max((secLog.Entries.Count - 1500), 0)); i = (i + -1)) {
        entry = secLog.Entries(i);
        if (IsValidEntry(path, nowDate, entry)) {
            GetUser = entry.ReplacementStrings(11);
            break;
        }
    }
}

bool IsValidEntry(string path, DateTime nowDate, EventLogEntry entry) {
    return ((entry.EntryType == EventLogEntryType.SuccessAudit) 
        && ((entry.InstanceId == 560) || (entry.InstanceId == 564)) 
        && !entry.UserName.EndsWith("SYSTEM")
        && (Math.Abs(nowDate.Subtract(entry.TimeGenerated).TotalSeconds <= 20) 
        && (entry.ReplacementStrings.GetUpperBound(0) >= 11) 
        && (entry.ReplacementStrings(2).Length >= 4) 
        && path.EndsWith(entry.ReplacementStrings(2).Substring(4)));
}
person Ignacio Calvo    schedule 02.12.2011

Не похоже, чтобы в .NET были встроены какие-либо функции, которые могли бы помочь вам в этом, но с помощью функции NetFileGetInfo в Netapi32.dll это должно быть возможно.

Взгляните на эту тему, где пользователь dave4dl разместил пример кода это показывает, как это сделать.

person René    schedule 30.08.2012