Windows LDAP组用户检查C或C ++(或Ada 95)

时间:2012-02-15 10:29:27

标签: c++ c ldap ada

我需要一个C或C ++函数(实际上我需要在Ada 95中,但是pragma import可以毫无问题地使用 - 我不能使用-gnat05开关)来检查用户是否存在LDAP网络组。

为了获取用户名,我在C中有GetEnv函数,我可以在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 ++中,(甚至在Ada中都是Check_LDAP_Authentication (Username : String) return Boolean)。我该怎么办?

提前致谢。

更新

我在How to write LDAP query to test if user is member of a group?上发现了一个帖子,它表达得非常好(使用C#/ VB.Net和System.DirectoryServices)我需要做什么,只是我需要一个Ada 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");
}

2 个答案:

答案 0 :(得分:0)

首先,您的Command变量也应该是chars_ptr类型,并且应该包含\ 0作为结束。如果它适合你,你就是幸运的。确保之后释放chars_ptr。有关示例,请参阅http://www.dwheeler.com/lovelace/s16s2.htm

Ada有一个LDAP绑定:http://savannah.nongnu.org/projects/adaldap/ - 但似乎非常不活跃。

AWS也支持LDAP。请参阅此处以获取示例:http://www.adacore.com/wp-content/files/auto_update/aws-docs/aws.html#LDAP

答案 1 :(得分:0)

根据我的理解,您需要多次LDAP调用。为什么不在Ada95中只编写一个非常薄的绑定来与OpenLDAP链接?或直接从this small tutorial启发的C代码(但使用当前的OpenLDAP API)并从Ada调用它?

对于第一个解决方案,我认为您需要致电

它不像使用现有的Ada库那么简单,但应该可以解决这个问题。

希望有所帮助