DirectorySecurity & FileSystemAccessRule

本文介绍如何通过编程方式设置文件夹的系统权限,包括允许和拒绝访问,并解释了拒绝权限为何优先于允许权限的原因。文中提供了具体的.NET代码示例,演示如何根据需求移除并添加相应的访问规则。

http://developers.de/blogs/damir_dobric/archive/2007/06/18/directory-security-and-access-rules.aspx

 

 

设置文件夹权限时遇到的问题:

1. 文件夹读写被拒绝但是文件还是可以读写: InheritanceFlags的使用, 见链接

2. 拒绝比允许优先级高, 所以要remove掉之前的权限, 否则, 拒绝->允许 之后还是不能访问

3. 权限被拒绝后, 虽然文件夹还在, 但是*注释掉*的部分,判断是不是存在的地方, 逻辑就不对了

 

        public void SetDirSystemRight(DirectoryInfo dInfo, bool isAllow)

        {

            //if (!dInfo.Exists)

            //    return;

 

            DirectorySecurity ds = dInfo.GetAccessControl();

            string acctName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;

            NTAccount acct = new NTAccount(acctName);

            FileSystemAccessRule allowRule = new FileSystemAccessRule(acct,

                FileSystemRights.FullControl,

                InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,

                PropagationFlags.None, AccessControlType.Allow);

 

 

            FileSystemAccessRule denyRule = new FileSystemAccessRule(acct,

                FileSystemRights.FullControl,

                InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,

                PropagationFlags.None, AccessControlType.Deny);

 

            if (isAllow)

            {

                ds.RemoveAccessRuleAll(denyRule);

                ds.AddAccessRule(allowRule);

            }

            else

            {

                ds.RemoveAccessRuleAll(allowRule);

                ds.AddAccessRule(denyRule);

            }

 

            dInfo.SetAccessControl(ds);

 

        }

 

//为安装目录添加完全控制权限 DirectoryInfo dir = new DirectoryInfo(installFolder); System.Security.AccessControl.DirectorySecurity directorySecurity = dir.GetAccessControl(System.Security.AccessControl.AccessControlSections.All); InheritanceFlags inherits = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit; FileSystemAccessRule everyoneFileSystemAccessRule = new FileSystemAccessRule("Everyone", FileSystemRights.FullControl, inherits, PropagationFlags.None, AccessControlType.Allow); FileSystemAccessRule usersFileSystemAccessRule = new FileSystemAccessRule("Users", FileSystemRights.FullControl, inherits, PropagationFlags.None, AccessControlType.Allow); bool isModified = false; directorySecurity.ModifyAccessRule(AccessControlModification.Add, everyoneFileSystemAccessRule, out isModified); directorySecurity.ModifyAccessRule(AccessControlModification.Add, usersFileSystemAccessRule, out isModified); dir.SetAccessControl(directorySecurity); //创建注册表,并添加完全控制权限 string regpath = "CLSID\\{0469ACF7-F6A7-4888-B17C-FA2A379C44F9}"; RegistryKey classRoot64 = RegistryKey.OpenBaseKey(RegistryHive.ClassesRoot, RegistryView.Registry64); RegistryKey uaes = classRoot64.OpenSubKey(regpath, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.FullControl); if (uaes == null) { uaes = classRoot64.CreateSubKey(regpath, RegistryKeyPermissionCheck.ReadWriteSubTree); } InheritanceFlags inheritsRegistry = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit; RegistrySecurity registrySecurity = new RegistrySecurity(); RegistryAccessRule everyoneRegistryAccessRule = new RegistryAccessRule("Everyone", RegistryRights.FullControl, inheritsRegistry, PropagationFlags.None, AccessControlType.Allow); RegistryAccessRule usersRegistryAccessRule = new RegistryAccessRule("Users", RegistryRights.FullControl, inheritsRegistry, PropagationFlags.None, AccessControlType.Allow); registrySecurity.ModifyAccessRule(AccessControlModification.Add, everyoneRegistryAccessRule, out isModified); registrySecurity.ModifyAccessRule(AccessControlModification.Add, usersRegistryAccessRule, out isModified); uaes.SetAccessControl(registrySecurity); 将其修改为C++实现
最新发布
07-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值