C++ 检索';windows 2000之前的登录&x27;win32api C+;中LDAPMessage对象的名称+;
我被要求查看windows服务,它使用win32 LDAP API从Active Directory树检索数据,并将JSON数据输出到文本文件。它工作正常,但我需要修改它,以便我获得“windows 2000之前版本”的登录名。该服务是用C++编写的。 该服务已使用以下方法成功检索各种其他属性字符串: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之前”登录的属性或类似
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=*))