【问题标题】:How to check whether access permissions have changed for a directory in C#?如何检查C#中目录的访问权限是否已更改?
【发布时间】:2016-06-27 13:01:03
【问题描述】:

以下是我写的代码,

var prevSecInfo = Directory.GetAccessControl(path);

if (Utilities.ShowChangePermissionsWindow(path)) {

    var currSecInfo = Directory.GetAccessControl(path);    

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

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

接下来,我将显示权限窗口,它实际上是文件/文件夹属性窗口的 Security 选项卡。打开后可以更改权限。

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

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

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

【问题讨论】:

    标签: c# file-permissions


    【解决方案1】:

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

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

    很遗憾,DirectorySecurity 类型也没有提供 Equals 覆盖方法。

    有一篇 StackOverflow 文章,里面有一些现成的比较权限的解决方案:
    compare windows file (or folder) permissions

    【讨论】:

    【解决方案2】:

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

    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
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 2013-05-17
      • 2015-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多