如何检查 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);
}

因此,目前,我在显示权限之前获取访问控制信息 window。

接下来,我将显示权限 window,它实际上是 file/folder 属性 window 的 安全 选项卡。打开后可以更改权限。

但是,如果不进行任何更改,我不想调用我的 ApplyPermissionsOnSubdirectories() 方法。因此,我在另一个变量中再次获取访问控制信息,并比较以前和当前的信息。

但是,这不起作用。即使没有更改权限,比较 returns false。

如何检查给定路径的权限是否已更改?

您不能以这种方式比较两个引用类型对象的内容。

if (currSecInfo != prevSecInfo) 将始终 return false,除非它们都引用同一个对象。

不幸的是,DirectorySecurity 类型也没有提供 Equals 覆盖方法。

有一篇 Whosebug 文章提供了一些现成的权限比较解决方案:
compare windows file (or folder) permissions

在处理上述问题时,我发现了另一种解决方案,它看起来不那么复杂,代码也更短。

DirectorySecurity securityInfoBefore = Directory.GetAccessControl(path, AccessControlSections.Access);
string aclStrBefore = securityInfoBefore.GetSecurityDescriptorSddlForm(AccessControlSections.Access).ToString();

这里,path是file/folder的绝对路径。

目的是在更改权限之前获取 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
}

到目前为止,这对我很有帮助。如果需要,请随时添加到我的答案或更正它。