You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#桌面应用如何过滤文件夹权限系统账户仅显示域用户账户?

过滤文件夹访问规则中的系统账户,仅保留指定域用户(C#实现)

嘿,这个需求我之前也碰到过,其实核心就是对获取到的访问规则做针对性过滤,我给你一步步说怎么实现:

核心思路

我们需要从每个访问规则里提取账户的域信息,然后做两个关键判断:

  • 账户的域是否是abc(兼容大小写差异)
  • 排除系统相关的域(比如NT AUTHORITY、BUILTIN这类自带的系统账户/组)

完整代码示例

你可以直接把这段代码整合到你的项目里,替换目标文件夹路径和列表框控件名即可:

using System;
using System.IO;
using System.Security.AccessControl;
using System.Security.Principal;
using System.Linq;

// 替换成你的目标文件夹路径
string targetFolder = @"C:\YourTargetFolder";
DirectoryInfo dirInfo = new DirectoryInfo(targetFolder);
DirectorySecurity dirSecurity = dirInfo.GetAccessControl();

// 获取所有可读格式的访问规则
AuthorizationRuleCollection accessRules = dirSecurity.GetAccessRules(true, true, typeof(NTAccount));

// 过滤出abc域的用户账户
var filteredUserRules = accessRules.Cast<FileSystemAccessRule>()
    .Where(rule => 
    {
        // 把身份引用转成NTAccount,拿到"域\用户名"的可读格式
        if (!(rule.IdentityReference is NTAccount ntAccount))
            return false;

        string fullAccountName = ntAccount.Value;
        // 拆分域和用户名,确保格式正确
        string[] accountParts = fullAccountName.Split('\\');
        if (accountParts.Length != 2)
            return false;

        string accountDomain = accountParts[0];
        // 只保留abc域,排除系统域
        return accountDomain.Equals("abc", StringComparison.OrdinalIgnoreCase)
               && !accountDomain.Equals("NT AUTHORITY", StringComparison.OrdinalIgnoreCase)
               && !accountDomain.Equals("BUILTIN", StringComparison.OrdinalIgnoreCase);
    })
    .ToList();

// 将过滤结果添加到列表框
foreach (var rule in filteredUserRules)
{
    listBox.Items.Add($"{rule.IdentityReference.Value} | 权限: {rule.FileSystemRights}");
}

关键细节说明

  1. 转换为NTAccount:IdentityReference可能是SID格式,转成NTAccount才能拿到我们熟悉的"域\用户名"字符串,方便后续拆分判断。
  2. 域的大小写兼容:用StringComparison.OrdinalIgnoreCase可以处理域名称大小写不一致的情况(比如ABC和abc都能匹配)。
  3. 系统域排除逻辑:
    • NT AUTHORITY对应你提到的NT AUTHORITY\System这类系统账户(注意这里是有空格的,不是NTAuthority)
    • BUILTIN是Windows内置组(比如Administrators),如果不需要显示这类组可以保留排除,反之删掉这一行即可。

注意事项

  • 权限问题:读取某些系统文件夹的访问规则需要管理员权限,所以你的应用可能需要以管理员身份运行才能正常获取所有规则。
  • 特殊账户处理:如果遇到格式不是"域\用户名"的账户(比如本地账户),代码里的Split('\\')判断会直接排除,刚好符合我们只保留域账户的需求。

内容的提问来源于stack exchange,提问作者trav1514

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:16:30