Active Directory - список групп
От: Андрей Россия  
Дата: 20.05.11 15:54
Оценка:
Всем доброго времени суток!

Есть такой вопрос: как в AD получить список групп, в которые входит заданная группа?
Для пользователей понятно: IADsUser->Groups, а вот для IADsGroup такого свойства нет
Re: Active Directory - список групп
От: Lonely Dog Россия  
Дата: 21.05.11 13:52
Оценка: 6 (1)
Здравствуйте, Андрей, Вы писали:

А>Всем доброго времени суток!


А>Есть такой вопрос: как в AD получить список групп, в которые входит заданная группа?

А>Для пользователей понятно: IADsUser->Groups, а вот для IADsGroup такого свойства нет
Добрый день!
Я думаю, можно прочитать атрибут memberOf у объекта группы (см. http://msdn.microsoft.com/en-us/library/ms676913(v=vs.85).aspx)
Если не поможет (не знаю, по каким причинам), то сделать LDAP запрос по аттрибуту member.
Если что не понятно, спрашивайте.
Re[2]: Active Directory - список групп
От: Андрей Россия  
Дата: 21.05.11 14:43
Оценка:
Здравствуйте, Lonely Dog, Вы писали:

LD>Здравствуйте, Андрей, Вы писали:


А>>Всем доброго времени суток!


А>>Есть такой вопрос: как в AD получить список групп, в которые входит заданная группа?

А>>Для пользователей понятно: IADsUser->Groups, а вот для IADsGroup такого свойства нет
LD>Добрый день!
LD>Я думаю, можно прочитать атрибут memberOf у объекта группы (см. http://msdn.microsoft.com/en-us/library/ms676913(v=vs.85).aspx)
LD>Если не поможет (не знаю, по каким причинам), то сделать LDAP запрос по аттрибуту member.
LD>Если что не понятно, спрашивайте.

ok, большое спасибо
правда, я что-то никак не пойму, как этот атрибут прочитать
если не сложно — можно ссылочку на то, как работать с атрибутами AD из C++?
Re[3]: Active Directory - список групп
От: Lonely Dog Россия  
Дата: 21.05.11 17:54
Оценка: 6 (1)
Здравствуйте, Андрей, Вы писали:

А>ok, большое спасибо

А>правда, я что-то никак не пойму, как этот атрибут прочитать
А>если не сложно — можно ссылочку на то, как работать с атрибутами AD из C++?
См. здесь: http://msdn.microsoft.com/en-us/library/aa746348(v=VS.85).aspx
Обратите внимание на использование GetEx и доступ к элементам multi-value атрибута.
Re[4]: Active Directory - список групп
От: Андрей Россия  
Дата: 07.06.11 04:47
Оценка:
Здравствуйте, Lonely Dog, Вы писали:

LD>Здравствуйте, Андрей, Вы писали:


А>>ok, большое спасибо

А>>правда, я что-то никак не пойму, как этот атрибут прочитать
А>>если не сложно — можно ссылочку на то, как работать с атрибутами AD из C++?
LD>См. здесь: http://msdn.microsoft.com/en-us/library/aa746348(v=VS.85).aspx
LD>Обратите внимание на использование GetEx и доступ к элементам multi-value атрибута.

к сожалению, атрибут memberOf прочитать мне не удалось
оказывается, этот атрибут доступен не всем пользователям
Re[2]: Active Directory - список групп
От: Андрей Россия  
Дата: 07.06.11 04:50
Оценка:
Здравствуйте, Lonely Dog, Вы писали:

LD>Здравствуйте, Андрей, Вы писали:


А>>Всем доброго времени суток!


А>>Есть такой вопрос: как в AD получить список групп, в которые входит заданная группа?

А>>Для пользователей понятно: IADsUser->Groups, а вот для IADsGroup такого свойства нет
LD>Добрый день!
LD>Я думаю, можно прочитать атрибут memberOf у объекта группы (см. http://msdn.microsoft.com/en-us/library/ms676913(v=vs.85).aspx)
LD>Если не поможет (не знаю, по каким причинам), то сделать LDAP запрос по аттрибуту member.
LD>Если что не понятно, спрашивайте.

атрибут memberOf доступен только определенным группам пользователей
а как правильно составить LDAP-запрос по атрибуту member — я не знаю

ActiveDirectory я к сожалению не знаю, а задача стоит
Re[2]: Active Directory - список групп
От: Андрей Россия  
Дата: 07.06.11 09:44
Оценка:
Здравствуйте, Lonely Dog, Вы писали:

LD>Здравствуйте, Андрей, Вы писали:


А>>Всем доброго времени суток!


А>>Есть такой вопрос: как в AD получить список групп, в которые входит заданная группа?

А>>Для пользователей понятно: IADsUser->Groups, а вот для IADsGroup такого свойства нет
LD>Добрый день!
LD>Я думаю, можно прочитать атрибут memberOf у объекта группы (см. http://msdn.microsoft.com/en-us/library/ms676913(v=vs.85).aspx)
LD>Если не поможет (не знаю, по каким причинам), то сделать LDAP запрос по аттрибуту member.
LD>Если что не понятно, спрашивайте.

почему-то такой код не работает:

if (LDAP* pLDAP = ldap_init(L"MYDOMAIN", NULL))
{
  CStringW Filter;
  Filter.Format(L"(member:1.2.840.113556.1.4.1941:=(cn=%s))", GroupName);

  LPWSTR Attrs[] = { L"Name", NULL };

  LDAPMessage* pMsg = NULL;
  ULONG dwErr = ldap_connect(pLDAP, NULL);
  dwErr = ldap_search_s(pLDAP, L"OU=groupsOU,DC=mydomain,DC=ru", LDAP_SCOPE_SUBTREE, Filter, Attrs, TRUE, &pMsg);
  if (dwErr != LDAP_SUCCESS)
  {
    hr = HRESULT_FROM_WIN32(dwErr);
  }

  if (pMsg != NULL)
    ldap_msgfree(pMsg);
  ldap_unbind(pLDAP);
}


ldap_search_s возвращает 1 на любой из фильтров, даже если я ставлю простейший фильтр типа "(cn=*)"
что я делаю не так?
Re[5]: Active Directory - список групп
От: Lonely Dog Россия  
Дата: 07.06.11 10:01
Оценка:
Здравствуйте, Андрей, Вы писали:

А>к сожалению, атрибут memberOf прочитать мне не удалось

А>оказывается, этот атрибут доступен не всем пользователям
Андрей, проблему понял.
Сейчас попробую что-нибудь поискать в своих закромах
Re[3]: Active Directory - список групп
От: Lonely Dog Россия  
Дата: 07.06.11 10:26
Оценка:
Здравствуйте, Андрей, Вы писали:

А>ldap_search_s возвращает 1 на любой из фильтров, даже если я ставлю простейший фильтр типа "(cn=*)"

А>что я делаю не так?
Честно говоря, не знаю. Вот так у меня работает:
#define DOMAIN_NAME L"DC=test,dc=local"

int _tmain(int argc, _TCHAR* argv[])
{
  ::CoInitialize(0);
  CComPtr<IDirectorySearch> Root;
  HRESULT hr = ::ADsOpenObject(L"LDAP://" DOMAIN_NAME, 0, 0, 0, __uuidof(IDirectorySearch), (LPVOID*)&Root.p);
  if (FAILED(hr))
  {
    printf("Cannot open domain. 0x%x\n", hr);
    return -1;
  }

  ADS_SEARCHPREF_INFO SearchPrefs[2];
  SearchPrefs[0].dwSearchPref = ADS_SEARCHPREF_SEARCH_SCOPE;
  SearchPrefs[0].vValue.dwType = ADSTYPE_INTEGER;
  SearchPrefs[0].vValue.Integer = ADS_SCOPE_SUBTREE;

  SearchPrefs[1].dwSearchPref = ADS_SEARCHPREF_PAGESIZE;
  SearchPrefs[1].vValue.dwType = ADSTYPE_INTEGER;
  SearchPrefs[1].vValue.Integer = 500;


  hr = Root->SetSearchPreference(SearchPrefs, 2);
  if (FAILED(hr))
  {
    printf("SetSearchPreference failed. 0x%x\n", hr);
    return -2;
  }

  WCHAR* PathColumn = L"ADsPath";
  LPOLESTR Attrs[] = {PathColumn};
  ADS_SEARCH_HANDLE SearchHandle;
    hr = Root->ExecuteSearch(L"member=cn=Domain Admins,cn=users," DOMAIN_NAME,
                    Attrs,
                    1,
                    &SearchHandle);

    if (FAILED(hr))
  {
    printf("Execute failed. 0x%x\n", hr);
    return -2;
  }
    
  hr = Root->GetFirstRow(SearchHandle);
  while (hr == S_OK)
  {
    ADS_SEARCH_COLUMN col;
    hr = Root->GetColumn(SearchHandle, PathColumn, &col);
    if (FAILED(hr))
      printf("GetColumn failed 0x%x", hr);
    else
    {
        printf("%S\n", col.pADsValues->CaseIgnoreString);
        Root->FreeColumn(&col);
    }
    hr = Root->GetNextRow(SearchHandle);
  }

  return 0;
}
Re[4]: Active Directory - список групп
От: Андрей Россия  
Дата: 07.06.11 10:46
Оценка:
Здравствуйте, Lonely Dog, Вы писали:

LD>Здравствуйте, Андрей, Вы писали:


А>>ldap_search_s возвращает 1 на любой из фильтров, даже если я ставлю простейший фильтр типа "(cn=*)"

А>>что я делаю не так?
LD>Честно говоря, не знаю. Вот так у меня работает:

skip

я уже разобрался с ldap_search — оказывается, надо было bind перед поиском сделать
но попробую и твой вариант — он короче получается

сразу еще один вопрос: фильтр должен быть разный для поиска по пользователям и группам?
или один и тот же?
Re[5]: Active Directory - список групп
От: Lonely Dog Россия  
Дата: 07.06.11 10:47
Оценка:
Здравствуйте, Андрей, Вы писали:

А>сразу еще один вопрос: фильтр должен быть разный для поиска по пользователям и группам?

А>или один и тот же?
Что ты имеешь ввиду?
Re[6]: Active Directory - список групп
От: Андрей Россия  
Дата: 07.06.11 11:13
Оценка:
Здравствуйте, Lonely Dog, Вы писали:

LD>Здравствуйте, Андрей, Вы писали:


А>>сразу еще один вопрос: фильтр должен быть разный для поиска по пользователям и группам?

А>>или один и тот же?
LD>Что ты имеешь ввиду?

мне нужно решить две задачи:
1. найти список групп для определенного пользователя (с учетом того, что группы, в которые он входит, в свою очередь входят еще и в другие группы)
2. найти список групп для определенной группы (опять-таки с учетом того, что группы, в которые она входит, в свою очередь входят еще и в другие группы)

вот я и хотел уточнить: запросы в этом случае должны быть разные или как?
кстати, твой код с IDirectorySearch у меня не работает — возвращает NO_DATA
впрочем, ldap_search тоже ничего не возвращает
я в нашем домене обладаю правами обычного пользователя — может из-за этого?
Re[7]: Active Directory - список групп
От: Lonely Dog Россия  
Дата: 07.06.11 12:16
Оценка:
Здравствуйте, Андрей, Вы писали:

А>Здравствуйте, Lonely Dog, Вы писали:


LD>>Здравствуйте, Андрей, Вы писали:


А>>>сразу еще один вопрос: фильтр должен быть разный для поиска по пользователям и группам?

А>>>или один и тот же?
LD>>Что ты имеешь ввиду?

А>мне нужно решить две задачи:

А>1. найти список групп для определенного пользователя (с учетом того, что группы, в которые он входит, в свою очередь входят еще и в другие группы)
А>2. найти список групп для определенной группы (опять-таки с учетом того, что группы, в которые она входит, в свою очередь входят еще и в другие группы)

А>вот я и хотел уточнить: запросы в этом случае должны быть разные или как?

Если делать как у меня, то запрос будет один и тот же.
А>кстати, твой код с IDirectorySearch у меня не работает — возвращает NO_DATA
Имя целевой группы правильное? У меня первый запуск тоже ничего не выдал, т.к. я забыл cn=users.

А>впрочем, ldap_search тоже ничего не возвращает

А>я в нашем домене обладаю правами обычного пользователя — может из-за этого?
Все может быть. Попробуй запустить ADSI Edit, открой любую из групп (которую ты ожидаешь увидеть) и посмотри ее security descriptor. Есть ли у тебя права на чтение?
Re[8]: Active Directory - список групп
От: Андрей Россия  
Дата: 07.06.11 12:47
Оценка:
Здравствуйте, Lonely Dog, Вы писали:

skip

А>>вот я и хотел уточнить: запросы в этом случае должны быть разные или как?

LD>Если делать как у меня, то запрос будет один и тот же.

ok

А>>кстати, твой код с IDirectorySearch у меня не работает — возвращает NO_DATA

LD>Имя целевой группы правильное? У меня первый запуск тоже ничего не выдал, т.к. я забыл cn=users.

я один в один твой запрос содрал, заменив только имя домена

А>>впрочем, ldap_search тоже ничего не возвращает

А>>я в нашем домене обладаю правами обычного пользователя — может из-за этого?
LD>Все может быть. Попробуй запустить ADSI Edit, открой любую из групп (которую ты ожидаешь увидеть) и посмотри ее security descriptor. Есть ли у тебя права на чтение?

ADSI Edit к сожалению у меня нет
но есть ADExplorer от SysInternals — он показывает, что права у меня есть
и memberOf, кстати, он тоже возвращает

вот что он показывает для меня:

CN=TFS Developers,OU=TFS Groups,OU=Группы,DC=xxx,DC=yy
CN=Направление разработки системного ПО,OU=Направление разработки системного ПО,OU=xxx,DC=xxx,DC=yy


а это для TFS Developers

CN=TFS NRSPO,OU=TFS Groups,OU=Группы,DC=xxx,DC=yy


и для Направление разработки системного ПО

CN=gNrspo,OU=DFS Groups,OU=Группы,DC=xxx,DC=yy
CN=прикладные разработчики,OU=Группы,DC=xxx,DC=yy


в общем, я все больше в непонятках
видимо, руки у меня кривые
Re[9]: Active Directory - список групп
От: Lonely Dog Россия  
Дата: 07.06.11 12:49
Оценка:
Здравствуйте, Андрей, Вы писали:

У вас домен какого уровня? Mixed, Interim, Native?
Спроси у админов. Если не Native, я попробую поднять такой же у себя.
Re[10]: Active Directory - список групп
От: Андрей Россия  
Дата: 07.06.11 15:09
Оценка:
Здравствуйте, Lonely Dog, Вы писали:

LD>Здравствуйте, Андрей, Вы писали:


LD>У вас домен какого уровня? Mixed, Interim, Native?

LD>Спроси у админов. Если не Native, я попробую поднять такой же у себя.

Хорошо, узнаю.
Re[10]: Active Directory - список групп
От: Андрей Россия  
Дата: 08.06.11 04:10
Оценка:
Здравствуйте, Lonely Dog, Вы писали:

LD>Здравствуйте, Андрей, Вы писали:


LD>У вас домен какого уровня? Mixed, Interim, Native?

LD>Спроси у админов. Если не Native, я попробую поднять такой же у себя.

Все, я разобрался
Через IDirectoryObject все заработало, так что LDAP-запросы оказались не нужны.

Проблема, похоже, была в том, что IADs, IADsGroup и IADsUser получались через WINNT-провайдера (этот код был написан не мной, много лет назад).
А WINNT-провайдер, видимо, не поддерживает "memberOf".

В свою очередь, IDirectoryObject я могу получить только через LDAP-провайдера, зато он правильно возвращает список групп
Теперь осталось разобраться, как вместо "WINNT://domain/name" подсунуть "LDAP://CN=user,OU=groupOU,DC=domain,DC=ru"
Re[11]: Active Directory - список групп
От: Lonely Dog Россия  
Дата: 10.06.11 12:18
Оценка:
Здравствуйте, Андрей, Вы писали:

А>Здравствуйте, Lonely Dog, Вы писали:


LD>>Здравствуйте, Андрей, Вы писали:


LD>>У вас домен какого уровня? Mixed, Interim, Native?

LD>>Спроси у админов. Если не Native, я попробую поднять такой же у себя.

А>Все, я разобрался

А>Через IDirectoryObject все заработало, так что LDAP-запросы оказались не нужны.

А>Проблема, похоже, была в том, что IADs, IADsGroup и IADsUser получались через WINNT-провайдера (этот код был написан не мной, много лет назад).

А>А WINNT-провайдер, видимо, не поддерживает "memberOf".

А>В свою очередь, IDirectoryObject я могу получить только через LDAP-провайдера, зато он правильно возвращает список групп

А>Теперь осталось разобраться, как вместо "WINNT://domain/name" подсунуть "LDAP://CN=user,OU=groupOU,DC=domain,DC=ru"
Дык, а что есть на входе то? Имя пользователя в формате domain\name?
Можно использовать TranslateName или IADsNameTranslate.
Re[12]: Active Directory - список групп
От: Андрей Россия  
Дата: 12.06.11 17:20
Оценка:
Здравствуйте, Lonely Dog, Вы писали:

skip

LD>Дык, а что есть на входе то? Имя пользователя в формате domain\name?

LD>Можно использовать TranslateName или IADsNameTranslate.

ага, именно так уже и сделал
большое спасибо за помощь
Re[13]: Active Directory - список групп
От: Lonely Dog Россия  
Дата: 13.06.11 07:43
Оценка:
Здравствуйте, Андрей, Вы писали:

А>Здравствуйте, Lonely Dog, Вы писали:


А>skip


LD>>Дык, а что есть на входе то? Имя пользователя в формате domain\name?

LD>>Можно использовать TranslateName или IADsNameTranslate.

А>ага, именно так уже и сделал

А>большое спасибо за помощь
Для этого RSDN и нужен
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.