代码之家  ›  专栏  ›  技术社区  ›  Spence

通过ACL保护注册表项以删除对非管理员的所有访问权限

  •  2
  • Spence  · 技术社区  · 16 年前

    我正试图用一些必须在客户机上访问的重要信息锁定注册表项,我不希望非管理员访问此项。如果你是管理员,你已经可以做比我在钥匙里存储的更多的伤害。

    我现在想做的是:

    //Allow access only to administrators and deny all rights to everyone else.
    System.Security.AccessControl.RegistrySecurity acl = 
    new System.Security.AccessControl.RegistrySecurity();
    acl.AddAccessRule(
        new System.Security.AccessControl.RegistryAccessRule(
            "Administrators", 
            System.Security.AccessControl.RegistryRights.FullControl, 
            System.Security.AccessControl.AccessControlType.Allow));
    
    acl.AddAccessRule(
        new System.Security.AccessControl.RegistryAccessRule(
            "Everyone",
            System.Security.AccessControl.RegistryRights.FullControl,
            System.Security.AccessControl.AccessControlType.Deny));
    
    //Prevent inherited read access from the software or company key allowing access.
    acl.SetAccessRuleProtection(true, false);
    
    MyKey.SetAccessControl(acl);
    

    如果我有权,这将拒绝所有人的访问,明确允许管理员组中的任何人访问,并将阻止所有继承的权限应用到我的密钥?我宁愿在我弄乱密钥上的ACL以使我不能删除它等之前查明它是否可以工作。我应该将密钥的所有者也设置为管理员组吗?

    附言:关键是不能以非管理员的身份读取密钥,而不仅仅是更改。

    1 回复  |  直到 16 年前
        1
  •  3
  •   Michael Burr    16 年前

    要非常小心拒绝规则——它们只是很少必要的。

    如果acl中的唯一ace是为管理员授予您希望他们拥有的访问权,那么其他人将无法访问密钥,因为没有ace授予他们访问权。

    我不清楚 AddAccessRule() 如果它能保证一个新的规则(或ace)将被添加到acl的末尾,或者不添加。这种情况很可能是这样,但是如果发生这种情况,并且您的deny ace在ace授予管理员访问权之前结束,那么deny ace将“覆盖”授予访问权的那一个(当第一个系统到达授予或拒绝权限的第一个ace时,它将停止查看acl)。这就是为什么使用deny ace会很棘手。由于没有显式授予权限的ACL会导致访问检查失败,因此通常只需要指定允许访问的对象。

    您可能希望确保将所有者设置为管理组-所有者不能访问密钥(或任何对象),但所有者始终有权更改ACL(如果您考虑一下,这是有意义的)。