在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集合
怎么找到目录树的节点
程序流程应该如下:
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