使用LDAP从当前域用户获取Active Directory属性

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

我发现以下LDAP客户端库和示例:

Novell OpenLDAP

OpenLDAP libldap

Microsoft LDAP Lib

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 base,filter和attributes的值应该是从我的testuser(如first,lastname,fullname等)中检索所有(一级)属性。

我目前的testing使用这个基础,从一个例子过滤和属性值来获得一些(我的第一个)结果

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

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

即时通讯目前只获得用户的login名(testuser) – 它认为这是sAMAccountName – 属性值 – 所以使用

CN = testuser,OU =域用户,OU = TESTDOMAIN,DC = testdomain,DC =本地

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

更新#2

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

所以唯一的问题是find用户属性的正确方法?

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

或者在其他系统/ konfigure-设置等这些基地/filter组合的问题?

你需要了解几件事情。 首先是关于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,为用户显示的名称。

mail :用户的实际邮箱地址,jsmith@mail.mydomain.com。 对于Office365,这也是UserPrincipalName中的值。

因此CN =在一个对象上与samAccountName是不一样的,除非这样做的目的。 实际上,默认的CN是用户全名。 这是AD用户和计算机MMC管理单元如何生成帐户。

接下来是过滤器的工作 你指定一个过滤器,然后你找回那些匹配的。

基地是您的搜索开始寻找的地方。 因此,找出您的用户存储在哪里,并使用父对象作为基准DN。 有时候,这就是树的根,有时候是一些特定的OU或CN对象。 (注意默认情况下,AD创建一个名为CN = Users的容器,而不是像你所期望的OU = Users那样,这是因为Container对象类比旧的NT样式域模型更接近于组织单元。

过滤器是只返回你想要的用户的东西。 你的过滤器的例子很好,但是因为你没有明确你想要什么,所以很难回答什么是最好的选择。

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