【问题标题】:C# - How to grant access only to current user and restrict access to othersC# - 如何仅授予当前用户访问权限并限制其他用户访问
【发布时间】:2016-09-13 23:07:41
【问题描述】:

我希望应用程序创建一个文件夹并限制当前和管理员以外的用户访问它。 由于下面的代码,虽然当前用户也失去了访问权限并且无法删除该文件夹。

string rootPath = Environment.GetEnvironmentVariable("TEMP");
var rootDirectory = new DirectoryInfo(rootPath);
DirectoryInfo subFolder = rootDirectory.CreateSubdirectory("SubFolder");
var directorySecurity = subFolder.GetAccessControl();

var adminitrators = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null);
directorySecurity.AddAccessRule(
    new FileSystemAccessRule(
        adminitrators,
        FileSystemRights.FullControl,
        InheritanceFlags.None,
        PropagationFlags.NoPropagateInherit,
        AccessControlType.Allow));

directorySecurity.AddAccessRule(
    new FileSystemAccessRule(
        WindowsIdentity.GetCurrent().Name,
        FileSystemRights.FullControl,
        InheritanceFlags.None,
        PropagationFlags.NoPropagateInherit, 
        AccessControlType.Allow));

var everyone = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
directorySecurity.AddAccessRule(
    new FileSystemAccessRule(
        everyone,
        FileSystemRights.FullControl,
        InheritanceFlags.None,
        PropagationFlags.NoPropagateInherit,
        AccessControlType.Deny));

subFolder.SetAccessControl(directorySecurity);

subFolder.Delete(true); // <-- System.UnauthorizedAccessException

【问题讨论】:

  • 只删除所有权限,除了:允许当前用户和管理员。默认情况下,其他所有人都不会获得许可。您不需要明确的 deny 规则。
  • 听起来你开头段落中的两句话解释了你想要发生的事情。您可能需要澄清第一个是您想要的,第二个是正在发生的事情,您不希望这样。
  • @zerkms 谢谢。我认为我需要明确否认。如果您将其发布为答案,我会接受。
  • @Enigmativity 我更新了问题,尽管 zerkms 没有更新就得到了正确的问题
  • @zerkms 不,抱歉。正如我所想的那样,这似乎并不适用于所有情况。如果在根级别上,我设置Everyone - FullAccess。比运行这段代码。而不是尝试使用不同的帐户访问它,我可以做到。它从父文件夹继承权限...

标签: c#


【解决方案1】:

好的,完整的解决方案如下:

  1. 正如@zerkms 建议的那样,我们需要删除“拒绝所有人”。这解决了当前用户尝试删除文件夹时引发的 System.UnauthorizedAccessException。
  2. 正如here 解释的那样,使用 SetAccessRuleProtection 确保权限不会从父文件夹继承。

        string rootPath = Environment.GetEnvironmentVariable("TEMP");
        var rootDirectory = new DirectoryInfo(rootPath);
    
        DirectoryInfo subFolder = rootDirectory.CreateSubdirectory("SubFolder");
        var directorySecurity = subFolder.GetAccessControl();
    
        var adminitrators = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null);
        directorySecurity.AddAccessRule(
            new FileSystemAccessRule(
                    adminitrators,
                    FileSystemRights.FullControl,
                    InheritanceFlags.None,
                    PropagationFlags.NoPropagateInherit,
                    AccessControlType.Allow));
    
        directorySecurity.AddAccessRule(
            new FileSystemAccessRule(
                    WindowsIdentity.GetCurrent().Name,
                    FileSystemRights.FullControl,
                    InheritanceFlags.None,
                    PropagationFlags.NoPropagateInherit, 
                    AccessControlType.Allow));
    
        directorySecurity.SetAccessRuleProtection(isProtected: true, preserveInheritance: false);
    
        subFolder.SetAccessControl(directorySecurity);
    

【讨论】:

    【解决方案2】:

    在这种情况下,显式的deny 规则是多余的。

    默认情况下拒绝不允许的,所以只需删除最后一个deny for all 规则就可以了。

    【讨论】:

    • 谢谢!我认为它更复杂,因为在 web.config 中通常使用拒绝和允许。
    • 不,抱歉。正如我所想的那样,这似乎并不适用于所有情况。如果在根级别上,我设置Everyone - FullAccess。比运行这段代码。而不是尝试使用不同的帐户访问它,我可以做到。它继承父文件夹的权限...
    • 好的,所以如果父文件夹有Everyone - FullAccess 这不起作用。如果父文件夹具有所有人 - 阅读/列表,则它可以工作。这对我来说已经足够了,尽管其他人应该小心。
    • @AnastasiaBaranchenkova 是的,答案暗示权限没有被继承。
    • @AnastasiaBaranchenkova 不是马上,如果有人为此提供答案,我会支持他们:-)
    猜你喜欢
    • 2019-10-03
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 2018-12-20
    • 1970-01-01
    相关资源
    最近更新 更多