将权限从文件复制到文件

时间:2016-03-29 14:24:49

标签: c# .net windows

我需要替换文件的内容,而不需要更改它的权限。我是通过读取文件,删除它并编写一个包含更新内容的新文件来实现的。

我有以下内容:

static void Main()
{
    var file = new FileInfo(@"C:\temp\test.txt");

    var file1Security = file.GetAccessControl(AccessControlSections.All);

    string s;

    using (var stream = file.OpenText())
    {
        s = stream.ReadToEnd();
    }

    s += "\n" + DateTime.Now;

    file.Delete();

    using (var stream = file.OpenWrite())
    {
        using (var writer = new StreamWriter(stream))
        {
            writer.Write(s);
        }
    }

    file.SetAccessControl(file1Security);
}

但是,这不会将用户的权限复制到新文件。

如何替换文件内容并保留用户的权限?

3 个答案:

答案 0 :(得分:3)

根据this documentation,您无法从一个文件中复制FileSecurity并将其应用于另一个文件。 (显然,他们已经记录了它。我也会尝试过。)

您必须创建一个新的FileSecurity对象,将访问控制列表从旧对象复制到新对象,然后将新的对象应用于该文件。

void ApplySecurityFromOneFileToAnother(FileInfo source, FileInfo destination)
{
    var sourceSecurityDescriptor = source.GetAccessControl().GetSecurityDescriptorBinaryForm();
    var targetSecurity = new FileSecurity();
    targetSecurity.SetSecurityDescriptorBinaryForm(sourceSecurityDescriptor);
    destination.SetAccessControl(targetSecurity);
}

由于你要替换文件,你必须打破它,当然 - 先从旧文件中获取安全性,然后在重写后将其应用到同一个文件中。

答案 1 :(得分:0)

FileSecurity file1Security = file.GetAccessControl(AccessControlSections.All);
file1Security.SetAccessRuleProtection(true, true);

尝试替换" var"将第一行代码复制到此处,并添加下面的行。最后一部分适用访问规则。

答案 2 :(得分:0)

尝试在开头使用DirectoryInfo:

DirectoryInfo dInfo = new DirectoryInfo(@"C:\temp\test.txt");
DirectorySecurity dSecurity = dInfo.GetAccessControl();

并用:

更改最后一行
dInfo.SetAccessControl(dSecurity);