C++ 检索';windows 2000之前的登录&x27;win32api C+;中LDAPMessage对象的名称+;

C++ 检索';windows 2000之前的登录&x27;win32api C+;中LDAPMessage对象的名称+;,c++,winapi,active-directory,ldap,C++,Winapi,Active Directory,Ldap,我被要求查看windows服务,它使用win32 LDAP API从Active Directory树检索数据,并将JSON数据输出到文本文件。它工作正常,但我需要修改它,以便我获得“windows 2000之前版本”的登录名。该服务是用C++编写的。 该服务已使用以下方法成功检索各种其他属性字符串: PTSTR *pszValues=ldap_get_values(pLdap,pEntry,szAttribute); 以及: 我查看了一下是否有“windows 2000之前”登录的属性或类似

我被要求查看windows服务,它使用win32 LDAP API从Active Directory树检索数据,并将JSON数据输出到文本文件。它工作正常,但我需要修改它,以便我获得“windows 2000之前版本”的登录名。该服务是用C++编写的。 该服务已使用以下方法成功检索各种其他属性字符串:

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

我查看了一下是否有“windows 2000之前”登录的属性或类似的属性,希望我可以将其添加为另一个“szAttribute”(在本例中替换为“uUsnChanged”),但运气不佳。查看API,我一直无法找到获取此信息的方法

我找到了属性“sAMAccountName”,我认为它可以提供所需的信息,但它只提供了域名格式的部分。典型的,这是我想要的另一部分

有人对如何从“pEntry”中获取'pre-windows 2000'字符串有什么想法吗

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

使用
ldap\u init(NULL,0)

使用ldap\u搜索(pLdap、NULL、ldap\u SCOPE\u BASE、NULL、pszAttrs、FALSE和pResults)获取“配置命名上下文”将连接句柄作为第一个参数传入

使用
ldap_get_值(pLdap、pEntry、TEXT(“configurationNamingContext”))检索“configurationNamingContext”属性

将“CN=Partitions”连接到字符串的开头,给出类似“CN=Partitions,CN=Configuration,DC=domain,DC=com,DC=au”的内容

然后,它使用
ldap\u search\s(pLdap、szPartitionNC、ldap\u SCOPE\u子树、TEXT(((nETBIOSName=*)))、pszAttrs、FALSE和pResults)执行搜索

然后它在结果中循环查找任何具有“nETBIOSName”属性的内容,一旦找到一个,它就会跳出循环并返回值


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

(sAMAccountName)

小心,“windows 2000之前的域”的域部分可能与用户主体名称完全不同(user@domain)用于登录Active Directory。域是主域控制器名称或Netbios域名。域是在域创建期间创建的,默认情况下它是DNS名称的一部分,但在域创建期间可以完全更改它

您可以通过
nETBIOSName
属性找到它:

ldifde -f netbios.ldf -d "CN=Partitions,CN=Configuration,DC=your-DNS-Name" -r "(netbiosname=*)"
最好的过滤器是

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

你的编辑1)完全改变了你的问题,使我先前的回答变得无关紧要;2)是荒谬的——如果你只想知道
域名的
部分,那么,那么您必须已经拥有了它,否则您将无法首先建立LDAP连接……我的印象是“windows 2000之前的域”可能与active directory树所在的实际域不同,正是考虑到这一点,我正在尝试获取windows 2000之前的域名。我对LDAP知之甚少,今天我已经尽可能多地收集关于差异的信息。例如用户登录名:user@something.somewhere.com.au...  用户登录名(Windows 2000之前的版本):某物\User。。。你是说“用户登录名(Windows 2000以前版本)”中的“某物”必须与“用户登录名”中的“某物”相同吗?不是,
SOMETHING\User
中的
SOMETHING
是域的netbios显示名,还有
something.com.au中的
user@something.com.au
是一个完全限定的域名。但您需要一个域名才能连接到LDAP,此时您要么直接拥有netbios名称并将其用于连接,要么可以从用于连接的完全限定名称中轻松提取netbios名称。应用程序位于服务器本身,并使用
LDAP_init(NULL,0)进行连接
NULL参数意味着
ldap\u init()
将查找默认DC,不需要域名。这意味着在安装时不必配置域名即可工作。假设您的程序没有在域控制器上运行,
ldap_init
记录为“在尝试连接时搜索当前计算机所属域中的DC”。听起来你真正想要的是当前计算机所属的域的名称,不是吗?这可以通过调用第一个参数
ComputerNamedDomain
ComputerNamePhysicaldDomain
@ildjarn获得。非常感谢您的评论。这些,加上其他来源的一些提示,意味着我们已经能够解决这个问题了!阻碍我们前进的与其说是API,不如说是对Active Directory的结构缺乏了解,所以再次感谢。
(&(objectcategory=crossref)(dnsHostName=<DomainDNSName>)(netbiosname=*))