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

时间:2017-03-14 21:27:15

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

开发环境: 视窗 一些商业上可用的LDAP-Client-Lib MinGW的海湾合作委员会 C - 不是C ++或C#

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

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的东西

THX

更新#1

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

我仍然没有完全解决ldap_search_s基础,过滤器和属性值应该从我的testuser中检索所有(一个级别)属性(如first,lastname,fullname等)。

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

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

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

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

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

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

更新#2

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

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

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

或者在其他系统/ konfigure-settings等上存在这些基础/过滤器组合的问题。?

1 个答案:

答案 0 :(得分: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,为用户显示的名称。

邮件:用户的实际电子邮件地址,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是第一行,但如果您的代码已准备好选择属性值,那么将它作为属性就很方便。