gpt4 book ai didi

c# - 如何知道正在更改服务器上的共享文件夹的计算机的主机名/IP 地址

转载 作者:太空宇宙 更新时间:2023-11-03 14:58:25 25 4
gpt4 key购买 nike

我必须监视服务器上的共享文件夹,以了解连接到网络的计算机(它的主机名)在该文件夹中发生的更改。我使用 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()
{
}
}
}

最佳答案

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

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

您的用例的一些示例代码(根据上述文档,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());
}

关于c# - 如何知道正在更改服务器上的共享文件夹的计算机的主机名/IP 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47629472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com