LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 765|回复: 4

使用python-ldap访问openldap目录服务器

[复制链接]
发表于 2004-12-22 14:06:20 | 显示全部楼层 |阅读模式
#!/usr/bin/python
#-*- coding:utf-8 -*-                          #设置源码文件编码为utf-8

import ldap                        

try:
   conn = ldap.open("server_name")             #server_name为ldap服务器名
   conn.protocol_version = ldap.VERSION3       #设置ldap协议版本
   username = "cn=admin,dc=company,dc=com"     #用户名
   password = "123"                            #访问密码
   conn.simple_bind(username,password)         #连接

except ldap.LDAPError, e:                      #捕获出错信息
   print e

baseDN = "dc=employees,dc=company,dc=com"      #设置目录的搜索路径起点
searchScope = ldap.SCOPE_SUBTREE               #设置可搜索子路径

retrieveAttributes = None                      #None表示搜索所有属性,['cn']表示只搜索cn属性
searchFilter = "cn=test"                       #设置过滤属性,这里只显示cn=test的信息

try:
   ldap_result_id = conn.search(baseDN,searchScope,searchFilter,retrieveAttributes)                                 
#调用search方法返回结果id
   result_set = []
while 1:
   result_type, result_data = conn.result(ldap_result_id, 0)       #通过结果id返回信息
   if result_data == []:
      break
   else:
      if result_type == ldap.RES_SEARCH_ENTRY:
         result_set.append(result_data)                  

   print result_set[0][0][1]['o'][0]       #result_set是一个复合列表,需通过索引返回组织单元(o)信息

except ldap.LDAPError, e:
   print e
 楼主| 发表于 2004-12-22 14:07:21 | 显示全部楼层
下面是一个修改目录信息的示例:

#!/usr/bin/python
# -*- coding:utf-8 -*-
import ldap

try:
   conn = ldap.open("server_name")
   conn.protocol_version = ldap.VERSION3
   username = "cn=admin,dc=company,dc=com"
   password = "123"
   conn.simple_bind_s(username,password)

except ldap.LDAPError, e:
   print e

try:
   dn = "cn=test,dc=employees,dc=company,dc=com"
   conn.modify_s(dn,[(ldap.MOD_ADD,'mail','test@163.com')])     #增加一个mail属性
except ldap.LDAPError, e:
   print e

ldap.MOD_ADD表示增加属性,ldap.MOD_DELETE表示删除属性,ldap.MOD_REPLACE表示修改属性。
 楼主| 发表于 2004-12-22 14:08:39 | 显示全部楼层
下面是一个增加目录项的示例:

#!/usr/bin/python
# -*- coding:utf-8 -*-
import ldap,ldap.modlist                 #ldap.modlist是ldap的子模块,用于格式化目录服务的数据项

try:
        conn = ldap.open("server_name")
        conn.protocol_version = ldap.VERSION3
        username = "cn=admin,dc=company,dc=com"
        password = "123"
        conn.simple_bind_s(username,password)

except ldap.LDAPError, e:
        print e

try:
        dn = "cn=test,dc=card,dc=company,dc=com"
        modlist = ldap.modlist.addModlist({          #格式化目录项,除对象类型要求必填项外,
        'cn': ['test'],                              #其它项可自由增减                       
        'objectClass': ['top', 'person', 'organizationalPerson', 'inetOrgPerson'],
        'o': ['\xe5\xb9\xbf\xe5\xb7\x9e'],           #这些为utf-8编码的中文
        'street': ['\xe5\xb9\xbf\xe5\xb7\x9e'],
        'sn': ['tester'],
        'mail': ['test@163.下com', 'test@21cn.com'],
        'homePhone': ['xxxxxxxx'], 'uid': ['test'] })
#       print modlist                                #显示格式化数据项,格式化后是一个元组列表
        conn.add_s(dn,modlist)                       #调用add_s方法添加目录项

except ldap.LDAPError, e:
        print e
其实我们也可按格式化后元组列表的形式把目录项直接写到add_s()里,省却转换的步骤。
 楼主| 发表于 2004-12-22 14:09:41 | 显示全部楼层
在线版可在以下网址的Python模块篇里找到:

http://www.ringkee.com/jims/technic_folder/
 楼主| 发表于 2004-12-22 15:51:10 | 显示全部楼层
下面是删除目录项的示例:
#!/usr/bin/python
# -*- coding:utf-8 -*-
import ldap

try:
        conn = ldap.open("server_name")
        conn.protocol_version = ldap.VERSION3
        username = "cn=admin,dc=company,dc=com"
        password = "123"
        conn.simple_bind_s(username,password)

except ldap.LDAPError, e:
        print e

try:
        dn = "cn=sale,dc=company,dc=com"
        conn.delete_s(dn)

except ldap.LDAPError, e:
        print e
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表