Как узнать имя хоста компьютера, который получил доступ к общей папке
Я должен отслеживать общую папку на сервере на предмет изменений, происходящих в этой папке на компьютере, подключенном к сети (это имя хоста). Я реализовал мониторинг каталогов и файлов с помощью C#. Но он отслеживает только такие события, как события "Создан", "Переименован", "Изменен", "Удален" и "Ошибка". Мне также нужна помощь в отслеживании имени хоста /IP-адреса компьютера, который обращается к общей папке или выполняет изменения в ней. Я попробовал этот подход, но все еще не могу получить имя хоста. Пожалуйста, помогите мне, где я иду не так! Вот мой код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace MonitorShare
{
public partial class Monitor : ServiceBase
{
public Monitor()
{
InitializeComponent();
string dDirectory = @"E:\SharedFolder\Shares";
DirectoryInfo info = new DirectoryInfo(dDirectory);
string[] filePath = Directory.GetFiles(dDirectory, "*.*");
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.BeginInit();
watcher.filePath = dDirectory;
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;
watcher.Changed += new FileSystemEventHandler(watcher_Changed);
watcher.Created += new FileSystemEventHandler(watcher_Created);
watcher.Deleted += new FileSystemEventHandler(watcher_Deleted);
watcher.Filter = "*.*";
watcher.EnableRaisingEvents = true;
watcher.EndInit();
}
protected void watcher_Deleted(object sender, FileSystemEventArgs e)
{
var process = new Process();
process.StartInfo.FileName = "openfiles.exe";
process.StartInfo.Arguments = "/query /FO CSV /v";
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.RedirectStandardOutput = true;
try
{
process.Start();
if ((process.StandardOutput != null))
{
var result = process.StandardOutput.ReadToEnd().Trim().Replace("\"", "");
var lines = result.Split('\n');
var firstLineIndex = 1 + lines.Cast<string>().ToList().FindIndex(l => l.Contains("Hostname"));
for (var i = firstLineIndex; i < lines.Count() && firstLineIndex > 0; i++)
{
var fields = lines[i].Split(',');
var time = DateTime.Now;
FileStream fs = new FileStream(@"C:\SFD\log.txt", FileMode.Append);
StreamWriter sw = new StreamWriter(fs);
if(firstLineIndex.ToString()=="Hostname")
{
Console.SetOut(sw);
Console.WriteLine(e.FullPath + "\t" + e.ChangeType + "\t" + time + "\t" + e.Name + "\t" + fields[0]);
sw.Close();
}
}
}
process.WaitForExit();
}
catch (Exception ex)
{
}
finally
{
process.Close();
}
}
protected void watcher_Created(object sender, FileSystemEventArgs e)
{
var process = new Process();
process.StartInfo.FileName = "openfiles.exe";
process.StartInfo.Arguments = "/query /FO CSV /v";
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.RedirectStandardOutput = true;
try
{
process.Start();
if ((process.StandardOutput != null))
{
var result = process.StandardOutput.ReadToEnd().Trim().Replace("\"", "");
var lines = result.Split('\n');
var firstLineIndex = 1 + lines.Cast<string>().ToList().FindIndex(l => l.Contains("Hostname"));
for (var i = firstLineIndex; i < lines.Count() && firstLineIndex > 0; i++)
{
var fields = lines[i].Split(',');
var time = DateTime.Now;
FileStream fs = new FileStream(@"C:\SFD\log.txt", FileMode.Append);
StreamWriter sw = new StreamWriter(fs);
if(firstLineIndex.ToString()=="Hostname")
{
Console.SetOut(sw);
Console.WriteLine(e.FullPath + "\t" + e.ChangeType + "\t" + time + "\t" + e.Name + "\t" + fields[0]);
sw.Close();
}
}
}
process.WaitForExit();
}
catch (Exception ex)
{
}
finally
{
process.Close();
}
}
protected override void OnStart(string[] args)
{
}
protected override void OnStop()
{
}
}
}