Меня попросили взглянуть на службу Windows, которая извлекает данные из дерева Active Directory с помощью Win32 LDAP API и выводит данные 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 чтобы увидеть, есть ли атрибут для входа в систему до Windows 2000 или что-то подобное в надежде, что я мог бы просто добавить это как другой 'szAttribute' (вместо «uUsnChanged» в этом примере) и не повезло.Глядя на API, я не смог найти способ получения этой информации.
я нашел атрибут 'sAMAccountName', который, как я думал, предоставит необходимую информацию, но он дает мне только имя часть формата DOMAIN / name .Как правило, это другая часть, которую я хочу!
У кого-нибудь есть идеи, как получить строку 'pre windows 2000' из 'pEntry'?
@ JPBlancТеперь мы получаем правильный атрибут nETBIOSName при запуске его на тестовом сервере.Приложение работает в предположении, что на каждый контроллер домена может приходиться не более одного атрибута 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 "
затем выполняет поиск с использованием ldap_search_s(pLdap,szPartitionNC,LDAP_SCOPE_SUBTREE,TEXT("(nETBIOSName=*)"),pszAttrs,FALSE,&pResults);
, затем просматривает результаты в поисках чего-либо с атрибутом 'nETBIOSName' и, как только находит его, прерываетсявне цикла и возвращает значение.
Знаете ли вы, достаточно ли это для работы в любой конфигурации AD?