Получить имя пользователя для файла доступа
Я хотел бы получить имя пользователя доступного файла (добавить, удалить, переименовать,...). на самом деле я использую filesystemwatcher для контроля доступа к файлам и активировал доступ к объектам в каталоге, чтобы получать информацию о пользователях через журналы событий. Это решение не является идеальным, поскольку файловых событий много, а сообщения журнала событий не так детализированы. есть только один идентификатор события для записи данных. это используется для добавления файла, переименования, перемещения,... каждой записи данных. Кроме того, я должен был проверить, что сообщение журнала событий соответствует событию filesystemwatcher. Я бы предпочел справиться с этим лучше. так что я трачу много времени на гугл, чтение,... я знаю, что есть еще один пост на stackru
Получить имя пользователя открытого файла
но я думаю, что должно быть возможное решение, потому что Windows Events может получить имя пользователя.
с чтением на нескольких страницах я обнаружил, что должно быть возможное решение с использованием netapi32.dll. пример кода на http://vbcity.com/forums/t/133307.aspx?PageIndex=2 не работает для меня. я не смог получить fileid, поэтому я изменил код на
private ulong GetFileIdFromPath(string filePath)
{
WinAPI.BY_HANDLE_FILE_INFORMATION objectFileInfo = new WinAPI.BY_HANDLE_FILE_INFORMATION();
Thread.Sleep(200);
FileInfo fi = new FileInfo(filePath);
FileStream fs = fi.Open(FileMode.Open, FileAccess.Read, FileShare.Read);
WinAPI.GetFileInformationByHandle(fs.Handle, out objectFileInfo);
fs.Close();
ulong fileIndex = ((ulong)objectFileInfo.FileIndexHigh << 32) + (ulong)objectFileInfo.FileIndexLow;
return fileIndex;
}
с помощью этого кода я могу получить fileid, но с помощью fileid и кода примера я не могу получить имя пользователя.
1 ответ
Из моей последней программы ( 2 недели назад) - меня попросили проверить изменения в файлах (также имя пользователя)
Решение было с помощью filesystemwatcher и после события -> Перейти в журнал событий Windows, и поиск Xpath - чтобы найти, какой пользователь совершил действие.
public static EventUnit DisplayEventAndLogInformation(string fileToSearch, DateTime actionTime)
{
StringBuilder sb = new StringBuilder();
const string queryString = @"<QueryList>
<Query Id=""0"" Path=""Security"">
<Select Path=""Security"">*</Select>
</Query>
</QueryList>";
EventLogQuery eventsQuery = new EventLogQuery("Security", PathType.LogName, queryString);
eventsQuery.ReverseDirection = true;
EventLogReader logReader = new EventLogReader(eventsQuery);
EventUnit e = new EventUnit();
bool isStop = false;
for (EventRecord eventInstance = logReader.ReadEvent(); null != eventInstance; eventInstance = logReader.ReadEvent())
{
foreach (var VARIABLE in eventInstance.Properties)
if (VARIABLE.Value.ToString().ToLower().Contains(fileToSearch.ToLower()) && actionTime.ToString("d/M/yyyy HH:mm:ss") == eventInstance.TimeCreated.Value.ToString("d/M/yyyy HH:mm:ss"))
{
foreach (var VARIABLE2 in eventInstance.Properties) sb.AppendLine(VARIABLE2.Value.ToString());
e.Message = sb.ToString();
e.User = (eventInstance.Properties.Count > 1) ? eventInstance.Properties[1].Value.ToString() : "n/a";
e.File = fileToSearch;
isStop = true;
break;
}
if (isStop) break;
try
{
// Console.WriteLine("Description: {0}", eventInstance.FormatDescription());
}
catch (Exception e2)
{
}
}
return e;
}