目录权限观察者在C#

我创建了监视目录(例如serversharefolderXYZ )的程序,用于更改事件(如创建,删除,重命名和权限更改)。 如果有任何更改,我也会收到通知,但我无法获得确切的详细信息。

例如,我已经从文件夹属性(属性 - >安全 - >编辑 - >添加新用户或组或更改用户和组的权限)更改了上述目录的权限。 如果文件系统观察者发生了某些变化,则会发出通知,但我无法获取其他详细信息

  • 哪些用户权限已更改?
  • 谁更改了用户权限?
  • 如果添加了新组(需要在添加新组时添加组中的所有用户)?
  • 如果有任何新用户被添加到组中,并且添加了哪些用户并需要添加用户详细信息?
  • 如果有任何用户或组被删除而不是删除组或用户的详细信息?
  • 如果为用户添加或更改任何权限,而不是增加或更改哪个权限?
  • 如果组中的任何权限都改变了,那么权限更改了?
  • 示例方案:

    行动:在上午11点,管理员将用户A添加到受训人员(现有组)

    预期结果:
    访问serversharefolderXYZ更改: User A现在具有读取访问权限,由Admin在上午11点给出,因为他现在是具有读取权限的受训人员的成员。

    希望的问题很明显。 我做了很多搜索,找不到解决方案。 请让我知道是否有任何可用的API或服务或可用的替代品?

    -谢谢


    获取所需信息的方法是使用Windows安全审核,尤其是使用Windows安全审核。 因为你想知道谁做出了改变,而不仅仅是改变了什么。

    以下代码(和设置)产生如下输出:

    11-07-2011 17:43:10:'Fujitsu Grynn'在文件'C: Users Grynn Documents ExcelTools test.txt'上更改了安全描述符

    “d:AI(A ;; 0x1200a9 ;;; BU)(A; ID; FA ;;; S-1-5-21-559386011-2179397067-1987725642-1000)(A; ID; FA ;;; SY) (A; ID; FA ;;; BA)”

    “d:荒井(A; ID; FA ;;; S-1-5-21-559386011-2179397067-1987725642-1000)(A; ID; FA ;;; SY)(A; ID; FA ;;; BA )”
    使用'C: Windows explorer.exe'

    12-07-2011 17:55:10:'Fujitsu Grynn'在文件'C: Users Grynn Documents ExcelTools test.txt'上更改了安全描述符

    “d:AI(A; ID; FA ;;; S-1-5-21-559386011-2179397067-1987725642-1000)(A; ID; FA ;;; SY)(A; ID; FA ;;; BA )”

    “d:荒井(d ;; FA ;;; S-1-5-21-559386011-2179397067-1987725642-1001)(A; ID; FA ;;; S-1-5-21-559386011-2179397067-1987725642 -1000)(A; ID; FA ;;; SY)(A; ID; FA ;;; BA)”
    使用'C: Windows explorer.exe'

    开启审计有两个步骤:

    1. 使用gpedit.msc打开“审核对象访问” 组策略

    2. 修改您想要观看的文件夹的“审核” 示例文件夹“ExcelTools”的审核条目

    现在每当发生文件系统更改事件(或通过轮询)查询安全事件日志时。

    查询“安全”事件日志的代码:

    var props = new EventLogPropertySelector(new string[] { 
                    "Event/System/TimeCreated/@SystemTime",
                    "Event/EventData/Data[@Name='SubjectDomainName']",
                    "Event/EventData/Data[@Name='SubjectUserName']",
                    "Event/EventData/Data[@Name='ObjectName']",
                    "Event/EventData/Data[@Name='OldSd']",
                    "Event/EventData/Data[@Name='NewSd']",
                    "Event/EventData/Data[@Name='ProcessName']"  });
    
    using (var session = new System.Diagnostics.Eventing.Reader.EventLogSession())
    {
        //4670 == Permissions on an object were changed
        var q = new EventLogQuery("Security", PathType.LogName, "*[System[(EventID=4670)]]");
        q.Session = session;
    
        EventLogReader rdr = new EventLogReader(q);
    
        for (EventRecord eventInstance = rdr.ReadEvent();
                null != eventInstance; eventInstance = rdr.ReadEvent())
        {
            var elr = ((EventLogRecord)eventInstance);
            Console.WriteLine(
                "{0}: '{1}{2}' changed security descriptor on file '{3}' from n'{4}' nto n'{5}' nusing '{6}'n----n", 
                elr.GetPropertyValues(props).ToArray());
        }
    }
    

    从我所了解/正在阅读的文件中, FileSystemWatcher只能告诉您仅受更改类型影响的文件。

    一种方法是让您维护您感兴趣的文件属性的缓存,在存在通知更改的事件时,查询缓存以获取所做的更改并根据需要进行更新。

    链接地址: http://www.djcxy.com/p/8307.html

    上一篇: Directory Permission Watcher in c#

    下一篇: Is there a container facade in Boost?