C# 以编程方式确定上次在Windows上修改文件的用户?

C# 以编程方式确定上次在Windows上修改文件的用户?,c#,windows,network-drive,C#,Windows,Network Drive,我的任务是用C编写一个简单的命令行实用程序,它将监视服务器上的一个目录,多个用户将访问该目录以复制/剪切/粘贴/查看数据。我过去经常这样做,但它缺少一些功能 是否可以确定访问/修改文件的用户或至少是计算机名 注意:FileSystemWatcher不一定要这样做,我正在寻找任何方法来做到这一点。我认为您无法直接从C监控这一点。无论如何,没有主机操作系统的帮助也不行。Windows和NTFS允许您审核特定目录,并将访问记录在主机的安全事件日志中,以便托管共享的服务器必须进行审核,而不是客户端 从

我的任务是用C编写一个简单的命令行实用程序,它将监视服务器上的一个目录,多个用户将访问该目录以复制/剪切/粘贴/查看数据。我过去经常这样做,但它缺少一些功能

是否可以确定访问/修改文件的用户或至少是计算机名


注意:FileSystemWatcher不一定要这样做,我正在寻找任何方法来做到这一点。

我认为您无法直接从C监控这一点。无论如何,没有主机操作系统的帮助也不行。Windows和NTFS允许您审核特定目录,并将访问记录在主机的安全事件日志中,以便托管共享的服务器必须进行审核,而不是客户端

审核用户对文件、文件夹和打印机的访问 审核日志显示在事件查看器的安全日志中。要启用此功能,请执行以下操作:

单击开始,单击控制面板,单击性能和维护,然后单击管理工具。 双击本地安全策略。 在左侧窗格中,双击本地策略以展开它。 在左侧窗格中,单击审核策略以在右侧窗格中显示各个策略设置。 双击审核对象访问。 要审核对指定文件、文件夹和打印机的成功访问,请选中“成功”复选框。 要审核对这些对象的访问失败,请选中失败复选框。 要同时启用审核,请选中这两个复选框。 单击“确定”。 指定要审核的文件、文件夹和打印机 启用审核后,可以指定要审核的文件、文件夹和打印机。为此:

在Windows资源管理器中,找到要审核的文件或文件夹。要审核打印机,请单击“开始”,然后单击“打印机和传真”,找到打印机。 右键单击要审核的文件、文件夹或打印机,然后单击属性。 单击安全选项卡,然后单击高级。 单击审核选项卡,然后单击添加。 在“输入要选择的对象名称”框中,键入要审核其访问权限的用户或组的名称。通过单击“高级”,然后在“选择用户或组”对话框中单击“立即查找”,可以在计算机上浏览名称。 单击“确定”。 选中要审核的操作的成功或失败复选框,然后单击确定。 单击确定,然后单击确定。 服务器操作系统和Windows Vista/Windows 7的过程类似。如果您采用这种方法,您可以让C程序读取事件日志See类以查找所需的数据


注意:从vista开始,如果需要管理员从代码中读取它们,则必须提升您和UAC的权限。

确保在您的电脑上安装或启用WMI,同时确保添加对System.Management和System.Management.Instrumentation的引用。还有一个C和VB WMI脚本应用程序GUI,您可以下载该GUI来运行和测试WMI查询,也可以通过Google进行测试。因为我在国防部工作,所以我可以从这里获得一些关于网络的信息,其他信息都被屏蔽了,所以如果我没有发布某些网络链接,请原谅我

这里有一些东西可以让你开始

    ManagementScope mgtScope = new ManagementScope("\\\\ComputerName\\root\\cimv2");
    // you could also replace the username in the select with * to query all objects
    ObjectQuery objQuery = new ObjectQuery("SELECT username FROM Win32_ComputerSystem");

    ManagementObjectSearcher srcSearcher = new ManagementObjectSearcher(mgtScope, objQuery);

    ManagementObjectCollection colCollection = srcSearcher.Get();

    foreach (ManagementObject curObjCurObject in colCollection)
    {

        Console.WriteLine(curObjCurObject["username"].ToString());
    } 

  //if you want ot get the name of the machine that changed it once it gets into that  Event change the query to look like this. I just tested this locally and it does work 

    ManagementObjectSearcher mosQuery = new ManagementObjectSearcher("SELECT * FROM Win32_Process WHERE ProcessId = " + Process.GetCurrentProcess().Id.ToString());
    ManagementObjectCollection queryCollection1 = mosQuery.Get();
    foreach (ManagementObject manObject in queryCollection1)
    {
        Console.WriteLine("Name : " + manObject["name"].ToString());
        Console.WriteLine("Version : " + manObject["version"].ToString());
        Console.WriteLine("Manufacturer : " + manObject["Manufacturer"].ToString());
        Console.WriteLine("Computer Name : " + manObject["csname"].ToString());
        Console.WriteLine("Windows Directory : " + manObject["WindowsDirectory"].ToString());
    }  

我不相信操作系统会记录这些信息。提供了两种体面的方式。@J.Kommer啊,谢谢。我确信以前有人问过这个问题,但我就是找不到。我已经用FileSystemWatcher做了您想要做的事情。您可以设置某些触发器/事件来捕获编辑、添加、删除等内容。这是使用NotifyFilter@DJKRAZE:FileSystemWatcher事件不会捕获进行更改的用户或计算机的名称。我添加了EventLog类的链接和有关访问此类日志需要提升的说明,希望您不介意Joshua我发布了一个答案,但您的答案要好得多,所以我刚刚完成了它,并删除了我的伟大的答案谢谢,但有一个问题。在第2部分的步骤2中打开目录的属性时,没有安全选项卡。有人试过这个并且有安全标签吗?我需要启用一些东西吗?没关系,在@virtualblackbox之后修复了它:不,这两个编辑对我来说都很好。我总是在7点上,所以我很容易忽视需要提升,因为我知道什么时候需要提升,什么时候不需要提升。我作为一个普通的、有限的用户运行,在我的计算机上没有管理员权限,所以我习惯于在需要的时候升级。。。正如批评者希望你相信的那样,这并不经常发生。你可能想认真看看你的答案格式。我试图编辑你的一些其他答案,但你的格式一直不好。查看代码部分之前的文本。所有的斜杠是怎么回事?我引用//确保..//还要确保添加//还有一个C//
因为我在……部门工作。。。。所有的斜线是怎么回事?除此之外,您的许多答案都有错误的代码块格式,包含了应该是文本的内容。我不知道您使用的系统是否无法正确显示,但您可能需要查看一下。我会确保下次再次检查。。sorry@Bart:+1对于有趣但有建设性的评论,没有冒犯任何人的意思: