用C語言操作LDAP伺服器

2021-03-31 22:37:17 字數 4502 閱讀 4293

畢竟用php操作ldap有侷限性,因為當我們用生成證書的函式生成證書以後不可能再用php去給ldap增加條目,所以最近研究了一下c語言操作ldap,希望能對大家有點借鑑意義,有錯誤的地方還請原諒。至於如何安裝,執行和測試ldap伺服器請看http://.infosecurity..**/forum/read.php?fid=12&tid=47&fpage=1

畢竟用php操作ldap有侷限性,因為當我們用生成證書的函式生成證書以後不可能再用php去給ldap增加條目,所以最近研究了一下c語言操作ldap,希望能對大家有點借鑑意義,有錯誤的地方還請原諒。至於如何安裝,執行和測試ldap伺服器請看http://.infosecurity..**/forum/read.php?fid=12&tid=47&fpage=1

一 初始化ldap庫

#include

#include

ld=ldap_init(ldap_host,ldap_port)

假如沒有進行埠修改的話,用預設的ldap_port就可以了,在ldap.h中定義為389

二 繫結ldap伺服器

if(ldap_bind_s(ld,user_dn,user_pw,authmethod)!=ldap_success)

authmethod是使用的驗證方法,一般為ldap_auth_******,至於user_dn,user_pw就是使用者和密碼拉

可以使用ldap_unbind_s(ldap *ld)來關閉繫結。

三 執行查詢

ldap_search_s(ldap ld,char *base_dn,int scope ,char *filter ,char *attrs_reqired,int attributesonly,ldapmessage **result)

base_dn是指向查詢開始處物件的指標,它可以作為數的頂端,或者某乙個低的點

scope有三個,為

ldap_scope_base,只對基點dn指定的物件進行搜尋

ldap_scope_onelevel,可以搜尋處理基點dn指向物件以及樹中低於基點物件一級的所有物件

ldap_scope_subtree,可以搜尋樹中該物件及以下的所有物件

filter是過濾器,這裡有詳細的解釋http://.infosecurity..**/forum/read.php?fid=12&tid=49&fpage=1

attrs_required是乙個應該返回的null的屬性終止陣列,可以只返回幾個屬性(如就dn和uid),指定null時將返回所有屬性

attributesonly設定為1,只返回屬性的型別,通常設定為0,返回屬性型別和值。

成功返回ldap_success,否則返回出錯**。

例子:ldap_search_s(ld,base_dn,ldap_scope_subtree,null,null,0,&ldap_message_set)

稍後必須釋放ldapmessage **result,int ldap_msgfree(ldapmessage *msg)

查詢過後,我們就需要得到我們具體的感興趣的東西

ldap_count_entries(ld,ldap_message_set)獲取搜尋得到的條目個數

ldap_first_entry(ld,ldap_message_set)獲取第一條

ldap_next_entry(ld,ldap_one_message);獲取下一條

ldap_first_attribute(ld,ldap_one_message,&ber_element_ptr);獲取第一條目的屬性

values= ldap_get_values(ld,ldap_one_message,attribute)獲取該屬性的值

ldap_value_free(values);

ldap_next_attribute(ld,ldap_one_message,ber_element_ptr);獲取下一屬性

可能看這麼多函式有點眼花,那我們來看個例子:

res=ldap_search_s(ld,base_dn,ldap_scope_subtree,null,null,0,&ldap_message_set);

if(res!=ldap_success)

printf("there were %d objects found/n",ldap_count_entries(ld,ldap_message_set));

//獲取第乙個條目

ldap_one_message=ldap_first_entry(ld,ldap_message_set);

while(ldap_one_message)

ldap_value_free(values);

}//繼續下一屬性

attribute=ldap_next_attribute(ld,ldap_one_message,ber_element_ptr);

}//繼續下一條目

ldap_one_message=ldap_next_entry(ld,ldap_one_message);

printf("/n");

}//釋放查詢資訊

(void)ldap_msgfree(ldap_message_set);

由上面的例子可以清楚的看出,可以查詢出所有的搜尋搜尋結果的屬性以及屬性值

四:增加條目

增加條目需要幹的事情就是構造乙個ldapmod結構,它包括物件單個屬性的構造塊

typedef struct ldapmod

mod_vals;

struct ldapmod *mod_next;

}ldapmod;

#define mod_values mod_vals,modv_strvals

#define mod_bvalues mod_vals.modv_bvals

可能你看起來很複雜,那我給你看個例子你就能找到中間的規律拉。

1,   新增乙個國家的條目ldapmod

char *c_vals=;

ldapmod c_attribute;

c_attribute.mod_op=ldap_mod_add;

c_attribute.mod_type="c";

c_attribute.mod_values=c_vals;

2,   你是不是覺得太簡單,那我們來個麻煩點的,證書的ldapmod

struct berval cert_berval;

struct berval *cert_values[2];

char *cert_data;

file *fp;

struct stat st;

ldapmod cert_attribute;

if ( stat( "guest.der", &st ) != 0 )

if ( ( fp = fopen( "guest.der", "rb" ) ) == null )

if ( ( ( cert_data = ( char * )malloc( st.st_size ) ) == null ) ││

( fread ( cert_data, st.st_size, 1, fp ) != 1 ) )

fclose( fp );

cert_attribute.mod_op = ldap_mod_bvalues;

cert_attribute.mod_type = "usercertificate;binary";

cert_berval.bv_len = st.st_size;

cert_berval.bv_val = cert_data;

cert_values[0] = &cert_berval;

cert_values[1] = null;

cert_attribute.mod_values =cert_values;

我們看完這兩個例子那你看出規律了吧,為非是把ldapmod中的幾個變數賦值而已

下面我們把這些值給ldap新增進去

char *objectclass_vals=; guestcertificate是我定義的objectclass

objectclass_attribute.mod_op=ldap_mod_add;

objectclass_attribute.mod_type="objectclass";

objectclass_attribute.mod_values=objectclass_vals;

new_dn="c=**,dc=sage,dc=***";

ldapmod *modst[4];

modst[0]=&c_attribute;

modst[1]=&objectclass_attribute;

modst[2]=null;

if(ldap_add_s(ld,new_dn,modst)!=ldap_success)

現在new_dn就新增好了,呵呵,是不是很簡單。

至於修改條目ldap_mod_s(ldap *ld,char *new_dn,ldapmod *mods)

刪除條目 ldap_delete_s(ldap *ld,char *dn_to_delete)應該沒問題拉。

ldap伺服器搭建

1 linux 環境參考 通過執行 lsb release a lsb version core 4.0 amd64 core 4.0 noarch graphics 4.0 amd64 graphics 4.0 noarch printing 4.0 amd64 printing 4.0 noar...

搭建LDAP伺服器

1.使用ssh協議登陸伺服器 2.更新有效的包。sudo apt get update3.安裝ldap和一些其它ldap相關的工具。sudo apt get install slapd ldap utils4.輸入ldap的管理員密碼。5.執行下列命令啟動配置工具。sudo dpkg reconfi...

封裝JNDI操作LDAP伺服器的工具類1

package com.common.ldapconnection import org.apache.log4j.logger 功能描述 連線ldap的連線屬性 author liaowufeng version 1.0 public class env 建構函式 param factory ld...