为什么我应该将“文件名”传递给“SetAccessControl”方法

本文关键字:文件名 SetAccessControl 方法 我应该 为什么 | 更新日期: 2023-09-27 18:36:42

我要设置对文件的完全访问权限(fileName)。我找到了一个代码示例:

var security = IO.File.GetAccessControl(fileName);
security.AddAccessRule(new Security.AccessControl.FileSystemAccessRule(
    new SecurityIdentifier(WellKnownSidType.WorldSid, null),
    Security.AccessControl.FileSystemRights.FullControl,
    Security.AccessControl.AccessControlType.Allow));
IO.File.SetAccessControl(fileName, security);

它运行良好,但我不明白为什么要将filename传递给SetAccessControl方法(我已经在第一行中提供了它)?我对代码进行了更改,并看到这也有效:

var security = IO.File.GetAccessControl(anotherFileName);
security.AddAccessRule(new Security.AccessControl.FileSystemAccessRule(
    new SecurityIdentifier(WellKnownSidType.WorldSid, null),
    Security.AccessControl.FileSystemRights.FullControl,
    Security.AccessControl.AccessControlType.Allow));
IO.File.SetAccessControl(fileName, security);

那么anotherFileName在这里有什么用呢?

为什么我应该将“文件名”传递给“SetAccessControl”方法

GetAccessControl将获得FileSecurity

从 MSDN:

表示文件的访问控制和审核安全性。[...]此类将访问和审核权限表示为一组规则。

FileSecurity不依赖于特定文件,因此您可以对多个文件使用一个FileSecurity来设置相同的访问和审核权限。

这就是您需要指定文件名的原因。

另一种方法是使用 FileInfo 类。

var fileInfo = new FileInfo(filename);
var security = fileInfo.GetAccessControl();
// [...]
fileInfo.SetAccessControl(security);

MSDN 的构造函数:

FileSecurity()

将创建一个空的FileSecurity对象。

FileSecurity(String, AccessControlSections)

使用AccessControlSections枚举的指定值从指定文件创建空FileSecurity对象。

安全信息 (ACL) 不绑定到对象,因此您可以获取一个文件的当前值并应用于任何其他文件。

这与string name = person.Name完全相同 - name不绑定于person,只是与一个的某些属性相关联。