Member 13123405 Ответов: 1

Как узнать имя хоста компьютера, который получил доступ к общей папке


Я должен отслеживать общую папку на сервере на предмет изменений, происходящих в этой папке с помощью компьютера, подключенного к сети(это имя хоста). Я реализовал мониторинг каталогов и файлов с помощью 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()
        {
        }
    }
}

1 Ответов

Рейтинг:
2

Dave Kreskowiak

То, что вы хотите, не может быть сделано с помощью FileSystemWatcher. Все, что он делает, это говорит вам: "что-то изменилось". У него нет возможности определить, кто внес изменения, а не из какой машины они пришли.

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


Member 13123405

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

Dave Kreskowiak

Да. Windows отслеживает все по учетной записи пользователя, а не по машине, с которой что-то пришло.