我试图用一些必须在客户端机器上可以访问的重要信息来锁定一个注册表项,我不希望非管理员访问这个键。如果您是管理员,您已经能够造成比我存储在 key 中的破坏更多的破坏。
我目前想做的是:
//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);
如果我做对了,这将拒绝所有人访问,明确允许管理员组中的任何人访问,并阻止所有继承的权限应用于我的 key ?我宁愿在搞砸 key 上的 ACL 以致无法删除它之前先弄清楚它是否有效。我是否也应该将 key 的所有者设置为管理员组?
PS:非常重要的是, key 甚至不能以非管理员身份读取,而不仅仅是更改。
最佳答案
在使用拒绝规则时要非常小心 - 它们很少是必需的。
如果 ACL 中唯一的 ACE 是为管理员授予他们您希望他们拥有的访问权限,那么其他人将无法访问该 key ,因为没有 ACE 授予他们访问权限。
我不清楚 AddAccessRule()
的文档是否能保证将新规则(或 ACE)添加到 ACL 的末尾。这很可能是这种情况,但如果它碰巧不能那样工作并且你的拒绝 ACE 在 ACE 授予管理员访问权限之前结束,那么拒绝 ACE 将“覆盖”授予访问权限的 ACE(第一个系统停止查看一旦 ACL 命中第一个授予或拒绝权限的 ACE)。这就是使用拒绝 ACE 可能很棘手的原因。由于未明确授予权限的 ACL 会导致访问检查失败,因此您通常只需指定允许访问的人员。
您可能希望确保将所有者设置为管理员组 - 所有者无法访问 key (或任何对象),但所有者始终有权更改 ACL(如果您想一想)。
关于c# - 通过 ACL 保护注册表项以删除对非管理员的所有访问权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2130123/