为什么我应该将`filename`传递给`SetAccessControl`方法?

时间:2013-10-24 16:42:20

标签: c# security file-access

我要为文件(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在这里的用途是什么?

2 个答案:

答案 0 :(得分:2)

GetAccessControl将获得FileSecurity

来自MSDN:

  

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

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

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

另一种方法是使用FileInfo类。

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

来自MSDN的constructors

FileSecurity()

将创建一个空的FileSecurity对象。

FileSecurity(String, AccessControlSections)

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

答案 1 :(得分:0)

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

这与string name = person.Name完全相同 - nameperson无关,只是一个属性。