Version 3 of ActiveDirectoy Query using Twapi COM

Updated 2017-11-06 19:59:07 by MHo
package require twapi
twapi::import_commands
 
#
# Ported by MHo from VBScript: Windows Script Referenz, T.Weltner, S. 306
# 

namespace eval adtools {

   proc attrFromEMail {mail attr} {
       catch {searchAD "(&(objectCategory=person)(objectClass=user)(mail=$mail))" $attr} ret
       return $ret
   }

   ### Parameter:
   #   LDAP-Suchfilter
   #   Liste von Attributen (durch , getrennt), die zurückgegeben werden sollen
   # Achtung: Fehler werden hier nicht abgefangen!
   #

   proc searchAD {filter return} {

        # ADODB-Verbindung einrichten
        set connection [comobj "ADODB.Connection"]
        $connection -set Provider "ADsDSOObject"
        $connection Open  

        # Abfrage formulieren
        set command [comobj "ADODB.Command"]
        $command -set ActiveConnection $connection

        # ADsPath der Domäne ermitteln
        set rootDSE [comobj_object "LDAP://rootDSE"]
        set ADsPath [$rootDSE -call Get defaultNamingContext] 

        # Kommando konstruieren
        set query "<LDAP://${ADsPath}>;$filter;$return;subtree" 

        # Kommando ausführen
        $command -set CommandText $query
        set recordSet [$command Execute]
        set ret [list]

        if {[$recordSet RecordCount]} {

           while {![$recordSet EOF]} {

               # puts [$recordSet GetString]
               set d [dict create]
               set o [$recordSet Fields]

               for {set i 0} {$i < [$o Count]} {incr i} {
                   set item [$o item $i]
                   dict set d [$item Name] [$item Value]
               }
               lappend ret $d
               $recordSet MoveNext
           }
        }
        return $ret
   }
}

### Tests

if {[info exists argv0] && [file tail [info script]] eq [file tail $argv0]} {
   puts [::adtools::attrFromEMail "[email protected]" "HomeDirectory"]
   puts [::adtools::attrFromEMail "[email protected]" "HomeDirectory,cn"]
   puts [::adtools::attrFromEMail "Test.*@xyz.de" "HomeDirectory,sAMAccountName"]
   puts [::adtools::attrFromEMail "*@xyz.de" "sAMAccountName"]
}