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

C# 通过ACL保护注册表项以删除对非管理员的所有访问,c#,.net,security,registry,acl,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.AccessCont

我试图锁定一个注册表项,其中包含一些必须在客户端计算机上访问的重要信息,我不希望非管理员能够访问此项。如果你是一个管理员,你已经能够做更多的损害比我在关键存储

我目前希望做的是:

//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);
如果我是正确的,这将拒绝对所有人的访问,明确允许对administrators组中的任何人的访问,并将阻止所有继承的权限应用于我的密钥?我宁愿在我搞乱密钥上的ACL,使我无法删除它之前确定它是否有效。我是否应该将密钥的所有者也设置为administrators组


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

使用拒绝规则时要非常小心,因为它们很少需要

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

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


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

因此,拒绝规则更适合处理传播的权限。我的意图是新建ACL,添加我想要的一个规则,然后以这种方式直接设置ACL。(与获取ACL、更改、应用相反)。您知道是否有任何特殊系统帐户必须访问该密钥?是否有任何特殊系统帐户需要访问该密钥取决于该密钥是什么以及它的用途。例如,如果任何服务需要访问该密钥,那么运行该服务的任何帐户(或该帐户所在的组)都将需要访问。您应该对其进行测试-我认为删除LocalSystem不会有问题,除非该密钥需要由运行在系统帐户下的服务访问。如果它是您为自己的目的而创建的密钥(而不是Microsoft用于某些配置项或任何东西),那么应该不会有问题。如果没有Windows系统进程查找密钥,他们不会在意无法访问该密钥。但要测试它——不要只相信我的话。