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

时间:2010-01-25 04:00:04

标签: c# .net security registry acl

我正在尝试使用必须在客户端计算机上访问的一些重要信息来锁定注册表项,我不是非管理员可以访问此密钥。如果您是管理员,您将能够比我在钥匙中存储的更多伤害。

我目前要做的是:

//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以便我无法删除它之前,我宁愿知道它是否可行。我应该将密钥的所有者设置为管理员组吗?

PS:非常重要的是,密钥甚至不能作为非管理员读取,而不仅仅是更改。

1 个答案:

答案 0 :(得分:3)

对拒绝规则要非常小心 - 它们很少需要。

如果ACL中唯一的ACE是管理员为他们提供您希望他们拥有的访问权限,那么没有其他人可以访问该密钥,因为没有ACE授予他们访问权限。

我不清楚AddAccessRule()的文档是否能保证将新的规则(或ACE)添加到ACL的末尾。这种情况可能就是这种情况,但是如果碰巧不能以这种方式工作并且您的拒绝ACE在ACE授予管理员访问权限之前结束,则拒绝ACE将“覆盖”授予访问权限的ACE(第一个系统停止查看一旦它击中授予或拒绝许可的第一个ACE,就会使用ACL。这就是为什么使用deny ACE可能会很棘手。由于未明确授予权限的ACL会导致访问检查失败,因此通常只需指定允许访问权限的人。

您可能希望确保所有者设置为管理员组 - 所有者无法访问密钥(或任何对象),但所有者始终有权更改ACL(如果您有意义)想一想。)