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

时间:2016-06-22 04:11:44

标签: c# file-permissions

以下是我写的代码,

var prevSecInfo = Directory.GetAccessControl(path);

if (Utilities.ShowChangePermissionsWindow(path)) {

    var currSecInfo = Directory.GetAccessControl(path);    

    if (currSecInfo != prevSecInfo)
        Utilities.ApplyPermissionsOnSubdirectories(path);
}

所以,目前,我在显示权限窗口之前获取了访问控制信息。

接下来,我正在显示权限窗口,该窗口实际上是文件/文件夹属性窗口的安全性选项卡。一旦打开,就可以对权限进行更改。

Properties window with Security tab selected

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

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

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

2 个答案:

答案 0 :(得分:1)

您无法通过这种方式比较两个引用类型对象的内容。

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

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

有一篇StackOverflow文章,其中包含一些用于比较权限的现成解决方案:
compare windows file (or folder) permissions

答案 1 :(得分:0)

在解决上述问题时,我发现另一个解决方案看起来不那么复杂,而且代码条款更短。

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
}

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