Option Explicit '------------------------------------------------------------------------- ' findsmtp.vbs ' ' Beschreibung: Sucht Objekte einer angegebenen Mailadresse ' ' Laufzeitfehler werde nicht abgefangen und beenden das Skript. ' ' Script ermittelt, ob die uebergebene SMTP-Adresse im AD zu finden ist ' wenn ja dann wird die der DN des Objects zurückübergeben. ' Wildcards sind moeglich, aber nur das erste Element wird beantwortet ' ' Das Skript wird mit den Berechtigungen des angemeldeten Benutzers ' ausgeführt. Die entsprechenden Berechtigungen sind sicher zu stellen ' ' (c)2004 Net at Work Netzwerksysteme GmbH ' ' Version 1.0 (7. Juni 2004) Frank Carius ' Version 1.1 (06.Dez 2005) Frank Carius ' Umstellung auf Klasse ' Version 1.2 (21. Nov 2005) Frank Carius ' Entfernen der Wildcards bei Suche -> bessere Ergebnisse nud viel schneller '------------------------------------------------------------------------- Dim objArgs Dim SMTPAddress Dim oSMTPSearcher WScript.Echo ("FindSMTPMail: gestartet") Set objArgs = WScript.Arguments If objArgs.Count = 1 Then SMTPAddress = objArgs(0) 'ersten Parameter der Kommandozeile lesen Else WScript.Echo ("FindSMTP: Bitte EINE Mailadresse als Parameter angeben") WScript.Quit End If WScript.Echo ("FindSMTPMail: Searching for:"& SMTPAddress) set oSMTPSearcher = new FindProxyMail ' required für searching select case oSMTPSearcher.Search("SMTP:"&SMTPAddress) case 0 ' Noch kein Objekt mit der Mailadresse vorhanden WScript.Echo ("FindSMTPMail:"& SMTPAddress & " ist noch nicht benutzt") case 1 ' Genau ein Object gefunden WScript.Echo ("FindSMTPMail: "& SMTPAddress & " einmal gefunden") WScript.Echo ("FindSMTPMail: OwnerDN: "& oSMTPSearcher.GetDN("SMTP:"&SMTPAddress)) case else WScript.Echo ("FindSMTPMail: "& SMTPAddress & " MEHRFACH gefunden") WScript.Echo ("FindSMTPMail: Anzahl : " & oSMTPSearcher.Search("SMTP:"&SMTPAddress)) WScript.Echo ("FindSMTPMail: OwnerDN: " & oSMTPSearcher.GetDN("SMTP:"&SMTPAddress)) end select WScript.Echo ("FindSMTPMail: Beendet") class FindProxyMail ' Sucht im gesamten AD/GC nach der angegebenen Mailadresse ' .search("smtp:test@firma.de") '.GetDN liefert den ersten eintrag zurück, wenn vorhanden. also immer mit "search" frage, ob es nur genau einen eintrag gibt Dim oConnection 'As ADODB.Connection Dim oRecordset 'As ADODB.Recordset Dim strQuery 'As String Dim oCont 'As IADsContainer Dim oGC 'As IADs Dim strADsPath 'As String Dim objArgs Dim SMTPAddress dim strLastSearch private Sub Class_Initialize strLastSearch = "" Set oCont = GetObject("GC:") 'Global Catalog server suchen For Each oGC In oCont strADsPath = oGC.ADsPath Next Set oConnection = CreateObject("ADODB.Connection") Set oRecordset = CreateObject("ADODB.Recordset") oConnection.Provider = "ADsDSOObject" 'The ADSI OLE-DB provider oConnection.Open "ADs Provider" End Sub private Sub Class_Terminate() Set oCont = Nothing Set oGC = Nothing Set oConnection = Nothing Set oRecordset = Nothing End Sub private sub FillRecordset(wert) strLastSearch = wert strQuery = "<" & strADsPath & ">;(ProxyAddresses=" & wert & ");ProxyAddresses,distinguishedName;subtree" Set oRecordset = oConnection.Execute(strQuery) end sub function Search(byval wert) dim intfound, arrProxylist, strProxyAddress if wert <> strLastSearch then call FillRecordset(wert) intfound = 0 if oRecordset.recordcount > 0 then ' check found records Do until oRecordSet.EOF ' jeden Datensatz einzeln bearbeiten. arrProxylist = oRecordSet.Fields("ProxyAddresses").Value For each strProxyAddress in arrProxylist if lcase(wert) = lcase(strProxyAddress) then ' WScript.Echo ("FindSMTPMail: Besitzer ="& oRecordset.Fields("distinguishedName")) intfound = intfound + 1 end if Next oRecordSet.MoveNext Loop oRecordSet.MoveFirst ' Back to start für later retrieval End If search = intfound ' Number if found records. should be 1 or 0 bzw can be more if duplicate addresses end function function GetDN(byval wert) if wert <> strLastSearch then call FillRecordset(wert) if oRecordset.recordcount = 0 then GetDN = "" else GetDN = oRecordset.Fields("distinguishedName") end if end function end class