Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.11.2013, 10:50   #1
Kverter
 
Регистрация: 06.11.2013
Сообщений: 8
По умолчанию C++ & Active Directory

Всем здравствуйте!!! В общем возникла такая задача написать функции для работы с АД
1 функция должна получать sAMAccountName пользователя
2 функция должна получать UserPrincipalName пользователя
3 функция должна получить список групп безопасности в которых состоит пользователь
я смог это реализовать на VB на плюсах к сожалению пока не могу =( , ниже приведу то что пока сделал. Прошу помощи
Код:
int main() 
{ 
    //IADs *pADs=NULL; 
//VARIANT var; 
    IADsContainer *pContainer; 
HRESULT hr = S_OK; 
LPWSTR path=L"LDAP://CN=xxxx,CN=xxxx,DC=xxxxDC=xxxx,DC=ru"; 
hr = ADsGetObject( path, IID_IADsContainer,(void**)&pContainer); 
 cout<<"OK"<<endl; 
 pContainer->get__NewEnum(); 
 system("PAUSE"); 
if(!(hr==S_OK)) {return hr;} 

}

Последний раз редактировалось Stilet; 21.11.2013 в 12:31.
Kverter вне форума Ответить с цитированием
Старый 21.11.2013, 15:06   #2
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,120
По умолчанию

покажи код на VB
Rififi вне форума Ответить с цитированием
Старый 21.11.2013, 17:48   #3
Kverter
 
Регистрация: 06.11.2013
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Rififi Посмотреть сообщение
покажи код на VB
в общем осталась 3 функция (получения групп)
вот код на vb
PHP код:
Public Function GetUserGroup() As Variant
On Error 
GoTo ErrorHandler
  Set objRootDSE 
GetObject("LDAP://" Path)
    
ReDim Groups(0) As String
'On Error GoTo ErrorHandler
    For Each Grp In objRootDSE.Groups
    '
MsgBox Grp.Name
        ReDim Preserve Groups
(UBound(Groups) + 1)
      
Groups(UBound(Groups)) = Grp.Name
      
'Text3.Text = Text3 + Grp.Name + " "
      '
1
      Next
 GetUserGroup 
Groups()
 GoTo 
Ends:
ErrorHandler:
MsgBox Error "   GetUserGroup"
   
Resume Next
Ends

Kverter вне форума Ответить с цитированием
Старый 21.11.2013, 21:20   #4
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,120
По умолчанию

Kverter

на C++ перекладывается примерно так же, но с некоторыми специфичными особенностями языка и COM

вот заготовка, для подробностей нужно смотреть в msdn
главное - не пользуйся тамошнем стилем кодирования, оно рассчитано на что, чтобы понять основы, но при этом порождает огромное количество мусора и необходимость ручного освобождения ресурсов. смарт-поинтеры из ATL рулят

вот пример как получить список групп и пользователей в них.
и да, домена у меня нет, так что проверил на локальном компе
для упрощения кода все проверки на ошибки убраны.

Код:
CComQIPtr<IADsComputer> comp;
::ADsGetObject(L"WinNT://ИмяКомпа,computer", IID_IADsComputer, (void**) &comp);

CComQIPtr<IADsContainer> container = comp;

IEnumVARIANT* enumer = nullptr;
::ADsBuildEnumerator(container, &enumer);

CComVariant vt;
ULONG fetched = 0;
while (::ADsEnumerateNext(enumer, 1, &vt, &fetched) == S_OK)
{
	CComQIPtr<IADs> ads = V_DISPATCH(&vt);
		
	CComBSTR objectClass;
	ads->get_Class(&objectClass);
	if (objectClass == L"Group") // смотрим только на группы
	{
		CComQIPtr<IADsGroup> grp = ads;
		CComPtr<IADsMembers> members;
		grp->Members(&members);

		CComPtr<IUnknown> unk;
		members->get__NewEnum(&unk);

		CComQIPtr<IEnumVARIANT> it = unk;
		while (it->Next(1, &vt, &fetched) == S_OK)
		{
			ads = V_DISPATCH(&vt);
			CComBSTR name;
			ads->get_Name(&name); // здесь получаем имя пользователя в группе
		}
	}
}
::ADsFreeEnumerator(enumer);
остальные проперти типа "sAMAccountName" получаются через вызов Get
Rififi вне форума Ответить с цитированием
Старый 21.11.2013, 22:25   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Вопрос, что будет со старым содержимым vt при следующем вызове ADsEnumerateNext?
waleri вне форума Ответить с цитированием
Старый 22.11.2013, 13:34   #6
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,120
По умолчанию

waleri

Вопрос, что будет со старым содержимым vt при следующем вызове ADsEnumerateNext?

насчет этого не уверен.
ADsEnumerateNext - это замаскированный вызов IEnumVARIANT::Next, выдает оно наружу интерфейсы, которые сидят в members... так что возможно да, утечка аддрефа.
Rififi вне форума Ответить с цитированием
Старый 25.11.2013, 14:40   #7
Kverter
 
Регистрация: 06.11.2013
Сообщений: 8
По умолчанию

А как извлеч только те группы в которых состоит пользователь?
Kverter вне форума Ответить с цитированием
Старый 26.11.2013, 13:59   #8
Kverter
 
Регистрация: 06.11.2013
Сообщений: 8
По умолчанию

Допустим я получаю getом параметр mamber of в переменую типа VARIANT в ней создается массив safearray как мне вывести это массив?
Kverter вне форума Ответить с цитированием
Старый 26.11.2013, 14:51   #9
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Читаем про SAFEARRAY.
По fFeatures определяем тип массива.
По rgsabound определяем размер массива.
Приводим pvData к нужному типу и извлекаем нужный элемент.
Так же стоит почитать функции для работы с SAFEARRAY - SafeArrayCreate() и так далее.

Ref:
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Active Directory Dimastiks C# (си шарп) 2 15.08.2012 08:03
Работа с Active Directory SuBwooFer Общие вопросы .NET 0 28.12.2009 22:44
Соединение с Active Directory luckyfuck Помощь студентам 6 03.11.2008 13:32
Помощь с Active Directory banzai Windows 1 16.07.2008 21:44