如何使用 ADsGetObject 获取域中组的 IADsGroup 对象?

How to get the IADsGroup object for a group in the domain using ADsGetObject?

精简版

如何获取群组Whosebug\ITOpsIADsGroup界面?

长版

我正在尝试获取 IADsGroup interface for a group in the domain using the ADsGetObject function

我仅有的信息:

该函数采用 LDAP path to an object:

HRESULT ADsGetObject(
  [in]  LPCWSTR lpszPathName,
  [in]  REFIID  riid,
  [out] VOID    **ppObject
);

真正的困难在于为域[=]中的提出实际的LDAP路径 101=]。例如:

  • LDAP://Whosebug/ITOps 失败 (“指定了无效的 dn 语法”)
  • LDAP://CN=ITOps,DN=Whosebug 失败 0x80072020 (“发生操作错误”)
  • LDAP://CN=ITOps,DC=Whosebug 失败 0x8007202B (“已从服务器返回推荐”)

问题

给定:

  • 组名(例如“ITOps”)
  • 一个域名(例如“Whosebug”)

如何获取群组Whosebug\ITOpsIADsGroup界面?

红利阅读

AD中对象的唯一标识符有好几种,不能都用同一种方式使用,有点乱。

这是该路径所需的文档(您已链接到该路径):LDAP ADsPath

这表明 LDAP 路径应如下所示:

LDAP://HostName[:PortNumber][/DistinguishedName]

HostNamePortNumberDistinguishedName 都是可选的,具体取决于您要执行的操作。如果你需要绑定到一个特定的对象 - 这就是你想要做的 - 那么 DistinguishedName 是强制性的。

可分辨名称是对象的 distinguishedName 属性,这就是为什么 Luke 建议您使用 AD Explorer 浏览到目录中的对象并检查 distinguishedName 属性的值. DN 是通用名称 (CN)、每个组织单位 (OU) 和域 DNS 名称(例如 whosebug.com)的串联,拆分为每个域组件 (DC)。这看起来像这样:

CN=ITOps,OU=Groups,DC=Whosebug,DC=com

格式 Whosebug\ITOps 是域的简称(正式称为 NetBIOS 名称),结合对象的 sAMAccountName 属性。此格式通常用于对用户帐户进行身份验证,但不能用于 LDAP 路径。

如果您将这个组硬编码到您的代码中,那么只需查找 distinguishedName 并使用它。如果用户给你 Whosebug\ITOps 格式并且需要绑定到它,那么你可以:

  1. 使用 IADsNameTranslateADS_NAME_TYPE_NT4 转换为 ADS_NAME_TYPE_1779,或
  2. 使用搜索过滤器 (sAMAccountName=ITOps) 在域上执行搜索。要在 C++ 中执行 LDAP 搜索,请参阅 IDirectorySearch 的文档。您仍然需要为搜索提供 LDAP 路径,但您可以只提供域 DNS 名称(例如 LDAP://whosebug.com)。这允许您指定它想要您 return 的属性,因此您可以告诉它您想要 distinguishedName。或者如果你绑定对象的目的是读取其他一些属性,那么你可以指定那些属性并从搜索结果中读取这些属性,然后你可以跳过下一步直接绑定到对象。

您似乎打算使用 C++,但您并没有具体说明。你在使用 C++ 吗?

如果您不知道域名的 dn 可以通过 rootDSE

获取