c#中的目录权限监视器

时间:2011-07-04 07:34:09

标签: c#

我创建了一个程序,用于监视已更改事件的目录(例如\\server\share\folderXYZ)(如创建,删除,重命名和权限更改)。如果有任何改变,我也会收到通知,但我无法获得确切的细节。

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

  1. 哪些用户权限已更改?
  2. 谁更改了用户权限?
  3. 如果添加了任何新组(如果添加了新组,则需要获取组中的所有用户)?
  4. 如果有任何新用户添加到群组中,谁添加了并且需要添加用户详细信息?
  5. 是否删除了任何用户或组,而不是删除了组或用户详细信息?
  6. 是否为用户添加或更改了添加或更改权限的权限?
  7. 如果组的更改权限已更改为权限更改?
  8. 示例场景:

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

    预期结果:
    访问\\server\share\folderXYZ已更改:User A现在具有读取权限,由管理员在上午11点提供,因为他现在是具有读取权限的受训人员。

    希望问题很清楚。我做了很多搜索,找不到解决方案。如果有任何可用的API或服务或任何替代方案,请告诉我们?

    -Thanks

2 个答案:

答案 0 :(得分:2)

获取所需信息的方法是使用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启用“审核对象访问” Group Policy

2. 修改您要观看的文件夹的“审核” Auditing Entry for an example folder '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());
    }
}

答案 1 :(得分:1)

根据我所知道/正在阅读的内容,FileSystemWatcher只能告诉您受影响的文件以及更改类型。

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