Программно определить пользователя, который последний измененный файл на Windows?
Мне было поручено написать простую утилиту командной строки на C#, которая будет контролировать каталог на сервере, к которому несколько пользователей будут обращаться для копирования/вырезания/вставки/просмотра данных. Я использовал FileSystemWatcher чтобы сделать это, но ему не хватает нескольких функций.
можно ли определить пользователей или хотя бы имя компьютера из файла осуществляется/изменен?
(Примечание: это не должно быть с FileSystemWatcher, я ищу любой способ сделать это.)
2 ответов
Я не думаю, что вы сможете контролировать с помощью C# напрямую. Во всяком случае, без помощи операционной системы хоста. Windows и NTFS позволяют вам проводить аудит определенного каталога и регистрировать доступы в журнале событий безопасности для хост-машины (поэтому сервер, на котором размещается общий ресурс, должен будет проводить аудит, а не клиент).
С KB310399-как проверить доступ пользователей к файлам, папкам и принтерам в Windows XP
Аудит Доступа Пользователей файлов, папок и принтеров
журнал аудита отображается в журнале безопасности в средстве просмотра событий. Чтобы включить эту функцию:
- Нажмите кнопку Пуск, выберите Панель управления выберите производительность и обслуживание и затем нажмите кнопку администрирование.
- дважды щелкните значок Локальная политика безопасности.
- на левой панели дважды щелкните Локальные политики, чтобы развернуть его.
- в левой области щелкните политика аудита, чтобы отобразить параметры политики в правой области.
- дважды щелкните доступ к объекту аудита.
- чтобы проверить успешный доступ к указанным файлам, папкам и принтерам, установите флажок успешно.
- чтобы проверить неудачный доступ к этим объектам, установите флажок сбой.
- чтобы включить аудит обоих, установите оба флажка.
- нажмите OK.
указание файлов, папок и принтеров для аудита
после включения аудита можно указать файлы, папки и принтеры, которые требуется проверить. Для этого:
- в Проводнике Windows найдите файл или папку, которые требуется проверить. Для аудита принтера найдите его, нажав кнопку Пуск, а затем принтеры и факсы.
- щелкните правой кнопкой мыши файл, папку или принтер, который требуется проверить, а затем выберите Свойства.
- перейдите на вкладку Безопасность и нажмите кнопку Дополнительно.
- перейдите на вкладку аудит и нажмите кнопку Добавить.
- в поле Введите имя объекта для выбора введите имя пользователя или группы, доступ к которым вы хотите проверить. Для поиска имен на компьютере щелкните дополнительно, а затем в диалоговом окне Выбор пользователя или группы выберите команду найти сейчас.
- нажмите OK.
- установите флажки успешно или неудачно для действий, которые требуется проверить, и нажмите кнопку ОК.
- Нажмите кнопку ОК, а затем нажимать OK.
процесс аналогичен для серверных операционных систем и Windows Vista и Windows 7. Если вы идете по этому маршруту, вы можете попросить программу C# прочитать журнал событий (см. EventLog
class), чтобы искать нужные вам данные.
Примечание: начиная с vista, вы должны быть и (UAC повышен, если необходимо) администратором, чтобы прочитать их из кода.
убедитесь, что на вашем ПК установлен или включен WMI, а также добавьте ссылку на System.Management
и System.Management.Instrumentation
Как хорошо. Существует также C# и VB WMI scripting application GUI, который вы можете скачать для запуска и тестирования запросов WMI, а также Google. Поскольку я работаю в Департаменте обороны, есть определенные вещи, которые я могу получить отсюда в отношении интернета, другие вещи заблокированы, поэтому, пожалуйста, простите меня, если я не публикую определенные веб-ссылки.
здесь что - то, чтобы вы начали
ManagementScope mgtScope = new ManagementScope("\\ComputerName\root\cimv2");
// you could also replace the username in the select with * to query all objects
ObjectQuery objQuery = new ObjectQuery("SELECT username FROM Win32_ComputerSystem");
ManagementObjectSearcher srcSearcher = new ManagementObjectSearcher(mgtScope, objQuery);
ManagementObjectCollection colCollection = srcSearcher.Get();
foreach (ManagementObject curObjCurObject in colCollection)
{
Console.WriteLine(curObjCurObject["username"].ToString());
}
//if you want ot get the name of the machine that changed it once it gets into that Event change the query to look like this. I just tested this locally and it does work
ManagementObjectSearcher mosQuery = new ManagementObjectSearcher("SELECT * FROM Win32_Process WHERE ProcessId = " + Process.GetCurrentProcess().Id.ToString());
ManagementObjectCollection queryCollection1 = mosQuery.Get();
foreach (ManagementObject manObject in queryCollection1)
{
Console.WriteLine("Name : " + manObject["name"].ToString());
Console.WriteLine("Version : " + manObject["version"].ToString());
Console.WriteLine("Manufacturer : " + manObject["Manufacturer"].ToString());
Console.WriteLine("Computer Name : " + manObject["csname"].ToString());
Console.WriteLine("Windows Directory : " + manObject["WindowsDirectory"].ToString());
}