我创建了一个程序,用于监视已更改事件的目录(例如\\server\share\folderXYZ
)(如创建,删除,重命名和权限更改)。如果有任何改变,我也会收到通知,但我无法获得确切的细节。
例如,我已从文件夹属性更改了上述目录的权限(属性 - >安全性 - >编辑 - >添加新用户或组或更改用户和组的权限)。如果发生了变化,文件系统观察者会发出通知,但我无法获得其他详细信息,如:
示例场景:
行动:上午11点,管理员将用户A添加到受训人员(现有组)
预期结果:
访问\\server\share\folderXYZ
已更改:User A
现在具有读取权限,由管理员在上午11点提供,因为他现在是具有读取权限的受训人员。
希望问题很清楚。我做了很多搜索,找不到解决方案。如果有任何可用的API或服务或任何替代方案,请告诉我们?
-Thanks
答案 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启用“审核对象访问”
2. 修改您要观看的文件夹的“审核”
现在,只要发生文件系统更改事件(或通过轮询),就会查询安全事件日志。
查询“安全”事件日志的代码:
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
只能告诉您受影响的文件以及更改类型。
一种方法是维护您感兴趣的文件属性的缓存,在存在通知更改的事件时,查询缓存以获取所做的更改并根据需要进行更新。