从win32api C ++中的LDAPMessage对象中检索“pre windows 2000 logon”名称

时间:2011-06-03 01:40:48

标签: c++ winapi active-directory ldap

我被要求查看使用win32 LDAP API从Active Directory树检索数据的Windows服务,并将JSON数据输出到文本文件。它工作正常,但我需要修改它,以便我得到'pre windows 2000'登录名。该服务是用c ++编写的。

服务已成功使用以下方法检索各种其他属性字符串:

PTSTR *pszValues=ldap_get_values(pLdap,pEntry,szAttribute);

if (_tcscmp(szAttribute,TEXT("uUsnChanged"))==0)            // uSNChanged is an example of an attribute
pItemInfo->uUsnChanged=_tcstoui64(pszValues[0],NULL,10);    // pItemInfo is a struct defined elsewhere to hold the results for any given entry

我查看了http://msdn.microsoft.com/en-us/library/ms679021(v=VS.85).aspx以查看是否存在“pre windows 2000”登录或类似内容的属性,希望我可以将其添加为另一个'szAttribute'(在此替换“uUsnChanged”)例子)并没有运气。看看API我一直无法想出获取这些信息的方法。

我找到了属性'sAMAccountName',我认为该属性可以提供所需的信息,但它只给我 DOMAIN / name 格式的名称部分。典型的,这是我想要的另一部分!

有没有人对如何从'pEntry'获取'pre windows 2000'字符串有任何想法?

@JPBlanc我们正在测试服务器上运行它时获得正确的nETBIOSName属性。该应用程序假设每个DC最多有一个nETBIOSName属性。它通过执行以下操作找到它:

使用ldap_init(NULL,0)

获取默认主机

使用ldap_search_s(pLdap,NULL,LDAP_SCOPE_BASE,NULL,pszAttrs,FALSE,&pResults);作为第一个参数传递连接句柄来获取'配置命名上下文'

使用ldap_get_values(pLdap,pEntry,TEXT("configurationNamingContext"));

检索'configurationNamingContext'属性

将“CN = Partitions”连接到字符串的开头,例如“CN = Partitions,CN = Configuration,DC = domain,DC = com,DC = au”

然后使用ldap_search_s(pLdap,szPartitionNC,LDAP_SCOPE_SUBTREE,TEXT("(nETBIOSName=*)"),pszAttrs,FALSE,&pResults);

执行搜索

然后它循环遍历结果,查找具有'nETBIOSName'属性的任何内容,一旦找到它,它就会突破循环并返回值。

您知道这是否足以在任何AD配置中工作?

2 个答案:

答案 0 :(得分:2)

SAM-Account-Name Attribute(sAMAccountName)

答案 1 :(得分:1)

请注意,'pre windows 2000 domain'的Domain部分可以与用户Principal Name(user @ domain)用于登录Active Directory的完全不同。 DOMAIN是主域控制器名称或Netbios域名。 DOMAIN是在域创建期间创建的,默认情况下它是DNS名称的一部分,但在域创建期间可以完全更改。

您可以使用nETBIOSName属性找到它:

ldifde -f netbios.ldf -d "CN=Partitions,CN=Configuration,DC=your-DNS-Name" -r "(netbiosname=*)"

最好的过滤器是

(&(objectcategory=crossref)(dnsHostName=<DomainDNSName>)(netbiosname=*))