AD & ADSI入门[2]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 mittermeyer 的 blog

"interfaces"=hex(7):7b,00,32,00,35,00,31,00,35,00,30,00,46,00,34,00,31,00,2d,\
  00,35,00,37,00,33,00,34,00,2d,00,31,00,31,00,44,00,32,00,2d,00,41,00,35,00,\
  39,00,33,00,2d,00,30,00,30,00,43,00,30,00,34,00,46,00,39,00,39,00,30,00,44,\
  00,38,00,41,00,7d,00,00,00,7b,00,32,00,35,00,31,00,35,00,30,00,46,00,34,00,\
  30,00,2d,00,35,00,37,00,33,00,34,00,2d,00,31,00,31,00,44,00,32,00,2d,00,41,\
  00,35,00,39,00,33,00,2d,00,30,00,30,00,43,00,30,00,34,00,46,00,39,00,39,00,\
  30,00,44,00,38,00,41,00,7d,00,00,00,00,00

 
  • 扩展schema
    首先,我们知道attributeschema和classschema都存储在同一个层次下,我们可以通过这样的路径访问:ldap://computername/schema 之下(另外一种访问路径是cn=schema,cn=configuration,<dc=forestroot>),所以在这个container下我们可以枚举到整个ad中所有的attributeschema和classschema。但是我发觉有一个有趣的现象,如果不是以域用户的身份去访问,那么不能得到全集,获得的是abstract class和相关的属性,无法得到structure class,例如:user。
    其次,针对attributeschema和classschema都有一些特性:
    oid(governsid),ldap所需要的对象的唯一表示符,这是一个字符串,但是不同于guid根据本机信息生成,而是逐级分配的属性结构,最上层由iso分配,逐级授权,所以很麻烦。ms提供了一个工具oidgen.exe,随windows 2000的resource kit发布,我不知道即使是用这样的工具生成的新id能否运行在实际的扩展系统中,还是必须通过ms的认证。
    schemaidguid,用于访问控制目录中控制访问这个类的对象。通过这个id而不是名称来访问类的对象实例。guid还是非常好处理的,可以通过windows自身的api获得。
    其他的就是各类名称(cn,ldapdisplayname,admindisplayname),在不同的工具或者场合显示区别类或者属性,这些名字只要保证全局唯一即可。此外classschema和attributeschema各有一些特定的必备属性。
 
    扩展schema包括以下几部分的工作:新增/禁止attributeschema,新增/禁止classschema,修改property与classschema的关系。
    新增attributes
chema和classschema,通过iadscontainer.create,在schema存储的路径下新建子节点,然后给必要的属性赋值,最后提交即可。
    禁止attributeschema和classschema,可以通过“废弃”的方式禁止一个现存的类或者属性。即获得这个classschema或者attributeschema,将他的isdefunct属性置为true即可;反之只要将isdefunct属性置为false即可恢复。当然这个操作也存在一系列的限制,例如:禁止一个属性,那么将阻止创建所有所有必须包含该属性的类的实例。
    修改property与classschema的关系,因为决定每一个classschema中包含哪些attributeschema,其实是指定classschema的“mustcontain”和“maycontain”,这两个多值属性(字符串数组)分别表示表示所包含的必要属性和可选属性。反过来,可以通过iadsclass.mandantoryproperties和iadsclass.optionalproperties读取。
 
  • 实现provider
    暂时没有研究。
 
 
实例
  • 枚举对象。下面这个例子枚举了所有通过rc的接口添加到ad中的用户组和帐号。此例中iadscontainer.filter为一个需要筛选的类名数组,如果为空,则表示返回所有类型的对象。
public function enumgroups() as vba.collection
    dim addomain as iadscontainer
    dim adgroup as iadsgroup
    dim nresult as vba.collection
   
    if m_sadmin <> vbnullstring then
        set addomain = m_adroot.opendsobject("ldap://" & m_sexchserver & "/cn=users," & m_sdomain, _
                                    m_sadmin, m_sadminpwd, ads_secure_authentication)
    else
        set addomain = getobject("ldap://cn=users," & m_sdomain)
    end if
    if addomain is nothing then exit function
   
    set nresult = new vba.collection
    addomain.filter = array("group","user"”)
   
    on error resume next
    dim sname as string
    dim stype as string
    for each adgroup in addomain
        sname = right(adgroup.name, len(adgroup.name) - 3)  ' filter "cn="

本文关键:AD,ADSI,VB
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top