如何在C#中创建仅管理员拥有完全控制权限的目录
C# 实现目录仅管理员完全控制的方案
核心实现逻辑
通过操作目录的访问控制列表(ACL)完成权限配置,核心步骤为:禁用父目录权限继承、清除所有非管理员权限规则、为管理员组授予完全控制权限,可额外配置隐藏属性达到类似隐藏文件夹的效果。
前置依赖
需要引入以下命名空间:
using System.IO; using System.Security.AccessControl; using System.Security.Principal;
完整代码示例
public static void CreateProtectedDirectory(string dirPath) { // 目录不存在则创建 if (!Directory.Exists(dirPath)) { Directory.CreateDirectory(dirPath); } // 获取目录安全对象 DirectorySecurity dirAcl = Directory.GetAccessControl(dirPath); // 禁用权限继承,同时删除所有继承得到的权限 dirAcl.SetAccessRuleProtection(isProtected: true, preserveInheritance: false); // 清除所有现有显式权限 var existingRules = dirAcl.GetAccessRules(true, false, typeof(SecurityIdentifier)); foreach (FileSystemAccessRule rule in existingRules) { dirAcl.RemoveAccessRule(rule); } // 为本地管理员组添加完全控制权限,兼容多语言系统无需硬编码组名 var adminSid = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null); var adminPermission = new FileSystemAccessRule( adminSid, FileSystemRights.FullControl, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow ); dirAcl.AddAccessRule(adminPermission); // 可选:为当前登录的管理员用户添加权限,避免UAC虚拟化导致的访问异常 var currentUser = WindowsIdentity.GetCurrent(); if (currentUser.Owner != adminSid) { var currentAdminPermission = new FileSystemAccessRule( currentUser.Owner, FileSystemRights.FullControl, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow ); dirAcl.AddAccessRule(currentAdminPermission); } // 应用ACL配置到目录 Directory.SetAccessControl(dirPath, dirAcl); // 可选:设置目录为隐藏属性 var dirInfo = new DirectoryInfo(dirPath); dirInfo.Attributes |= FileAttributes.Hidden; }
注意事项
- 程序运行时必须拥有管理员权限才能修改ACL配置,建议在程序的app.manifest中配置执行级别为
requireAdministrator,避免权限不足报错。 - 若需要退而求其次为非管理员用户开放只读权限,只需额外添加Users组的只读规则即可,示例如下:
var usersSid = new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null); var usersReadPermission = new FileSystemAccessRule( usersSid, FileSystemRights.ReadAndExecute, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow ); dirAcl.AddAccessRule(usersReadPermission);
- 目录下新创建的文件和子目录会自动继承当前配置的权限,无需单独设置。
内容的提问来源于stack exchange,提问作者rlnnclt
相关产品推荐
相关产品推荐

