我被要求查看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配置中工作?
你的编辑1)彻底改变了你的问题,使我刚才的答复无关和2)是荒谬的 - - 如果你想要的只是DOMAIN \ name的DOMAIN部分,那么你必须拥有它,否则你将无法在第一时间创建LDAP连接... – ildjarn 2011-06-03 02:03:41
我是根据“预Windows 2000域”可能与该行为不同的印象在活动目录树打开的ual域中,考虑到这一点,我试图获得预先Windows 2000域名。我对LDAP知之甚少,并试图尽可能多地搜集今天的差异。例如.... 用户登录名:[email protected] ... 用户登录名(Windows 2000以前版本):SOMETHING \用户... 你说的' '用户登录名(Windows 2000之前)'中的'SOMETHING'与'用户登录名'中的'something'相同吗? – Grub 2011-06-03 06:39:48
不,SOMETHING \ user中的'SOMETHING'是一个域的netbios显示名称,而'user @ something.com.au'中的something.com.au是完全限定的域名。但是,您需要一个域名来连接到LDAP,此时您要么直接使用netbios名称并使用它进行连接,要么可以从您用来连接的完全限定名称中提取netbios名称。 – ildjarn 2011-06-03 18:20:03