【问题标题】:Get Active Directory attributes from current domain user using LDAP使用 LDAP 从当前域用户获取 Active Directory 属性
【发布时间】:2017-08-05 10:19:49
【问题描述】:

开发环境: 视窗 一些商业上可用的 LDAP-Client-Lib MinGW-gcc C - 不是 C++ 或 C#

我发现了以下 LDAP-Client-Libraries 和 Samples:

Novell OpenLDAP

OpenLDAP libldap

Microsoft LDAP 库

https://msdn.microsoft.com/en-us/library/aa367033(v=vs.85).aspx
https://msdn.microsoft.com/en-us/library/aa366102(v=vs.85).aspx
https://msdn.microsoft.com/en-us/library/aa367016(v=vs.85).aspx

它需要基于 C(所以我认为没有 ADSI) 我需要获取当前域用户的所有属性的列表(用于过滤) 我不知道从哪里开始——我是一位经验丰富的 C/C++ 用户,但从未使用过 AD/LDAP 的东西

谢谢

更新 #1

我能够使用 WINAPI 获取用户和域名,查找/查找域 AD/LDAP 服务器,并且可以使用 ldap_search_s 连接和检索有关用户的一些信息

我仍然没有完全理解 ldap_search_s 基础、过滤器和属性值应该是什么,以从我的 testuser 检索所有(一级)属性(如名字、姓氏、全名等)

我当前的测试使用示例中的这个基础、过滤器和属性值来获得一些(我的第一个)结果

base = "OU=Domain User,OU=TESTDOMAIN,DC=testdomain,DC=local"
filter = "(&(objectClass=user)(sAMAccountName=testuser))"
attrs = "memberOf"

这给了我(我认为)testuser 所属的组

我目前只获得了用户的登录名 (testuser) - 它认为这是 sAMAccountName-attribute 值 - 所以使用

CN=testuser,OU=域用户,OU=TESTDOMAIN,DC=testdomain,DC=local

不会(或不会?)工作,因为 CN 名称是“测试用户”

更新 #2

第一个例子已经解决了我的问题——愚蠢的我

所以唯一的问题是找到用户属性的正确方法是什么?

base = "OU=Domain User,OU=TESTDOMAIN,DC=testdomain,DC=local"
filter = "(&(objectClass=user)(sAMAccountName=testuser))"
attrs = NULL

或者这些基础/过滤器组合在其他系统/配置设置等上是否存在问题?

【问题讨论】:

  • Novell C# 库转到了 Mono.Directory.LDAP(记得 Mono 在 Novell),从那时起我就失去了它们的踪迹。
  • 我需要使用 C - 如标题、文本和标签中所述 - 对于您丢失的移动 C# 库,这里没有用处
  • 请将您的问题edit 显示what you have tried so far。您应该至少包含您遇到问题的代码的大纲(但最好是minimal reproducible example),然后我们可以尝试帮助解决具体问题。您还应该阅读How to Ask
  • 我以前从未接触过 AD/LDAP,直到现在也没有工作的 AD - 所以我刚刚开始感觉到需要什么 - 目前测试了域名检索和 DNS-ldap-server查找

标签: c windows utf-8 active-directory ldap


【解决方案1】:

您需要了解几件事。首先是关于 Active Directory 中的命名。

Active Directory 有许多命名属性:

distinguishedName:这是对象的完整 LDAP DN,例如 cn=Joe Smith, ou=Users,dc=MyDomain,dc=com,并且在树中必须是唯一的并且强制执行,也就是说 cn=Joe Smith 节点在容器中必须是唯一的:ou=Users,dc=MyDomain,dc=com

sAMAccountName:这通常是用户的简称。在域内必须是唯一的并且被强制执行。像 geoffc 或 jsmith。

用户主体名称:这看起来像一个电子邮件地址,在 Office 365 中将是您的电子邮件地址。 geoffc@mydomain.com 这应该在您的森林中是唯一的,但实际上并未强制执行唯一性,并且通过 LDAP,您甚至可以在该字段中写入废话。在域的根目录中,您可以定义附加 SPN(服务提供商名称?我认为),然后显示在 Active Directory 用户和计算机中作为可能的域扩展以添加到用户。但是,即使 ADUC 将其显示为拆分属性、值和域后缀,它也被存储为一个简单的字符串。

displayName:这通常是 Joe Smith,为用户显示的名称。

ma​​il:用户的实际电子邮件地址,jsmith@mail.mydomain.com。对于 Office365,这也是 UserPrincipalName 中的值。

因此,对象上的 CN= 与 samAccountName 不同,除非是故意如此。默认情况下,CN 实际上是用户的全名。这就是 AD 用户和计算机 MMC 管理单元生成帐户的方式。

接下来是过滤器的工作原理。您指定一个过滤器,然后返回匹配的过滤器。

基地是您的搜索开始寻找的地方。因此,找出您的用户的存储位置,并将父对象用作基本 DN。有时这是树的根,有时是某个特定的 OU 或 CN 对象。 (注意默认情况下,AD 创建一个名为 CN=Users 的容器,而不是您可能期望的 OU=Users。这是因为 Container 对象类比组织单元更接近旧的 NT 样式域模型)。

过滤器只返回您想要的用户。您的过滤器示例很好,但由于您没有明确说明您想要什么,因此很难回答最佳选择。

属性是您希望看到返回的值。如果您只是测试是否存在,您总是可以添加 entryDN 或 distinctName 两者都应该返回相同的东西,即对象的 DN。这很有帮助,因为 LDIF 中对象的 DN 是第一行,但如果您的代码已准备好选择属性值,那么将其作为属性很方便。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多