本文讨论以下问题:使用 NetUser 或 NetGroup 类的下层 API 的应用程序(例如 NetUserGetInfo
或 NetGroupGetInfo
失败并出现 ACCESS DENIED 错误)。
原始 KB 数: 2281774
总结
你有一个应用程序,该应用程序使用 NetUser 或 NetGroup 类的下层 API,例如NetUserGetInfo
,、、、NetUserEnum
NetGroupSetInfo
NetGroupGetInfo
、NetGroupEnum
、 NetLocalGroupGetInfo
和NetLocalGroupSetInfo
NetLocalGroupEnum
。 NetUserSetInfo
在此方案中,NetUser 类 API 还用于管理计算机帐户。
调用 ADSI WINNT 提供程序时使用相同的 API。
尽管调用帐户对目标帐户具有足够的权限,但这些 API 可能会失败并拒绝访问。 原因是客户端 API 实现与安全帐户管理器 (SAM) RPC API 没有 1:1 关系。 客户端会执行其他检查和准备这些调用,这些调用需要 Active Directory 中的其他权限。
使用这些 API 的一个应用程序是群集服务,在群集服务日志中,你将看到:
00000a78.000021b8::2010/06/15-00:00:47.911 警告 [RES] 网络名称 <群集-resource1>:无法确定计算机帐户群集-resource1 是否已禁用。 状态 5
如果启用了调用帐户的成功或失败访问审核,则此效果的另一个症状可能是 DC 的安全事件日志中的过多审核记录以及下面引用的对象。
详细信息
API 的实现使用针对域控制器的多个 RPC 调用来设置会话并验证域。 它访问具有读取访问权限的以下对象:
域根对象:它查找域控制器的主域并打开要读取的域,后者又打开域的 AD 对象,例如 DC=contoso,dc=com。
内置容器:这是内置域的根对象。 它打开,因为调用方想要验证其是否存在。 因此,调用方需要对容器 CN=Builtin,DC=contoso,dc=com 进行读取访问。
SAM 服务器对象:此对象存储有关常规 SAM 帐户访问和枚举的常规权限。 它将仅用于某些调用。 对象名称为 cn=server,cn=system,DC=contoso,dc=com。
在大多数 Active Directory 域中,基于通用组中的成员身份(如经过身份验证的用户、每个人或预 Windows 2000 兼容访问组)授予对这些对象的权限。 触发问题的更改可能是用户已从最后一个组中删除(也许与每个人一起,并且/或删除了对列出的对象的权限,以强化 Active Directory 权限。
解决问题的方法是授予所需的读取权限或更改应用程序以使用 LDAP 而不是旧 API 或 ADSI WINNT 提供程序。 LDAP 不会触摸上述对象,它还支持你可能在目标对象上设置的精细权限。
过度审核
在这些对象上启用审核后,将看到上述对象的最多三条审核记录,用于打开和关闭对象,以及实际的目标对象访问。 如果事件被过度记录,则删除审核 ACL 中的条目是有意义的,以便不再记录这些泛型访问类型。 问题是域根对象和 Builtin 容器继承给许多从属对象。
若要解决此问题,需要在内置容器中中断继承,并重新定义继承的 ACE,以仅应用于此对象。 还需要触摸域根对象上的 ACE,使问题 SAC 不再应用于域根对象。 具体步骤取决于环境中生效的实际 SACL 设置。