15

我们 IT 组的生产变更实施人员的任务是审查我们组中所有各种对象的安全性,主要是确保离开我们的员工或转移到其他组的人不再有权访问我们的服务器共享、web 目录、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 的信息时出错)。

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

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

4

2 回答 2

22

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

尝试改变

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

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

那么你应该停止收到错误

于 2009-02-22T07:03:01.567 回答
1

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

还要记住,权限是在远程(服务器)机器上解析的,因此本地组(用户和管理员)成员资格可能不包括在客户端上运行的用户帐户。

在服务器上运行进程监视器(过滤到有问题的文件夹/文件)可能有助于解决失败原因的详细信息。

于 2009-02-20T15:51:30.847 回答