2011-06-03 87 views
0

我被要求查看windows服务,它使用win32 LDAP API从Active Directory树中检索数据并将JSON数据输出到文本文件。它工作正常,但我需要修改它,以便我得到'pre windows 2000'登录名。该服务是用C++编写的。从win32api的LDAPMessage对象中检索'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,看看是否有对“前Windows 2000的”登录或属性希望我可以添加另一个'szAttribute'(在这个例子中代替“uUsnChanged”)并且没有运气。看看API,我一直无法想出获取这些信息的方法。

我发现我本以为这提供所需的信息属性“sAMAccountName赋”,但只给了我域/名称格式的一部分。典型的,这是我想要的其他部分!

没有人有任何想法如何从'pEntry'得到'pre windows 2000'字符串?

@JPBlanc在测试服务器上运行它时,我们现在正在获取正确的nETBIOSName属性。该应用的工作原理是每个DC最多有一个nETBIOSName属性。它通过做发现了下列文件:

得到使用ldap_init(NULL,0)

得到“配置命名上下文”使用ldap_search_s(pLdap,NULL,LDAP_SCOPE_BASE,NULL,pszAttrs,FALSE,&pResults);传入连接手柄作为第一个参数

检索“configurationNamingContext”属性的默认主机使用ldap_get_values(pLdap,pEntry,TEXT("configurationNamingContext"));

会连接 “CN =分区,” 字符串给予像 “CN =分区,CN =配置,DC =域,DC = COM,DC = AU”

的beggining 0

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

搜索,然后它遍历结果找一个“NETBIOSNAME”属性什么,一旦它找到一个就跳出循环和返回值。

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

+0

你的编辑1)彻底改变了你的问题,使我刚才的答复无关和2)是荒谬的 - - 如果你想要的只是DOMAIN \ name的DOMAIN部分,那么你必须拥有它,否则你将无法在第一时间创建LDAP连接... – ildjarn 2011-06-03 02:03:41

+0

我是根据“预Windows 2000域”可能与该行为不同的印象在活动目录树打开的ual域中,考虑到这一点,我试图获得预先Windows 2000域名。我对LDAP知之甚少,并试图尽可能多地搜集今天的差异。例如.... 用户登录名:[email protected] ... 用户登录名(Windows 2000以前版本):SOMETHING \用户... 你说的' '用户登录名(Windows 2000之前)'中的'SOMETHING'与'用户登录名'中的'something'相同吗? – Grub 2011-06-03 06:39:48

+0

不,SOMETHING \ user中的'SOMETHING'是一个域的netbios显示名称,而'user @ something.com.au'中的something.com.au是完全限定的域名。但是,您需要一个域名来连接到LDAP,此时您要么直接使用netbios名称并使用它进行连接,要么可以从您用来连接的完全限定名称中提取netbios名称。 – ildjarn 2011-06-03 18:20:03

回答

1

小心, '前Windows 2000域' 域部分可以从用户主要名称(如user @ 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=*)) 
+0

@ildjarn非常感谢您的意见。这些以及来自其他来源的一些技巧意味着我们已经能够解决问题!与阻碍我们的API相比,它更多的是缺少对Active Directory结构的理解,所以再次感谢。 – Grub 2011-06-06 07:10:19