【问题标题】:How to know the hostname/IP address of the computer who is doing changes in the shared folder on server如何知道在服务器上的共享文件夹中进行更改的计算机的主机名/IP 地址
【发布时间】:2018-10-25 06:46:13
【问题描述】:

我必须监视服务器上的共享文件夹,以了解网络中连接的计算机(它是主机名)在该文件夹中发生的更改。我使用 C# 实现了对目录和文件的监视。但是,它只监视诸如 Created、Renamed、Changed、Deleted 和 Error 事件之类的事件。 我还需要帮助监控访问或更改共享文件夹的计算机的主机名/IP 地址以及事件发生的时间。 这是我的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Threading;
namespace a1ashiishFileSystemWatcher
{
    public partial class MainForm : Form
    {
        public ListBoxlistBox;
        public const String startMonitoring = “Start Minitoring…”;
        public const String stopMonitoring = “Stop Minitoring…”;
        public MainForm()
        {
            InitializeComponent();
            //Create a listBox to show activities of all Events.
            listBox = new ListBox();
            listBox.FormattingEnabled = true;
            listBox.Location = new System.Drawing.Point(23, 121);
            listBox.Name = “listBox”;
            listBox.Size = new System.Drawing.Size(571, 238);
            listBox.TabIndex = 2;
            this.Controls.Add(listBox);
        }
        private voidbutton1_Click(object sender, EventArgs e)
        {
            // Create FolderBrowserDialog object.
            FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();
            // Show a button to create a new folder.
            folderBrowserDialog.ShowNewFolderButton = true;
            DialogResult dialogResult = folderBrowserDialog.ShowDialog();
            // Get selected path from FolderBrowserDialog control.
            if (dialogResult == DialogResult.OK)
            {
                textBox1.Text = folderBrowserDialog.SelectedPath;
                Environment.SpecialFolderroot = folderBrowserDialog.RootFolder;
            }
        }
        private voidbutton2_Click(object sender, EventArgs e)
        {
            // Create a new FileSystemWatcher object.
            FileSystemWatcher fsWatcher = new FileSystemWatcher();
            switch (button2.Text)
            {
                // Start Monitoring…
                case startMonitoring:
                    if (!textBox1.Text.Equals(String.Empty))
                    {
                        listBox.Items.Add(“Started FileSystemWatcher Service…”);
                        fsWatcher.Path = textBox1.Text;
                        // Set Filter.
                        fsWatcher.Filter = (textBox2.Text.Equals(String.Empty)) ? “*.*” : textBox2.Text;
                        // Monitor files and subdirectories.
                        fsWatcher.IncludeSubdirectories = true;
                        // Monitor all changes specified in the NotifyFilters.
                        fsWatcher.NotifyFilter = NotifyFilters.Attributes |
                                                 NotifyFilters.CreationTime |
                                                 NotifyFilters.DirectoryName |
                                                 NotifyFilters.FileName |
                                                 NotifyFilters.LastAccess |
                                                 NotifyFilters.LastWrite |
                                                 NotifyFilters.Security |
                                                 NotifyFilters.Size;
                        fsWatcher.EnableRaisingEvents = true;
                        // Raise Event handlers.
                        fsWatcher.Changed += new FileSystemEventHandler(OnChanged);
                        fsWatcher.Created += new FileSystemEventHandler(OnCreated);
                        fsWatcher.Deleted += new FileSystemEventHandler(OnDeleted);
                        fsWatcher.Renamed += new RenamedEventHandler(OnRenamed);
                        fsWatcher.Error += new ErrorEventHandler(OnError);
                        button2.Text = stopMonitoring;
                        textBox1.Enabled = false;
                        textBox2.Enabled = false;
                    }
                    else
                    {
                        listBox.Items.Add(“Please select folder to monitor….”);
                    }
                    break;
                // Stop Monitoring…
                case stopMonitoring:
                default:
                    fsWatcher.EnableRaisingEvents = false;
                    fsWatcher = null;
                    button2.Text = startMonitoring;
                    textBox1.Enabled = true;
                    textBox2.Enabled = true;
                    listBox.Items.Add(“Stopped FileSystemWatcher Service…”);
                    break;
            }
        }
        // FileSystemWatcher – OnCreated Event Handler
        public voidOnCreated(object sender, FileSystemEventArgs e)
        {
            // Add event details in listbox.
            this.Invoke((MethodInvoker)delegate { listBox.Items.Add(String.Format(“Path : “{0}”   || Action : {1}”, e.FullPath, e.ChangeType)); });
        }
        // FileSystemWatcher – OnChanged Event Handler
        public voidOnChanged(object sender, FileSystemEventArgs e)
        {
            // Add event details in listbox.
            this.Invoke((MethodInvoker)delegate { listBox.Items.Add(String.Format(“Path : “{0}”   || Action : {1}”, e.FullPath, e.ChangeType)); });
        }
        // FileSystemWatcher – OnRenamed Event Handler
        public voidOnRenamed(object sender, RenamedEventArgs e)
        {
            // Add event details in listbox.
            this.Invoke((MethodInvoker)delegate { listBox.Items.Add(String.Format(“Path : “{0}”   || Action : {1} to “{2}””, e.FullPath, e.ChangeType, e.Name)); });
        }
        // FileSystemWatcher – OnDeleted Event Handler
        public voidOnDeleted(object sender, FileSystemEventArgs e)
        {
            // Add event details in listbox.
            this.Invoke((MethodInvoker)delegate { listBox.Items.Add(String.Format(“Path : “{0}”   || Action : {1}”, e.FullPath, e.ChangeType)); });
        }
        // FileSystemWatcher – OnError Event Handler
        public void OnError(object sender, ErrorEventArgse)
        {
            // Add event details in listbox.
            this.Invoke((MethodInvoker)delegate { listBox.Items.Add(String.Format(“Error : {0}”, e.GetException().Message)); });
        }
    }
}

我已经尝试过这种方法,但仍然无法获取主机名。请帮助我哪里出错了。

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()
        {
        }
    }
}

【问题讨论】:

  • 我很确定 FileSystemWatcher 和网络中的另一台机器不可能做到这一点。我想您必须考虑将该代码放在共享该文件夹的机器上,并检查相关的 Windows API 是否可以监控。
  • 您是否真的需要更改所来自的机器/IP,或者实际上更有趣的是让用户进行更改?我的猜测是后者更容易。
  • @Fildor 是的,我们需要在服务器上识别正在更改共享文件夹的客户端计算机的主机名
  • 也许看看这个问题的答案:stackoverflow.com/q/1286137/982149 这是 2009 年关于用户的,所以我故意不将其标记为重复。
  • 这不是您应该在代码中解决的问题。如果要注册哪个用户对服务器上的共享文件夹进行更改,则需要在该服务器上配置审核。然后,您可以阅读该服务器上的审核日志。 FileSystemWatcher 不能解决这个问题。

标签: c# shared-directory


【解决方案1】:

据我所知,您可以使用WMI 至少获取与共享相关的那些。您需要引用System.Management.dll,创建ManagementObjectSearcher 的实例,然后就可以了。

问题通常是找到正确的类,WMI 的参考可以在WMI Reference 下找到。对于您的用例,您将需要 Win32_ConnectionShare 类。考虑到应用程序需要以管理员权限运行才能访问该类的数据。

您的用例的小示例代码(根据上述文档,antecedent 代表服务器端,dependent 代表客户端):

// Create a query
SelectQuery query = new SelectQuery("SELECT * FROM Win32_ConnectionShare");

// Initialize an object searcher with this query
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);

// Get the resulting collection and loop through it
foreach (ManagementObject mo in searcher.Get())
{
    string antecedent = mo["antecedent"].ToString();
    string dependent = mo["dependent"].ToString();

    ManagementObject share = new ManagementObject(antecedent);
    ManagementObject server = new ManagementObject(dependent);

    Console.WriteLine(server["UserName"].ToString());
    Console.WriteLine(server["ComputerName"].ToString());
    Console.WriteLine(server["ShareName"].ToString());
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-11
    • 2018-11-10
    • 2018-08-13
    • 1970-01-01
    • 2017-11-30
    • 2012-02-07
    • 1970-01-01
    • 2016-07-03
    相关资源
    最近更新 更多