当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用C#获取服务器和映射驱动器的ACL列表》经验,为你挑选了1个好方法。

我们IT团队的生产变更实施人员的任务是审查我们集团中所有各种对象的安全性,主要是为了确保离开我们的员工或已转移到其他团队的人员不再能够访问我们的服务器份额我们最近完成了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中检查远程文件夹中的读取attrib?(如果我传入\ server\path,则获取\ server\path的信息时出错).

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

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



1> uzbones..:

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

尝试改变

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

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

那么你应该停止得到错误


再一次,我发现问题和答案非常有用.+1
推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有