删除文件权限,然后重新添加

dn

新成员
已加入
2019年7月13日
留言内容
4
编程经验
1-3
大家好,


这可能是一个奇怪的请求,但这是我要尝试的操作,我想删除用户级别帐户的读取权限,然后在我的应用程序关闭时重新添加该权限,除了在以下情况下抛出异常外,其他所有功能都可以正常工作尝试重新添加权限,似乎我删除了自己的腿,可以这么说,当我删除read属性时。现在的事情是,我的控制台应用程序正在使用管理员权限运行,而管理员仍然对该文件拥有完全权限。

我的代码删除read属性:

C#:
WindowsIdentity currentUser = WindowsIdentity.GetCurrent();

FileSecurity aclplus =新的FileSecurity();

aclplus.AddAccessRule(new FileSystemAccessRule(currentUser.User, FileSystemRights.Read, AccessControlType.Deny));

File.SetAccessControl(passwordfile,aclplus);


然后,如果我右键单击该文件,则会看到最上面的acl是登录的用户(即Devicename \ Bob)拒绝读取访问,下面是Devicename \ Administrators,并且具有完全控制权限。

然后,当我尝试添加回读访问权限时:


C#:
FileSecurity aclrm = new FileSecurity();

aclrm.RemoveAccessRule(new FileSystemAccessRule(currentUser.User, FileSystemRights.Read, AccessControlType.Deny));

File.SetAccessControl(passwordfile, aclrm);

我得到一个"拒绝访问路径"错误。看起来它试图以具有提升权限的Bob身份而不是Administrator身份运行Bob,这显然是行不通的,是否有办法解决?
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,501
地点
悉尼,澳大利亚
编程经验
10+
如果添加一条规则而不是删除一条拒绝规则,会发生什么?

FileSystemAccessRule构造函数也会在String中使用一个用户名,但是我希望在运行时会提示您输入密码。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,497
地点
弗吉尼亚州切萨皮克
编程经验
10+
这与您的问题是相切的,但是听起来您需要做的就是在程序运行时阻止对文件的访问,仅使用文件锁而不是使用ACL。它还具有故障保护功能,即使您的程序崩溃或电源故障,也将释放该锁,而不必返回并旋转ACL作为恢复步骤。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,923
地点
英国
编程经验
10+
为什么不使用文件流锁定呢? -- FileStream.Lock(Int64,Int64)方法(System.IO) 并解锁- FileStream.Unlock(Int64,Int64)方法(System.IO)
还是文件流文件共享? -- FileStream fileStr = new FileStream(Value, FileMode.Open, FileAccess.Read, FileShare.None);

我相信在您的示例中,如果您删除此类权利,则您可能/威力 需要使用提升的权限或管理员权限将该权限添加回去。为了做到这一点,您的应用程序将需要一个app.manifest文件来提升您的应用程序的权限,以授予其授予访问权限的权限。麻烦的是,您的应用程序随后将以提升的权限运行。您不需要的东西,除非您的应用程序一直都需要它。我个人倾向于考虑您所拥有的其他选择。
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,028
地点
挪威
编程经验
10+
然后,当我尝试添加回读访问权限时:
我得到一个"拒绝访问路径" error.
这对我来说效果很好,不确定为什么不适合您。使用继承和显式权限以及文件的不同所有者进行测试。
FileSecurity aclplus =新的FileSecurity();
...
File.SetAccessControl(passwordfile,aclplus);
通常,这不是一个好主意,这样做是从一个空规则集开始,并且在应用所有现有的显式规则时将其删除,仅保留继承的规则集。您应该使用File.GetAccessControl来获取现有的FileSecurity并进行修改。虽然这不会影响我的测试,但无论哪种方式都成功。
如果添加一条规则而不是删除一条拒绝规则,会发生什么?
可以同时设置allow和deny,包括作为单个用户的明确规则,deny将优先。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,497
地点
弗吉尼亚州切萨皮克
编程经验
10+
read permission
FileSystemRights.Read实际上不仅仅是读取权限:
131209将打开或复制文件夹或文件的权限指定为只读。该权利包括 读数据 对, 读 ExtendedAttributes 对, 读 Attributes 对,然后 阅读权限 对。

这对我来说效果很好,不确定为什么不适合您。使用继承和显式权限以及文件的不同所有者进行测试。
我想知道我们的OP是否意外擦除了所有可能授予他访问权限的继承ACE。或者,如果OP将他的文件存储在默认情况下不会授予他权限的位置。
 

dn

新成员
已加入
2019年7月13日
留言内容
4
编程经验
1-3
谢谢大家的答复。我已经开始工作了。我同意文件锁定可能更好,因此可以改用它,但是对于解决方案,似乎我确实已经丢失了对该文件的所有继承权限,因此在第一次尝试后我无法更改acl,我现在要做的是在删除读取权限的同时,我还添加了FileSystemRights.Modify权限。

这是一个丑陋的解决方案,我会根据您对修改GetAccessControl或文件锁的建议进行正确处理。但是现在我正在工作!
 
最佳 底部