欢迎光临
我们一直在努力

以前收集到的一些资料—使用ADSI开发NT目录服务会出现的一些问题及解决办法(I)

建站超值云服务器,限时71元/月

使用asp开发nt目录服务会出现的一些问题(i)

有关adsi的资料真是难找,技术虽然很好,可惜300多页的sdk我可真看不动
要是哪位大侠有空的话,能够帮我翻译就好了,呵呵。
现在只好将就着翻译一些短小的文章了,哎。匆忙之间翻译成的,错误肯定不
少,还希望大家谅解。
使用到的技术还是我前面提到的adsi,这一节的重点放在操纵目录树上。
目录服务(dn)在贯穿了整个nt领域。几乎每一个管理任务最终都会
去改变系统目录中的某一个目录。象加入新用户到组里面,新建一个
互联网网站,或则更新电子邮件目录等等。注意的是,windows2000
的活动目录已经支持这个技术。
微软已经提供了一些功能很强大的com接口来访问不同的目录服务。
ads 命名空间和provider
ads provider的概念和odbc结构很相象,例如oracle的odbc驱动器让一台机器连接到
oracle的数据库中,但是这并不意味着这个数据库确实存在。
同样的关系也使用与adsi,它是一个适用与不同的目录命名空间的公共接口。
也许这个目录命名空间存在与网络中。
在一个典型的服务器上,当安装了正确的工具箱后,你会找到三个ads provider
他们是:
     winnt: – 给nt及其网络用的
     iis: – 给iis用的
     ldap: – 给ms exchange和windows200的活动目录用的
也许你还会发现下面的provider
     nwcompat: – 给novell 3.1用的
     nds: – 给novell directory services用的
每一个命名空间对象都由目录服务的根节点集组成,典型的例子是
nt的domain或者server,但不是所有的provider都能够自动发现根目录节点。
你能够绑定到一个winnt:对象上它会提供一个nt域列表
但是对于iis和ldap的命名空间对象,则既没有iis也没有ms exchange的根节点.
在使用的时候而必须要被指明。

容器,会员,集合
对于大部分而言,目录是一个分层目录结构的对象同时它还包容了其他的对象
举例来说,一个物理的iis服务器有多个网站,每个网站还可以有多个目录(
或则网站的运用程序),而这些目录还有子目录。
一个nt的domain能够有多个服务器等等。

在adsi术语中,所有上面的容器对象又包容其它对象,就组成了命名空间树。
典型的代码如下:
  set oads = getobject("winnt://mydomain")

  for each oadschild in oads

           do something

  next

分层目录模型并不能够完全描述对象之间的关系。个别而言,nt的用户和组对象
约束与domain 和 server对象,但是他们之间又有一个附加的会员关系。
adsi对象模型通过.groups和.menmbers属性来表示会员关系
例如一个典型的列表如下:
  set oads = getobject("winnt://mydomain/administrator")
  for each oadsgroup in oads.groups
           do something
  next
   …
  set oads = getobject("winnt://mydomain/domain users")
  for each oadsmember in oads.members
           do something
  next
仔细观察上面的代码的微妙的不同之处
对一个对象本身执行列表,将返回它的子层。
对一个对象的.member属性执行列表将返回它的会员列表。
最后,还有一些动态集合来表示那些暂时独立的对象。
一个典型的例子是在打印队列中的任务.printjobs集合

schema对象
每个ads对象都联系在一个schema对象,来表示它的性能和特征
我们在写代码的时候经常碰到这样的问题:我的对象到底支持那些属性
这是一个容器对象,或则对象有可能包含什么样的类型。
例如,在原则上,一个目录服务本身就是一个彻底的schema对象。

准备运行程序
这个ads浏览程序需要有一定的安全权限才能够运行。
拷贝这个ads浏览文件到你的网络中的一个共享的目录中
映射一个虚拟的web目录
指派这个目录有管理者的权限。

看一看命名空间树

在这里使用了微软的htmlhelp java applet.
它能够产生我们需要的树状结构。尤为重要的是它能够提供对子树的支持
因为我并不愿意拿我的整个目录树来冒险。
一个有关htmlhelp applet的讨论会远远超出现在的话题,下面就只给出很简短的版本:
  <ul>
    <!– … –>
    <li>iiswebserver objects
    <ul>
      <li> 1
      <!– on click: 显示页面
      adsproperties.asp?adspath=iis://myserver/w3svc/1} –>
      <ul>
        <!– on expand: 显示下一级
        adstreehhc.asp?adspath=iis://myserver/w3svc/1 –>
      </ul>
      <li> 2
      <!– on click: 显示页面
      adsproperties.asp?adspath=iis://myserver/w3svc/2} –>
      <ul>
        <!– on expand: 显示下一级
        adstreehhc.asp?adspath=iis://myserver/w3svc/2 –>
      </ul>
      <!– … –>
    </ul>
  <!– … –>
  </ul>

怎么找到目录树的节点
程序流程应该如下:
1。绑定到一个目录对象
2。查找与之关联的schema类
3。如果它是一个容器对象,那么
     for all 可能的容器 in 这个对象 (通过schema得到)
         对所有的对象进行实现
     使用htmlhelp applet生成<li>…
在实现过程中,其实一共才10行代码,但是每一行代码都有起自己的难点
掌握了它们你就能够实现很多其它美妙的功能。

难点一:查找schema类对象
第一个难点就是并不是所有的ads对象都有真正有一个schema. 一段程序段如下
          set oads = getobject(vadspath)
          set oadsclass = getobject(oads.schema)
对于一些高一级的对象来说这段代码将会失败.必须再加一点异常处理。
  function getclass(oads)
          on error resume next
          set getclass = nothing
          set getclass = getobject(oads.schema)
  end function
  set oadsclass = getclass(oads)
  if typename(oadsclass) <> "nothing" then
   do something
  end if

通过管理一个schema类,我们查看它的.container属性来决定我们处理的容器类型。
接着当我们使用它的.containment数组来得到对象的类。
举例来说,一些domain对象将返回一个schema类数组,其中包含有
字符串"computer", "user", "group", 和 "schema".
理论上的代码如下
  if oadsclass.container then
          vcontainment = oadsclass.containment
          for vidx=0 to ubound(vcontainment)
                  oads.filter = array(vcontainment(vidx))
                  for each oadschild in oads
                           write an <li>… entry
                  next
          next
  end if
但是又出现问题了,这个方法有时候不能够工作。一个winnt domain的.containment数组
仅仅返回本来是4个对象类中的3个.而ldap的provider根本就不执行.container和.containment属性
这样我们就没法再使用上面的代码了,只好针对这些怪异的现象造出一些怪异的代码了
其它奇怪的地方
下面是一些很怪异的代码,例如nt的lanmanserver对象可以想象它应该有一个fileservice 类
并且包含有一个fileshare类对象.正确的代码如下:
  set oads = getobject("winnt://mydomain/myserver/lanmanserver")
但是很不幸的是当我们调用它的父节点时将会出错
  set oads = getobject("winnt://mydomain/myserver")
  oads.filter = array("fileservice")
  for each oadschild in oads
           这里的代码将永远不会执行
  next
下面类似的办法也会出错:
  set oads = getobject("winnt://mydomain/myserver")
  for each oadschild in oads
          if oadschild.name = "lanmanserver" then
            for each oadsgrandchild in oadschild
                       出错
             next
          end if
  next
这是为什么呢,其实lanmanserver有一个双重身份.它是一个fileservice对象
但同时它也是一个普通的service对象。所以下面这段怪异的代码就产生了:
  for each oadschild in oads
          if oadschild.name = "lanmanserver" then
                  set oadschild = getobject(oadschild.adspath)
                  for each oadsgrandchild in oadschild
                           终于成功了
                  next
          end if
  next

对象性质:
同上面相比,对象的属性相对容易获得。每个对象可以想象得到都有一个核心的属性。
比如name,通过这个相同的属性能够很容易的使用对象:
  vadsname = oads.name
大多数对象还有这样的属性.mandatoryproperties 和 .optionalproperties , 这都能够通过他们
的schema类得到,它们的数值可以通过对象的.getex方法得到:
  for each vprop in oadsclass.mandatoryproperties
          vpropvalue = oads.getex(vprop)
  next

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 以前收集到的一些资料—使用ADSI开发NT目录服务会出现的一些问题及解决办法(I)
分享到: 更多 (0)

相关推荐

  • 暂无文章