如何使用 ADsGetObject 获取域中组的 IADsGroup 对象?
How to get the IADsGroup object for a group in the domain using ADsGetObject?
精简版
如何获取群组Whosebug\ITOps
的IADsGroup
界面?
长版
我正在尝试获取 IADsGroup
interface for a group in the domain using the ADsGetObject function。
我仅有的信息:
- 组名:例如
ITOps
- 域名:例如
Whosebug
该函数采用 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\ITOps的IADsGroup
界面?
红利阅读
- MSDN:Binding With GetObject and ADsGetObject
- MSDN:ADsGetObject function
- MSDN:LDAP ADsPath
- MSDN:Binding to an Object Using a SID
- MSDN:Example Code for Getting the Distinguished Name of the Domain
- 服务器故障:get AD group path in the domain/tree
- LDAP path to server and a user group
- Proper Syntax for an LDAP Path
- 计算器溢出:LDAP Path And Permissions To Query Local User Directory?
- MSDN:WinNT ADsPath
- WinNT vs. LDAP
- MSDN: Glossary WinNT: "Windows NT 命名空间提供程序,支持 Windows NT SAM 帐户数据库。WinNT 提供程序也可用于访问Active Directory,但它将其公开为平面命名空间。"
- C language function:ADsGetObject sample codes
- MSDN:Unsupported IADsUser Properties (“要获取 and/or 修改这些属性,请使用 LDAP 提供程序”)
- MSDN:WinNT Custom User Properties (“WinNT 提供程序为用户提供以下自定义属性 class”)
AD中对象的唯一标识符有好几种,不能都用同一种方式使用,有点乱。
这是该路径所需的文档(您已链接到该路径):LDAP ADsPath
这表明 LDAP 路径应如下所示:
LDAP://HostName[:PortNumber][/DistinguishedName]
HostName
、PortNumber
和 DistinguishedName
都是可选的,具体取决于您要执行的操作。如果你需要绑定到一个特定的对象 - 这就是你想要做的 - 那么 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
格式并且需要绑定到它,那么你可以:
- 使用
IADsNameTranslate
将 ADS_NAME_TYPE_NT4
转换为 ADS_NAME_TYPE_1779
,或
- 使用搜索过滤器
(sAMAccountName=ITOps)
在域上执行搜索。要在 C++ 中执行 LDAP 搜索,请参阅 IDirectorySearch
的文档。您仍然需要为搜索提供 LDAP 路径,但您可以只提供域 DNS 名称(例如 LDAP://whosebug.com
)。这允许您指定它想要您 return 的属性,因此您可以告诉它您想要 distinguishedName
。或者如果你绑定对象的目的是读取其他一些属性,那么你可以指定那些属性并从搜索结果中读取这些属性,然后你可以跳过下一步直接绑定到对象。
您似乎打算使用 C++,但您并没有具体说明。你在使用 C++ 吗?
如果您不知道域名的 dn
可以通过 rootDSE
获取
精简版
如何获取群组Whosebug\ITOps
的IADsGroup
界面?
长版
我正在尝试获取 IADsGroup
interface for a group in the domain using the ADsGetObject function。
我仅有的信息:
- 组名:例如
ITOps
- 域名:例如
Whosebug
该函数采用 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\ITOps的IADsGroup
界面?
红利阅读
- MSDN:Binding With GetObject and ADsGetObject
- MSDN:ADsGetObject function
- MSDN:LDAP ADsPath
- MSDN:Binding to an Object Using a SID
- MSDN:Example Code for Getting the Distinguished Name of the Domain
- 服务器故障:get AD group path in the domain/tree
- LDAP path to server and a user group
- Proper Syntax for an LDAP Path
- 计算器溢出:LDAP Path And Permissions To Query Local User Directory?
- MSDN:WinNT ADsPath
- WinNT vs. LDAP
- MSDN: Glossary WinNT: "Windows NT 命名空间提供程序,支持 Windows NT SAM 帐户数据库。WinNT 提供程序也可用于访问Active Directory,但它将其公开为平面命名空间。"
- C language function:ADsGetObject sample codes
- MSDN:Unsupported IADsUser Properties (“要获取 and/or 修改这些属性,请使用 LDAP 提供程序”)
- MSDN:WinNT Custom User Properties (“WinNT 提供程序为用户提供以下自定义属性 class”)
AD中对象的唯一标识符有好几种,不能都用同一种方式使用,有点乱。
这是该路径所需的文档(您已链接到该路径):LDAP ADsPath
这表明 LDAP 路径应如下所示:
LDAP://HostName[:PortNumber][/DistinguishedName]
HostName
、PortNumber
和 DistinguishedName
都是可选的,具体取决于您要执行的操作。如果你需要绑定到一个特定的对象 - 这就是你想要做的 - 那么 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
格式并且需要绑定到它,那么你可以:
- 使用
IADsNameTranslate
将ADS_NAME_TYPE_NT4
转换为ADS_NAME_TYPE_1779
,或 - 使用搜索过滤器
(sAMAccountName=ITOps)
在域上执行搜索。要在 C++ 中执行 LDAP 搜索,请参阅IDirectorySearch
的文档。您仍然需要为搜索提供 LDAP 路径,但您可以只提供域 DNS 名称(例如LDAP://whosebug.com
)。这允许您指定它想要您 return 的属性,因此您可以告诉它您想要distinguishedName
。或者如果你绑定对象的目的是读取其他一些属性,那么你可以指定那些属性并从搜索结果中读取这些属性,然后你可以跳过下一步直接绑定到对象。
您似乎打算使用 C++,但您并没有具体说明。你在使用 C++ 吗?
如果您不知道域名的 dn
可以通过 rootDSE