繁体   English   中英

如何检查C#中目录的访问权限是否已更改?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM