使用C#获取服务器和映射驱动器的ACL列表

时间:2009-02-20 15:40:08

标签: c# .net security permissions security-roles

我们IT团队的生产变更实施人员的任务是审查我们小组中所有各种对象的安全性,主要是为了确保离开我们的员工或已转移到其他组的人员无法再访问我们的服务器共享,网页目录,SQL数据库等等。我们最近完成了SQL部分,我们有一个可重复使用的脚本,可以每年运行(或者我们提出的任何频率)。它工作得很好,我们在10分钟左右的服务器上审核了20个数据库,只需几分钟。

现在,对于服务器的东西。我有一个使用.NET 2.0在C#中编写的应用程序,它将递归扫描目录列表并将ACL转储到文本文件中。这很好用。在本地机器上。 UNC和映射路径不起作用,我收到以下异常消息:该进程不具备此操作所需的“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();
}

编辑: 当获取根文件夹的“GetAccessControl()”方法失败时,如何在ACL中检查远程文件夹中的读取属性? (如果我传入\ server \ path,则在获取\ server \ path的信息时出错。

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

我将检查进程监视器,但我不确定我是否能够在服务器上运行它(我不是服务器上的管理员)。

2 个答案:

答案 0 :(得分:19)

由于“审核”标签,您收到错误,但我很确定您真正要在屏幕上访问的是“权限”标签上的数据。 SeSecurityPrivilege控制对SACL的访问。

尝试更改

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

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

然后你应该停止收到错误

答案 1 :(得分:1)

检查远程文件夹是否授予用户在ACL中运行代码Read Attributes。

另请记住,远程(服务器)计算机上的权限已得到解析,因此本地组(用户和管理员)成员身份可能不包括客户端上运行的用户帐户。

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