使用SetNamedSecurityInfo设置GRANT_ACCESS

时间:2012-06-10 16:02:56

标签: c++ windows winapi

我使用this方法授予\ deny访问注册表项的权限:

第一次GRANT_ACCESS

AddAceToObjectsSecurityDescriptor(wKey, SE_REGISTRY_KEY, UserName, TRUSTEE_IS_NAME, GENERIC_ALL, GRANT_ACCESS, SUB_CONTAINERS_AND_OBJECTS_INHERIT);

然后是DENY_ACCESS

AddAceToObjectsSecurityDescriptor(wKey, SE_REGISTRY_KEY, UserName, TRUSTEE_IS_NAME, GENERIC_ALL, DENY_ACCESS, SUB_CONTAINERS_AND_OBJECTS_INHERIT);

他们都工作了。在这两个电话之后,我试图再次拨打第一个电话以授予访问权限。但我不能这样做。没有错误消息,如ERROR_ACCESS_DENIED。 AddAceToObjectsSecurityDescriptor不返回错误代码。我的用户帐户是相应注册表项的所有者。此外,我仍然可以通过相同的UserName下的regedit手动更改权限。 AddAceToObjectsSecurityDescriptor方法有什么问题吗?

2 个答案:

答案 0 :(得分:1)

尝试使用DENY_ACCESS和SET_ACCESS。 例如:

AddAceToObjectsSecurityDescriptor(wKey, SE_REGISTRY_KEY, UserName, TRUSTEE_IS_NAME, GENERIC_ALL, SET_ACCESS, SUB_CONTAINERS_AND_OBJECTS_INHERIT);

AddAceToObjectsSecurityDescriptor(wKey, SE_REGISTRY_KEY, UserName, TRUSTEE_IS_NAME, GENERIC_ALL, DENY_ACCESS, SUB_CONTAINERS_AND_OBJECTS_INHERIT);

答案 1 :(得分:0)

好吧,既然您上一次调用是对给定对象(注册表项)的DENY访问,那么您不能指望成功访问您拒绝访问的同一对象。这就是你得到ERROR_ACCESS_DENIED的原因。由于您是对象的所有者,因此您当然可以获取对象的所有权并根据需要重置安全描述符。