拒绝访问文件夹

拒绝访问文件夹

我以前遇到过这个问题,但我总是可以通过转到“安全”选项卡,在“属性”中,然后“高级”,最后将管理员添加到访问权限列表中来修复它。但在这种情况下,我实际上有一个 Windows 窗体应用程序,在其中,我使用以下代码:

FileStream config = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite); 

在 C# 中。

这一切在 Visual Studio 中运行良好,但是一旦我构建了项目、在我的计算机上安装了该程序并运行它,它就会创建该文件夹。

由于某种原因,我无法以通常的方式获得权限。它只是给我一条消息“您无权查看或编辑此对象的权限设置。”我不知道为什么。有人能告诉我如何获得权限,或者直接删除该文件夹吗?我的程序出了什么问题,导致这种情况发生?

答案1

假设您拥有必要的管理员权限,您可以随时获得它的所有权。获得所有权后,您必须关闭属性窗口,然后当您返回时,您可以更改权限。我无法谈论您代码中的更改,但我敢打赌您没有该文件夹的“所有权”。

答案2

您还需要致电SetAccessControl应用更改。

ds = di.GetAccessControl();
ds.AddAccessRule(fsar);
di.SetAccessControl(ds); // nothing happens until you do this

MSDN 上的示例似乎非常缺乏细节,正如讨论的那样这里。我修改了本文中的代码,得到了以下表现良好的代码:

static bool SetAcl()
{
    FileSystemRights Rights = (FileSystemRights)0;
    Rights = FileSystemRights.FullControl;

    // *** Add Access Rule to the actual directory itself
    FileSystemAccessRule AccessRule = new FileSystemAccessRule("Users", Rights,
                                InheritanceFlags.None,
                                PropagationFlags.NoPropagateInherit,
                                AccessControlType.Allow);

    DirectoryInfo Info = new DirectoryInfo(destinationDirectory);
    DirectorySecurity Security = Info.GetAccessControl(AccessControlSections.Access);

    bool Result = false;
    Security.ModifyAccessRule(AccessControlModification.Set, AccessRule, out Result);

    if (!Result)
        return false;

    // *** Always allow objects to inherit on a directory
    InheritanceFlags iFlags = InheritanceFlags.ObjectInherit;
    iFlags = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit;

    // *** Add Access rule for the inheritance
    AccessRule = new FileSystemAccessRule("Users", Rights,
                                iFlags,
                                PropagationFlags.InheritOnly,
                                AccessControlType.Allow);
    Result = false;
    Security.ModifyAccessRule(AccessControlModification.Add, AccessRule, out Result);

    if (!Result)
        return false;

    Info.SetAccessControl(Security);

    return true;
}

相关内容