[英]How to check whether access permissions have changed for a directory in C#?
以下是我编写的代码,
var prevSecInfo = Directory.GetAccessControl(path);
if (Utilities.ShowChangePermissionsWindow(path)) {
var currSecInfo = Directory.GetAccessControl(path);
if (currSecInfo != prevSecInfo)
Utilities.ApplyPermissionsOnSubdirectories(path);
}
因此,目前,在显示权限窗口之前,我正在获取访问控制信息。
接下来,我将显示权限窗口,该窗口实际上是文件/文件夹属性窗口的“ 安全性”选项卡。 打开权限后即可对其进行更改。
但是,如果不进行任何更改,则我不想调用我的ApplyPermissionsOnSubdirectories()方法。 因此,我将在另一个变量中再次获取访问控制信息,并比较先前的信息和当前的信息。
但是,这不起作用。 即使没有更改权限,比较也会返回false。
如何检查给定路径的权限是否已更改?
您不能以这种方式比较两个引用类型对象的内容。
if (currSecInfo != prevSecInfo)
始终返回false,除非它们都引用同一对象。
不幸的是, DirectorySecurity
类型也没有提供Equals
重写方法。
有一篇StackOverflow文章,其中包含一些用于比较权限的现成解决方案:
比较Windows文件(或文件夹)权限
在解决上述问题时,我发现了另一种看起来不太复杂且较短的解决方案是代码条款。
DirectorySecurity securityInfoBefore = Directory.GetAccessControl(path, AccessControlSections.Access);
string aclStrBefore = securityInfoBefore.GetSecurityDescriptorSddlForm(AccessControlSections.Access).ToString();
在此, path
是文件/文件夹的绝对路径。
旨在在更改权限之前获取DirectorySecurity
对象,并以字符串形式获取SecurityDescriptorSddlForm
。
现在,您可以添加代码以更改权限。 更改权限后,添加以下代码,
DirectorySecurity securityInfoAfter = Directory.GetAccessControl(path, AccessControlSections.Access);
string aclStrAfter = securityInfoAfter.GetSecurityDescriptorSddlForm(AccessControlSections.Access).ToString();
下一步将是比较之前和之后的字符串。
if (aclStrBefore.Equals(aclStrAfter)) {
// permissions have not changed
} else {
// permissions have changed
}
到目前为止,这对我有帮助。 请随时添加到我的答案中,或根据需要对其进行更正。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.