2009-02-20 87 views
12

为我们的IT团队的生产变化实施者一直负责审查安全都在我们组的各种对象的,主要是为了确保人已经离开谁我们的雇员或转移到其他团体不再有权访问我们的服务器共享,网页目录,sql数据库等等。我们最近完成了SQL部分,并且我们有一个可重复使用的脚本,可以每年运行(或以任何频率我们想出了)。它运行得非常好,我们用几分钟的时间在10台左右的服务器上审计了20个数据库。用C#获取服务器的ACL列表和映射驱动器

现在,为服务器的东西。我有一个使用.NET 2.0在C#中编写的应用程序,它将以递归方式扫描目录列表并将ACL转储到文本文件。这很好。在本地机器上。 UNC和Mapped路径不起作用,我收到以下异常消息:该进程不具有此操作所需的“SeSecurityPrivilege”权限。

在此行中:

DirectorySecurity DirSec = di.GetAccessControl(AccessControlSections.All); 

其中di是从一个DirectoryInfo []数组列举了DirectoryInfo对象。

我们不太可能会是能够被授予了SeSecurityPrivilege特权。不过,我认为这不是必要的。我可以打开文件夹并右键单击属性,然后单击安全选项卡并在GUI中查看它。我也能够以编程方式访问它。

我如何可以改变这部分代码来获取目标文件夹的权限有什么想法?

private void CheckSecurity(DirectoryInfo[] DIArray) 
{ 
    foreach (DirectoryInfo di in DIArray) 
    { 
     DirectorySecurity DirSec = di.GetAccessControl(AccessControlSections.All); 
     string sAccessInfo = string.Empty; 

     foreach (FileSystemAccessRule FSAR in DirSec.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount))) 
     { 
      sAccessInfo += GetAceInformation(FSAR); 
     } 

     if (sAccessInfo != string.Empty) 
     { 
      // Write info to text file 
     } 
    } 
} 

private string GetAceInformation(FileSystemAccessRule ace) 
{ 
    StringBuilder info = new StringBuilder(); 
    string line = string.Format("Account: {0}", ace.IdentityReference.Value); 
    info.AppendLine(line); 
    line = string.Format("Type: {0}", ace.AccessControlType); 
    info.AppendLine(line); 
    line = string.Format("Rights: {0}", ace.FileSystemRights); 
    info.AppendLine(line); 
    line = string.Format("Inherited ACE: {0}", ace.IsInherited); 
    info.AppendLine(line); 
    return info.ToString(); 
} 

编辑: 我将如何检查远程文件夹的ACL读ATTRIB失败时上获得“GetAccessControl()”方法的根文件夹? (如果我传递\ server \ path,它在获取\ server \ path的信息时出错)。

用户帐户是域帐户,我有权读取文件结构。我可以从文件夹/文件的属性查看安全性。

我将检查过程监控器,但我不知道,我将能够在服务器上运行它(我不是有问题的服务器(一个或多个)上的管理员)。

+1

这个问题/代码示例是真的非常有帮助。我使用此代码为我们的内部系统之一构建文件权限监视器。 – 2009-03-05 00:17:06

回答

17

你获得这个错误,因为“审核”选项卡中,虽然我确信你真的想在屏幕上访问是“权限”选项卡上的数据。 SeSecurityPrivilege控制对SACL的访问。

尝试改变

DirectorySecurity DirSec = di.GetAccessControl(AccessControlSections.All); 

DirectorySecurity DirSec = di.GetAccessControl(AccessControlSections.Access); 

,那么你应该停止获取错误

1

检查远程文件夹是否授予在ACL中运行代码读取属性的用户。

还记得那权限的远程(服务器)的机器解决,所以本地组(用户和管理员)的成员可能不包括在客户端上运行的用户帐户。

运行在服务器上的Process Monitor(过滤到相关文件夹/文件)可能有助于解析其失败原因的详细信息。

+0

在编辑中参见上面的注释。 – bdwakefield 2009-02-20 16:10:58

+0

嗯...没有管理员权限,你将会受到奇怪权限的支配和/或发现调试非常困难。 – Richard 2009-02-20 17:23:12