SMTPList.VBS

Alle Skripte sind Muster ohne jede Gewährleistung oder Funktionsgarantie. für Schäden bin ich nicht verantwortlich. Achten Sie auf Zeilenumbrüche bei der Übernahme.

Das folgende sehr einfache Skript macht nicht anderes, als über den GC alle Objekte zu suchen, bei denen das Feld "ProxyAddresses" gefüllt ist und dann diese Adressen in eine Textdatei zu schreiben. Dabei werden nur die SMTP-Adressen extrahiert. Das Skript eignet sich daher dazu,  z.B. regelmäßig eine Liste der internen gültigen SMTP-Adressen zu erzeugen und auf einen Mailserver in der DMZ zu übertragen, der dann anhand dieser Liste alle ungültigen Empfänger gleich ablehnen kann

Sie können natürlich auch mit Programmen wie LDIFDE eine ähnliche Datei erzeugen:

ldifde -f smtplist.txt -d "dc=msxfaq,dc=local" -l proxyaddresses -r "(proxyaddresses=*smtp:*@*)"

Allerdings enthält die Datei dann alle Adressen (Auch X.400, FAX etc.) und zudem einige LDAP-Steuerinformationen.

Das Skript

Laden Sie sich einfach das Archiv bzw. die VBS-Datei herunter.

smtplist.1.0.zip
smtplist.1.0.vbs.txt

Passen Sie bei Bedarf die LDAP-Filter und die Pfade für die Protokoll und Ausgabedatei an.

Der Start erfolgt recht unspektakulär am besten aus einer DOS-Box mit:

CSCRIPT smtplist.1.0.vbs

Die Ausgabe erfolgt standardmäßig in die Datei C:\SMTPLIST.TXT.

Alternativen

Dieses Skript ist vor 2005 entstanden. Da hat noch niemand von der PowerShell gesprochen. Mittlerweile würde ich so eine Abfrage entweder mit Exchange Bordmitteln oder nativ PowerShell machen.

# Mit der Exchange Powershell
get-recipient `
   | Select Name `
      -ExpandProperty EmailAddresses `
   | Select SmtpAddress `
   | ?{$_.smtpaddress -ne $null}
# Abfrage mittels AD-Powershell
Get-ADObject `
   -LDAPFilter "Proxyaddresses=*" ` 
   -Properties proxyaddresses `
| select proxyaddresses `
   -ExpandProperty proxyaddresses `
| ?{$_.tolower().startswith("smtp")} `
| %{$_.tolower().replace("smtp:","")}
# Abfrage direkt per LDAP

([adsisearcher]("proxyaddresses=*")).findall() `
| %{$_.properties.proxyaddresses} `
| ?{$_.tolower().startswith("smtp")} `
| %{$_.tolower().replace("smtp:","")} 

Die drei Beispiele zeigen auch gut, wie viel einfacher so etwas in Powershell zu lösen ist.

Erweiterungen

Ein eigenes VBScript kann aber noch an mehreren Stellen erweitert werden. Denkbar sind z.B.:

  • Export einer Teilmenge von Adressen
    In der Regel hat ein Benutzer mehrere SMTP-Adressen. teilweise handelt es sich auch noch um interne Adressen, die sowieso nicht von extern zu erreichen sind. Das VBScript könnte daher beim Export solche Adressen übergehen, so dass wirklich nur die sinnvollen Adressen exportiert werden.
  • Export bestimmter Objekte
    Nicht jeder, der eine SMTP-Adresse hat, darf auch Mails empfangen. Sie können zwar in Exchange mit "Empfangsbeschränkungen" steuern, wer Mails von wem erhalten kann aber das ist manchmal aufwändig zu konfigurieren. Aber vielleicht pflegen Sie einfach die aus dem Internet erreichbaren oder gerade nicht erreichbaren Empfänger in einer Sicherheitsgruppe oder kennzeichnen diese durch ein Feld im Active Directory. Dann könnte das Skript eben dieses Kriterium nutzen, um nur die Objekte zu exportieren, die wirklich auch eine Mail erhalten dürfen.
  • Direkter Schreibzugriff auf das Zielsystem
    Dies Ausgabe als Textdatei ist natürlich nur der erste Ansatz. Wenn diese Informationen an anderer Stelle benötigt werden, dann könnte das Script diese auch direkt an das andere System übergeben. Das kann z.B.: per ADO/ODBC-Verbindung oder jeden anderen per VBScript erreichbaren weg erfolgen. Das Script könnte die Adressen auch als XML-Information mit dem XMLHTTP-Objekte an einen WebService übertragen.
  • Kleiner DirSync
    Denkbar ist auch, dass das Skript die gefundenen Mailadressen in ein anderes Verzeichnis überträgt. (Siehe Verbinden von Organisationen). Wobei hier noch einige Fragen zu klären wären.

Das Script kann also nur der Einstieg in eine größere Lösung darstellen.

Weitere Links