我被要求查看使用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"));
将“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配置中工作?
答案 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=*))