开发环境: 视窗 一些商业上可用的LDAP-Client-Lib MinGW的海湾合作委员会 C - 不是C ++或C#
我发现了以下LDAP-Client-Libraries和Samples:
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等上存在这些基础/过滤器组合的问题。?
答案 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是第一行,但如果您的代码已准备好选择属性值,那么将它作为属性就很方便。