目录权限观察者在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. 修改您想要观看的文件夹的“审核”
现在每当发生文件系统更改事件(或通过轮询)查询安全事件日志时。
查询“安全”事件日志的代码:
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