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}"); }
关键细节说明
- 转换为NTAccount:
IdentityReference可能是SID格式,转成NTAccount才能拿到我们熟悉的"域\用户名"字符串,方便后续拆分判断。 - 域的大小写兼容:用
StringComparison.OrdinalIgnoreCase可以处理域名称大小写不一致的情况(比如ABC和abc都能匹配)。 - 系统域排除逻辑:
NT AUTHORITY对应你提到的NT AUTHORITY\System这类系统账户(注意这里是有空格的,不是NTAuthority)BUILTIN是Windows内置组(比如Administrators),如果不需要显示这类组可以保留排除,反之删掉这一行即可。
注意事项
- 权限问题:读取某些系统文件夹的访问规则需要管理员权限,所以你的应用可能需要以管理员身份运行才能正常获取所有规则。
- 特殊账户处理:如果遇到格式不是"域\用户名"的账户(比如本地账户),代码里的
Split('\\')判断会直接排除,刚好符合我们只保留域账户的需求。
内容的提问来源于stack exchange,提问作者trav1514
相关产品推荐
相关产品推荐

