如何检查 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
}
到目前为止,这对我很有帮助。如果需要,请随时添加到我的答案或更正它。
以下是我写的代码,
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
}
到目前为止,这对我很有帮助。如果需要,请随时添加到我的答案或更正它。