云开 发表于 2009-1-2 11:38:42

如何用ADSI实现自动化的活动目录操作

  网管们都应该知道,脚本对于减轻工作量来说是非常有用的。通过脚本,以前需要手工数小时才能完成的工作,现在只需要完全交给电脑自动处理就可以了。比如建立一个Visual Basic Scripting Edition (VBS),Windows Management Instrumentation (WMI)就可以自动完成Windows系统中的多种任务。
  
  而我们今天介绍的另一种脚本技术可以实现活动目录的自动化操作,这就是活动目录访问接口(Active Directory Service Interfaces ,ADSI)。使用ADSI,你可以完成任何通过Active Directory GUI界面可以完成的工作,比如创建、删除、修改目录对象(容器、用户、组,等等)。另外,ADSI可以通过查询目录来快速获得目录信息。
  
  下面我就来介绍一下ADSI以及它对活动目录的基本操作。
  
  绑定到目录
  和使用Visual Basic 的GetObject方法绑定到WMI一样,你也可以基于Lightweight Directory Access Protocol (LDAP)使用GetObject方法绑定目录。在ADSI脚本中,首先需要指定一个LDAP驱动,这实际上是一个名为adsldp.dll的文件,只不过我们要加一个“LDAP:”作为前缀。这和我们使用WMI脚本的方法类似,只不过在WMI脚本中前缀变成了“Winmgmts:”。另外,你必须指定目录对象的路径,比如域、部门单元、用户组或者用户。LDAP驱动和目录路径结合起来被称为AdsPath。在这段代码中,我们会将LDAP和acme.com 域的Marketing单元绑定在一起。
  
  在代码中我们会注意到,第一,AdsPath是被引号和括号包围的。我们在编辑ADSI脚本或其他任何脚本时,都应该使用纯文本编辑器,比如Notepad,因为在Microsoft Word中带有智能标记功能,由它编写出来的脚本代码不会被主机识别出来。第二,注意我们是如何设计对象路径的。所有域名都采用了两个字符来标识,而这两个字符并不是随便写的,它们被称为Attribute Type。它与Object Class一起使用,用来标明是属于容器对象还是叶子对象。表A列出了这种表示方法的含义。
   
www.ad119.cn/bbs/attachments/computer/20090102/20091211351357877801.JPG

  举个例子,假如我们希望绑定westcoast.acme.com域中Finance OU里面Managers组的成员Mary,我们可以使用这段代码。
  
  另外,对于用户和组来说,cn属性类型也表示容器,比如"Users"、"Computers"、"Domain Controllers"等。
  
  绑定之后
  正如我们所期望的,当我们将对象绑定到活动目录后,就可以执行四种基本的操作了。每种操作都由一种方法实现,如表B所示。
  
www.ad119.cn/bbs/attachments/computer/20090102/20091211351490677802.JPG

  如果打算使用其中任何一种方法,还需要在语句中以参数的形式提供相应的信息,比如“创建什么内容?”之类的。假设现在我们要在acme.com的Marketing OU中创建一个名为MSmith的用户,我们可以使用这段代码 。
  
  代码中前两行表示告诉脚本要绑定到活动目录,然后建立一个名为MSmith 的User对象类。接下去两行看起来可能会有些陌生,下面我就来解释一下。对于一个用户,他具有多种属性可以进入存储在活动目录的数据库(查看User属性就能看到了),比如电话号码、姓名、办公室位置等。在这些属性中,只有用户名即代码中的“sAMAccountName”是建立用户所必须的。因此第三行使用Put方法修改第二行所建立的用户的属性。当然,我们也可以再添加一些别的属性。
  
  第四行是用来将修改(创建对象或修改属性等动作)提交给活动目录的,它使用了一个叫做SetInfo的方法。如果没有这最后一行代码,脚本不会对活动目录产生任何影响。
  
  我们还可以使用Get方法获取活动目录对象的属性。通过这段代码,我们显示了Marketing OU中的description属性。
  
  rootDSE
  在上面任何一个代码范例中,我们都没有指定服务器名,这是由于ADSI支持“无服务器绑定”,也就是我们不需要输入域控制器的名称。借由这种特性,我们其实也不必输入AdsPath。当然我们可以将脚本绑定到根目录,也就是所谓的Root Directory Service Entry (rootDSE),然后利用它的属性绑定到当前的域。
  
  具体的做法是通过rootDSE中一个被称作defaultNamingContext的属性找到AdsPath,然后再利用AdsPath绑定到当前域。这里的“当前域”是指用户登录的域。假设当前域为westcoast.acme.com,这段代码 显示了如何不注明AdsPath即可进行绑定。
  
  在代码中,我们首先绑定到rootDSE,然后利用Get方法获得了defaultNamingContext属性并将其赋值给一个字符串变量。最后我们使用这个字符串变量作为域名的引用。在这个例子中,字符串变量strADsPath的实际值应该是LDAP://DC=westcoast, DC=acme, DC=com 。
  
  绑定变量到rootDSE的好处在于,不管当前的域是什么都可以使用同一脚本。为了显示这种方法的实用价值,我们在自己的活动目录实验室中进行了测试,目标是在三个不同的域中各建立500个用户,其用户名分别为User1、User2......以此类推。你可以想象,假如采用活动目录的GUI界面,我们需要花费多长的时间才能创建完这些用户。而当我们在每个域中都采用这段脚本,你会发现完成这个任务是一件相当简单的事情。
  
  实际上,有关ADSI的内容远不止我们在这篇文章中所涉及到的。想获取更多有关 ADSI的知识,请访问微软MSDN网站上的 "Using Active Directory Service Interfaces" 。
  
   <
页: [1]
查看完整版本: 如何用ADSI实现自动化的活动目录操作