以下是我写的代码,
var prevSecInfo = Directory.GetAccessControl(path);
if (Utilities.ShowChangePermissionsWindow(path)) {
var currSecInfo = Directory.GetAccessControl(path);
if (currSecInfo != prevSecInfo)
Utilities.ApplyPermissionsOnSubdirectories(path);
}
所以,目前,我在显示权限窗口之前获取了访问控制信息。
接下来,我正在显示权限窗口,该窗口实际上是文件/文件夹属性窗口的安全性选项卡。一旦打开,就可以对权限进行更改。
但是,如果没有进行任何更改,我不想调用我的 ApplyPermissionsOnSubdirectories()方法。因此,我在另一个变量中再次获取访问控制信息,并比较前一个和当前信息。
但是,这不起作用。即使没有更改权限,比较也会返回false。
如何检查给定路径的权限是否已更改?
答案 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
}
到目前为止,这对我有所帮助。如果需要,请随时添加我的答案或更正。