Проверка пользователя группы Windows LDAP на C или C++ (или Ada 95)

Мне нужна функция в C или C++ (на самом деле мне нужна в Ada 95, но импорт прагмы можно использовать без проблем - я не должен использовать переключатель -gnat05), чтобы проверить, присутствует ли пользователь в сетевой группе LDAP.

Для получения имени пользователя у меня есть функция GetEnv в C, которую я могу импортировать в Ada 95 в:

function GetUsername return String is
   function GetEnv (Variable : String) return Interfaces.C.Strings.chars_ptr;
   pragma Import (C, GetEnv, "getenv");

   Command : constant String := "USER" & ASCII.Nul;
   Answer_Ptr : constant Interfaces.C.Strings.chars_ptr := GetEnv (Command);
   Answer : constant String := Interfaces.C.Strings.Value (Answer_Ptr);
begin
   return Answer;
end GetUsername;

Итак, мне нужна функция Boolean Check_LDAP_Authentication (char* Username) или что-то подобное в C или C++ (или даже Check_LDAP_Authentication (Username : String) return Boolean в Аде). Как мне это сделать?

Заранее спасибо.

Обновить

Я нашел сообщение на Как написать запрос LDAP, чтобы проверить, является ли пользователь членом группы?, который довольно хорошо выражает (с использованием C#/VB.Net и System.DirectoryServices) то, что мне нужно сделать, просто мне нужна Ада 95 эквивалент.

DirectoryEntry rootEntry = new DirectoryEntry("LDAP://dc=yourcompany,dc=com");

DirectorySearcher srch = new DirectorySearcher(rootEntry);
srch.SearchScope = SearchScope.Subtree;

srch.Filter = "(&(objectcategory=user)(sAMAccountName=yourusername)(memberof=CN=yourgroup,OU=yourOU,DC=yourcompany,DC=com))";

SearchResultCollection res = srch.FindAll();

if(res == null || res.Count <= 0)
{
    Console.WriteLine("This user is *NOT* member of that group");
}
else
{
    Console.WriteLine("This user is INDEED a member of that group");
}

person Rego    schedule 15.02.2012    source источник


Ответы (2)


Во-первых, ваша переменная Command тоже должна иметь тип chars_ptr и должна содержать \0 в конце. Если это сработало для вас, вам просто повезло. Обязательно освободите chars_ptr после этого. См. пример на http://www.dwheeler.com/lovelace/s16s2.htm. .

Для Ады существует привязка LDAP: http://savannah.nongnu.org/projects/adaldap/ - но он кажется очень неактивным.

AWS также поддерживает LDAP. Пример см. здесь: http://www.adacore.com/wp-content/files/auto_update/aws-docs/aws.html#LDAP

person Rommudoh    schedule 15.02.2012
comment
Я не верю, что в удаче что-то есть, просто проанализируйте, почему это работает. Я могу просмотреть саванну и код AWS, может быть, я пойму какой-нибудь намек. Включать библиотеку отверстий — не лучшая идея (посадить дерево, чтобы получить семя, верно?), но осмотр вокруг может помочь. Спасибо. - person Rego; 17.02.2012
comment
Запуск вашего кода в Mac OS X Lion с соответствующей переменной среды (USER, а не USERNAME) приводит к ошибке Dereference_Error. - person Simon Wright; 17.02.2012
comment
... но Command : constant String := "USER" & ASCII.Nul; ведет себя лучше. Однако по-прежнему не рекомендуется (и, как я понимаю, не связано с вашей реальной проблемой). - person Simon Wright; 17.02.2012
comment
Спасибо @SimonWright. Хорошее предложение. Похоже, что это работало для меня раньше, потому что у меня уже была переменная USERNAME, но USER выглядит более общей. - person Rego; 23.02.2012

Насколько я понял, вам понадобится несколько вызовов LDAP. Почему бы вам не написать только очень тонкую привязку на Ada95 для связи с OpenLDAP? Или непосредственно код C, вдохновленный этот небольшой учебник (но с текущим API OpenLDAP) и вызвать его из Ады?

Для первого решения, я думаю, вам нужно будет позвонить

Это не так просто, как использование существующей библиотеки Ada, но это должно сработать.

Надеюсь, поможет

person Frédéric Praca    schedule 03.10.2012