【发布时间】:2014-03-14 08:09:18
【问题描述】:
我正忙于一个项目,您可以在其中从门户(ASP.NET 网站)管理共享驱动器的文件夹权限。有没有什么快速的方法可以在文件夹结构中找到用户的特定权限?我在文件服务器上运行了一个 C#.NET 服务。
这是我尝试归档的内容:
文件夹结构:
RootFolder -> TestUser 具有特殊权限,因此用户可以导航到 Folder1
-> 文件夹 1 --> TestUser 已读取(本地)
-> 文件夹 1.1 --> TestUser 已读取(继承)
-> 文件夹 1.1.1 --> TestUser 已读取(本地)
现在我从文件夹 1 中删除了 TestUser,但是当发生这种情况时,我需要知道 TestUser 是否对结构中某处的文件夹具有权限,如果是这种情况,我需要为文件夹 1 和文件夹 1.1 提供特殊权限,以便用户可以导航到文件夹 1.1.1。
我在数据库中拥有完整的文件夹结构和权限,但只有读/写权限而不是特殊权限(授予用户查看文件夹的权限,以便他/她可以导航到具有读/写权限的文件夹) .现在,如果我可以在文件夹结构中进行快速搜索,那就太好了,看看用户是否有一些权限,这样我就可以为用户清理/添加特殊权限(这样用户就可以导航到他/她读过的所有文件夹/写权限)。
我尝试使用 Directory.GetDirectories(fullPath) 遍历文件夹结构 然后为每个目录使用 dir.GetAccessRules() 方法,但是对于大文件夹结构(10.000 个文件夹)来说,这非常慢。
我希望问题很清楚,任何建议都将不胜感激!
【问题讨论】:
-
首先,在 .net 中执行此操作会产生巨大的开销。当你得到访问规则时,你为 targetType 提供什么类型?如果您不使用 SecurityIdentifier,我建议您这样做。使用 NTAccount 作为 targetType 会带来耗时的名称解析(SID 到帐户名称)。其次,你有没有尝试过多线程?第三,维护适当的配置最好只授予共享的第一级目录级别的各种权限,并从此时起使用完全继承。任何子文件夹在 ACL 中都没有任何新的 ACE。
-
请不要在问题标题中包含有关所用语言的信息,除非没有它就没有意义。标记用于此目的。
-
@AcidJunkie 我使用以下代码获取访问规则: DirectorySecurity accessControlList = Directory.GetAccessControl(FullPath); AuthorizationRuleCollection accessRules = accessControlList.GetAccessRules(true, false, typeof(System.Security.Principal.NTAccount));
-
好的。然后在
NTAccount和SecurityIdentifier之间进行性能比较。使用 SecurityIdentifier 时,您首先获得所需用户的 SID 并在 ACL 中搜索它 -
@AcidJunkie 好的,我会尝试并让您知道结果,感谢您的响应!:) 顺便说一下,正在运行的服务已经是多线程的。还有一个 FileSystemWatcher 正在运行以跟踪更改。我不能使用完整的继承,因为我不能冒险让用户看到他们不应该看到的文件夹(项目被公司使用,普通用户不会看到管理目录)。
标签: c# .net directory folder-permissions