извлечение имени входа до входа в Windows 2000 из объекта LDAPMessage в win32api C ++ - PullRequest
0 голосов
/ 03 июня 2011

Меня попросили взглянуть на службу 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?

Ответы [ 2 ]

2 голосов
/ 03 июня 2011
1 голос
/ 03 июня 2011

Будьте внимательны, доменная часть «домена pre 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=*))
...