在Powershell(PS)脚本或.Net活动目录编程时经常需要检查一个AD对象是否存在,但无论是PS的AD模块还是到目前的版本的Framework尚未提供一个直接的方法。本文根据近几年写AD脚本的经验,总结如下:

 

  1.  第一种方法是用调用ADSI静态方法Exists(),其使用的查询可以是上个世纪的WinNT provider也可以是LDAP,使用语法如下:
    [ADSI]::Exists("WinNT://DomainName/SamAccountName");
    [ADSI]::Exists("LDAP://DistinguishedName")
    用WinNT优点是可以不必关心对象的位置,因为NT时代域是没有层次的扁平结构,使用时键盘输入少。两种ADSI方法都有一个缺点,当查询对象存在时返回True,不存在时会返回COMException。需要False时得用try…catch结构来捕捉。

     

  2. 第二种方法是用dsquery命令,这可能是系统管理员觉得比较亲切的方法,这种方法需要使用对象的类型来查询,如user,group,… 在PS 3.0以上是我喜欢用(dsquery user -samid SamAccountName).count来判断存在与否,返回值1刚好表示存在,0表示不存在。

     

  3. 第三种方法实际是程序员使用的DirectoryServices.DirectorySearcher类的FindOne()方法,查询是标准的LDAP查询,其PS实现类似于下面:

    ([adsisearcher]'(&(objectClass=group)(samaccountname=GroupName))').FindOne()
    在PS 3.0以上可以和上面一样,用数组的Count属性1,0判断存在与否。

     

上面总结了笔者使用过的几种方法,不知道看客是不是还有更好的方法,欢迎留言!