Microsoft Outlook troubleshooting
Eksport wszystkich skrzynek serwera Exchange do pliku CSV

Eksport wszystkich skrzynek serwera Exchange do pliku CSV

autor CodeTwo 2008-01-09 00:00:00 w Exchange Server
Artykuł dotyczy: Exchange Server 2000/2003

 

Często pojawiającym się pytaniem jest możliwość wyeksportowania, np. do pliku CSV, wszystkich skrzynek pocztowych serwera Exchange. Jeszcze częściej pada pytanie o wyeksportowanie wszystkich skrzynek, ale z jakąś dodatkową informacją, przykładowo z wszystkimi adresami (aliasami lub inaczej adresami proxy) przypisanymi do skrzynki.

Exchange to jeden z mocniej zaawansowanych serwerów do pracy grupowej dostępnych na rynku, jednak nie zawiera wbudowanych funkcji raportowania. Do tego celu możemy używać darmowych programów, jak LDIFDE lub rozwiązań firm trzecich, niestety zazwyczaj słono płatnych. Szczęśliwie jest też trzecie rozwiązanie - napisanie lub wykorzystanie gotowego skryptu, bo Exchange daje akurat duże możliwości w dziedzinie jego rozszerzania, czy oprogramowywania. Zaletą skryptu jest niewątpliwie to, że możemy go modyfikować i przystosowywać do własnych indywidualnych potrzeb. Wadą - to że administratorowi może być trudno taki skrypt napisać od podstaw, bo w końcu nie jest programistą, a jest to zadanie typowo programistyczne. Dużo łatwiej jest, gdy mamy skrypt gotowy do użycia, w którym musimy wprowadzić minimalne zmiany lub żadnych. Poniżej przedstawiam taki właśnie skrypt.

Jak uruchomić skrypt we własnym środowisku?

Poniższy skrypt należy zapisać w pliku o dowolnej nazwie z rozszerzeniem .VBS. Nie musi on być zapisany bezpośrednio na komputerze z serwerem Exchange, wystarczy jeśli będzie to stacja kliencka należąca do Active Directory. Po uruchomieniu pliku ze skryptem wygenerowany zostanie na dysku C: plik wynikowy o nazwie output.csv (wartości pól będą rozdzielone znakiem | strumienia, jeśli wartość pola składa się z kilku innych wartości, np. kilka aliasów, będą one rozdzielone znakiem #). Wystarczy zaimportować go do Excel'a, aby w wygodny sposób przeglądnąć wszystkie skrzynki Exchange z naszej domeny. Dla każdej skrzynki skrypt eksportuje do pliku wynikowego pola Active Directory: givenName, sn, mail, proxyAddresses - czyli odpowiednio: imię, nazwisko, główny adres SMTP, aliasy.

W linii oznaczonej (*1) należy wpisać nazwę domeny, z której mają zostać wyeksportowane skrzynki (przykład jest dla domeny codetwo.com). Jeśli chcemy wyeksportować inne albo dodatkowe pola Active Directory, należy wypisać je odpowiednio rozdzielając przecinkami w linii oznaczonej (*2). Jeśli chcemy wyeksportować dane do pliku innego niż c:\output.csv, jego ścieżkę należy podać w linii oznaczonej (*3).

' Domain
strDomain = "DC=codetwo,DC=com"  '(*1)

' LDAP fields
strLdapFields = "givenName,sn,mail,proxyAddresses"  '(*2)

' Output path
strOutputPath = "C:\output.csv"  '(*3)

' LDAP query string
strLdapQuery = "(&(objectClass=User)(|(homeMDB=*)(msExchHomeServerName=*)))"


Set con = WScript.CreateObject("ADODB.Connection")
Set rs = WScript.CreateObject("ADODB.Recordset")
Set Com = WScript.CreateObject("ADODB.Command")

Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set file = fso.CreateTextFile(strOutputPath, True)
 
' Open a Connection object.
con.Provider = "ADsDSOObject"
con.Properties("ADSI Flag") = 1
'con.Properties("User ID") = strDomain + "\" + strUserID
'con.Properties("Password") = strPassword
con.Open "Active Directory Provider"
 
' Create a command object on this connection.
Set Com.ActiveConnection = con

' Set the query string.
Com.CommandText = "<LDAP://" & strDomain & ">;" & strLdapQuery & ";" & strLdapFields & ";SubTree"
 
' Execute the query.
Set rs = Com.Execute

file.WriteLine Replace( strLdapFields, ",", "|" )
 
' Navigate the record set.
rs.MoveFirst
While Not rs.EOF
    strLine = ""

    For i = 0 To rs.Fields.Count - 1
        If rs.Fields(i).Type = 12 And Not (IsNull(rs.Fields(i).Value)) Then
            strValue = ""
            For j = LBound(rs.Fields(i).Value) To UBound(rs.Fields(i).Value)
                vValue = rs.Fields(i).Value
	    If j <> LBound(rs.Fields(i).Value) Then strValue = strValue & "#"
                strValue = strValue & vValue(j)
            Next
        Else
            strValue = rs.Fields(i).Value
        End If
        If i <> 0 Then strLine = strLine & "|"
        If Not IsNull(strValue) Then strLine = strLine & strValue
    Next
    file.WriteLine strLine
    rs.MoveNext
Wend
 
rs.MoveLast

Jeśli masz jakieś pytania lub komentarze dotyczące tego artykułu, napisz na naszym forum.

(c) CodeTwo. Wszelkie prawa zastrzeżone.



© Wszelkie prawa zastrzeżone. Żadna część ani całość tego artykułu nie może być powielana ani publikowana bez zgody autora.