none
Script para criar uma lista de endereços de e-mail do Exchange 2003 RRS feed

  • Pergunta

  • Estou com um problema aqui no trabalho. Eu preciso criar um arquivo de texto com todos os endereços de e-mail do Exchange 2003 mas não estou conseguindo. Eu já tentei alguns scripts em perl que achei na internet mas nenhum deles conseguiu me ajudar.

    Quando eu tinha o Exchange 5.5 na rede era bem fácil fazer isso mas agora com o Exchange 2003 eu estou apanhando muito.

    Alguem sabe como fazer ou tem um script que faça isso?

    Obrigado pela atenção.

     

     

    Roberto Jr

    quarta-feira, 22 de agosto de 2007 20:27

Respostas

  • Abaixo....

     

    Script para pegar o e-mail de todos os usuários, de qualquer OU de qualquer lugar... =D

    Não precisa mudar os nomes das OUs é só rodar...

     

    Code Snippet

    Dim rootDSE, domainObject
    Set rootDSE=GetObject("
    LDAP://RootDSE")
    domainContainer = rootDSE.Get("defaultNamingContext")
    Set domainObject = GetObject("
    LDAP://"&domainContainer)
    Set fs = CreateObject ("Scripting.FileSystemObject")
    Set userFile = fs.OpenTextFile ("c:\users.csv",8,True)

    For Each obj in domainObject
     select case(obj.Class)
      case "user"
       GetUsers(obj.ADsPath)
      case "organizationalUnit"
       GetOu(obj.ADsPath)
     end select
    Next

    sub GetUsers(path)
     set oUser = GetObject(path)
     If isArray(oUser.proxyAddresses) then
      texto = oUser.displayName & "," & oUser.sAMAccountName & "," & oUser.userprincipalname & ","
      for each email in oUser.proxyAddresses
       If instr(email,"smtp:")<>0 then
        texto = texto & email & ","
       End if
      next

      texto = replace(texto,"smtp:","")
      userFile.WriteLine texto

     End if
    end sub

    sub GetOu(path)
     set oOu = GetObject(path)
     for each user in oOu
      if user.class = "organizationalUnit" then
       GetOu(user.ADsPath)
      else
       GetUsers(user.AdsPath)
      end if
     next
    end sub


    wscript.echo "finalizado, usuários no arquivo: c:\users.csv"
    set domainObject = nothing
    set rootDSE = nothing
    set domainContainer = nothing
    set fs = nothing
    set userFile = nothing
    set oUser = nothing
    set texto = nothing

    wscript.quit

     

     

    Testa ae...  =D

     

    E se ajudar, não esqueça de classificar!

     

    sexta-feira, 24 de agosto de 2007 19:42
    Moderador

Todas as Respostas

  • Vc pode só, configurar o ms outlook com conexão tipo exchange com qualquer conta...

     

    Todos os e-mails vão aparecer na Lista de endereços Global...

     

    Vc simplesmente adiciona no seu catálogo de endereços e exporta para o arquivo txt ou csv, o que vc quiser...

     

    vc pode tentar também com o comando abaixo... é só executar no servidor do exchange:

     

    Code Snippet
    csvde -r "(objectClass=user)" -d "cn=users,dc=teste,dc=local" -l displayName,proxyAddresses -f c:\users.csv

     

     

     
     
    testa e posta ae....
     
    o.0

     

    quarta-feira, 22 de agosto de 2007 21:58
    Moderador
  •  

    Filipe, obrigado.

    Eu realmente preciso de um script pra fazer isso. Por isso por dentro do Outlook não fica legal eu fazer.

    Com o comando que você passou eu consigo um arquivo que contem os e-mail, mas com muita informação. Eu agora estou tentando organizar as informações desse arquivo para que eu tenha apenas os endereços de e-mail. Tudo isso a partir de um script, mas estou apanhando.

    Mas sua ajuda já foi muito boa, pelo menos as informações de endereços de e-mail do Exchange eu consegui retirar com seu comando, agora basta eu organizar.

    Obrigado

    quinta-feira, 23 de agosto de 2007 17:43
  • Ok.. Testa esse aki...

     

    Code Snippet

    Dim rootDSE, domainObject
    Set rootDSE=GetObject("
    LDAP://RootDSE")
    domainContainer = rootDSE.Get("defaultNamingContext")
    Set domainObject = GetObject("LDAP://" & domainContainer)

    Set fs = CreateObject ("Scripting.FileSystemObject")
    Set userFile = fs.OpenTextFile ("c:\users.csv",8,True)

    Sub ExportUsers(oObject)
    Dim oUser
    For Each oUser in oObject
    If oUser.Class = "user" then
    If oUser.mail <> "" then
    texto = oUser.displayName & "," & oUser.sAMAccountName & "," & oUser.userprincipalname & ","
    for each email in oUser.proxyAddresses
    If instr(email,"@")<>0 then
    texto = texto & email & ","
    End if
    next
    userFile.WriteLine texto
    End if
    End if
    Next
    End Sub

    retCod = ExportUsers(domainObject)

    wscript.echo "finalizado, usuários no arquivo: c:\users.csv"
    set domainObject = nothing
    set rootDSE = nothing
    set domainContainer = nothing
    set fs = nothing
    set userFile = nothing
    set oUser = nothing
    set texto = nothing
    set retCod = nothing
    wscript.quit

     

     

    Testa e diz se funfou....

     

    o.0

    quinta-feira, 23 de agosto de 2007 20:13
    Moderador
  •  

    Fala ae Filipe.

    Cara ta dando erro no script...

     

    da uma olhada:

     

    Microsoft (R) Windows Script Host Versão 5.6
    Copyright (C) 1996-2001 Microsoft Corporation. Todos os direitos reservados.

    C:\teste\Esse.vbs(26, 1) Erro de tempo de execução do Microsoft BLOCKED SCRIPT Tipo
    s incompatíveis: 'ExportUsers'

     

     

    Eu to procurando sobre o erro.. mas se vc já souber o que é e puder me ajudar...

    Valeu

    quinta-feira, 23 de agosto de 2007 20:29
  • Ok.. corrigindo.....

     

    Code Snippet

    Dim rootDSE, domainObject
    Set rootDSE=GetObject("
    LDAP://RootDSE")
    domainContainer = rootDSE.Get("defaultNamingContext")
    Set domainObject = GetObject("LDAP://" & domainContainer)

    Set fs = CreateObject ("Scripting.FileSystemObject")
    Set userFile = fs.OpenTextFile ("c:\users.csv",8,True)

    Dim oUser
    For Each oUser in domainObject
    If oUser.Class = "user" then
    If oUser.mail <> "" then
    texto = oUser.displayName & "," & oUser.sAMAccountName & "," & oUser.userprincipalname & ","
    for each email in oUser.proxyAddresses
    If instr(email,"@")<>0 then
    texto = texto & email & ","
    End if
    next
    userFile.WriteLine texto
    End if
    End if
    Next

     

    wscript.echo "finalizado, usuários no arquivo: c:\users.csv"
    set domainObject = nothing
    set rootDSE = nothing
    set domainContainer = nothing
    set fs = nothing
    set userFile = nothing
    set oUser = nothing
    set texto = nothing
    wscript.quit

     

     

    Testa e diz se funfou....

     

    o.0

    quinta-feira, 23 de agosto de 2007 20:38
    Moderador
  • Filipe, me desculpe eu ficar te pertubando, mas eu não sei programar em vbs e estou apanhando mesmo com isso.

    Seu script funciona, mas o arquivo users.csv fica vazio. Eu me conectei ao Dominio com o ADSI Edit e em "RootDSE" não tem nada. Então eu imaginei que eu deveria me conectar ao "Domain", pois é nele que eu tenho todos os meus usuários do dominio. Eu editei o inicio de script:

     

    Dim rootDSE, domainObject
    Set rootDSE=GetObject("LDAP://Domain")
    domainContainer = rootDSE.Get("OU=Usuarios,DC=meudomino,DC=com,DC=br")
    Set domainObject = GetObject("LDAP://" & domainContainer)

     

    Mas quando eu rodo o script eu tenho a seguinte msg:

     

    cscript Esse.vbs
    Microsoft (R) Windows Script Host Versão 5.6
    Copyright (C) 1996-2001 Microsoft Corporation. Todos os direitos reservados.

    Esse.vbs(2, 1) (null): O servidor não está operacional.

     

    Ele demora algum tempo até que me mostra essa mensagem, dando a impressão que esta tentando conectar no domain. Eu estou rodando o comando a partir do meu servidor de dominio.

     

    Se puder me ajudar eu agradeço.

    Obrigado

     

    Roberto Jr

    sexta-feira, 24 de agosto de 2007 13:29
  •  

    O RootDSE é uma prorpiedade do ad mesmo, ele não vai aparecer no adsi, mas ele retorna o identificador do domínio, é como se fosse um marcador....

    E o defaultNamingContext é uma propriedade que vai pegar o cn, do domínio, tipo "dc=teste,dc=local"

     

    Testa com esse aki, ele gora vai filtrar por quem tem e-mail na guia do exchange.....

    E no ldap:, se os seus usuários estão em uma OU, substitui o cn=users, por OU=nomedaOU

     

    Code Snippet

    Dim rootDSE, domainObject
    Set rootDSE=GetObject("LDAP://RootDSE")
    domainContainer = rootDSE.Get("defaultNamingContext")
    Set domainObject = GetObject("LDAP://cn=users,"&domainContainer)
    Set fs = CreateObject ("Scripting.FileSystemObject")
    Set userFile = fs.OpenTextFile ("c:\users.csv",8,True)

    Dim oUser
    For Each oUser in domainObject
    If oUser.Class = "user" then
    If isArray(oUser.proxyAddresses) then
    texto = oUser.displayName & "," & oUser.sAMAccountName & "," & oUser.userprincipalname & ","
    for each email in oUser.proxyAddresses
    If instr(email,"smtp:")<>0 then
    texto = texto & email & ","
    End if
    next
    userFile.WriteLine texto
    End if
    End if
    Next

    wscript.echo "finalizado, usuários no arquivo: c:\users.csv"
    set domainObject = nothing
    set rootDSE = nothing
    set domainContainer = nothing
    set fs = nothing
    set userFile = nothing
    set oUser = nothing
    set texto = nothing
    wscript.quit

     

     

    Testa e diz se funfou....

     

    o.0

    sexta-feira, 24 de agosto de 2007 17:41
    Moderador
  •  

    Filipe, perfeito.

    Funcionou que é uma beleza.

    Só tem mais um probleminha, rs (to começando a ficar folgado rs).

    Com o seu script eu consigo pegar as informações que eu preciso da minha OU, mas ela possui OU's dentro delas. Pra você entender eu tenho usuários nas seguintes OU's: OU=Funcionarios,OU=Usuarios,DC=meudominio,DC=com,DC=br e tenho também usuários dentro da OU OU=Alunos,OU=Usuarios,DC=meudominio,DC=com,DC=br e assim por diante. Eu tenho várias outras OU's dentro da OU Usuarios. Eu posso modificar seu script para fazer varias consultas em cada uma de minhas OU's, mas eu tenho que me lembrar, todas as vezes que eu criar uma nova OU, de adiciona-la no script. Existe alguma maneira mais fácil de eu fazer isso? como por exemplo checar a OU Usuarios e todas abaixo, como se fossem sub-pastas?

     

    Se tiver e você puder me ajudar eu agradeço, senão o que você fez já me ajudou muito.

     

    Obrigado

     

    Roberto Jr

    sexta-feira, 24 de agosto de 2007 18:43
  • Filipe, outra pergunta que pode ser boba. A variavel Email vem no formato: SMTP:teste@teste.com.br. Quando você coloca a opção: texto = texto &  email & ","  teria alguma maneira de eu retirar o texto SMTP: e deixar apenas o e-mail? Eu estou pesquisando aqui.

     

    Obrigado

     

    Roberto

    sexta-feira, 24 de agosto de 2007 19:04
  • Abaixo....

     

    Script para pegar o e-mail de todos os usuários, de qualquer OU de qualquer lugar... =D

    Não precisa mudar os nomes das OUs é só rodar...

     

    Code Snippet

    Dim rootDSE, domainObject
    Set rootDSE=GetObject("
    LDAP://RootDSE")
    domainContainer = rootDSE.Get("defaultNamingContext")
    Set domainObject = GetObject("
    LDAP://"&domainContainer)
    Set fs = CreateObject ("Scripting.FileSystemObject")
    Set userFile = fs.OpenTextFile ("c:\users.csv",8,True)

    For Each obj in domainObject
     select case(obj.Class)
      case "user"
       GetUsers(obj.ADsPath)
      case "organizationalUnit"
       GetOu(obj.ADsPath)
     end select
    Next

    sub GetUsers(path)
     set oUser = GetObject(path)
     If isArray(oUser.proxyAddresses) then
      texto = oUser.displayName & "," & oUser.sAMAccountName & "," & oUser.userprincipalname & ","
      for each email in oUser.proxyAddresses
       If instr(email,"smtp:")<>0 then
        texto = texto & email & ","
       End if
      next

      texto = replace(texto,"smtp:","")
      userFile.WriteLine texto

     End if
    end sub

    sub GetOu(path)
     set oOu = GetObject(path)
     for each user in oOu
      if user.class = "organizationalUnit" then
       GetOu(user.ADsPath)
      else
       GetUsers(user.AdsPath)
      end if
     next
    end sub


    wscript.echo "finalizado, usuários no arquivo: c:\users.csv"
    set domainObject = nothing
    set rootDSE = nothing
    set domainContainer = nothing
    set fs = nothing
    set userFile = nothing
    set oUser = nothing
    set texto = nothing

    wscript.quit

     

     

    Testa ae...  =D

     

    E se ajudar, não esqueça de classificar!

     

    sexta-feira, 24 de agosto de 2007 19:42
    Moderador
  •  

    Filipe, Obrigado.

    Agora eu consegui tudo que eu precisava. Com seu script e mais a função: texto = replace(texto,"SMTP:","")  eu consegui a lista de e-mails sem o SMTP:.

    Obrigado pela atenção e me desculpe pelo incomodo.

     

    Abração

     

    Roberto Jr

    sexta-feira, 24 de agosto de 2007 20:22

  • Precisando é só postar =D

    abs....

    sexta-feira, 24 de agosto de 2007 21:57
    Moderador
  • Filipe,
    estou utilizando este seu script, mas estou com um problema.
    Preciso listar cerca de 10.000 usuários e não sei como editar seu script para que a linguagem ldap me retorne este valor.

    Att,

    Leandro Fernandes.
    quinta-feira, 13 de dezembro de 2007 14:48
  • Mas po... num funcionou não?

     

    Qundo eu fiz esse script eu testei aki direto na minha rede, eu tenho mais de 30000 usuários aki, só demorou a beça pra terminar, mas foi normal cara..

     

    Qq aconteceu ai?

     

    o.0

     

    quinta-feira, 13 de dezembro de 2007 19:02
    Moderador
  • Aqui tá me retornando só uns 1.200 acho.... não sei porque.
    quando vou via "AD Users and Computers" e peço pra listar todos os usuários com email ele me lista muito mais.
    quinta-feira, 13 de dezembro de 2007 19:25
  • Leandro..

     

    Ele lista só os que tem e-mail..

     

    Vc tem certeza que todos os 3800 tem e-mail?

     

     

    quinta-feira, 20 de dezembro de 2007 20:51
    Moderador
  • Olá pessoal,


    primeiro mandamento do scripting: só faça script pra tarefa quando precisar dela sendo feita várias vezes. Nesse caso, o recurso de busca do AD não resolve? Dá pra exportar num .CSV normalmente.

    []s,

    --
    Vinicius Canto
    MVP Windows Server - Admin Frameworks
    MCP Windows 2000 Server, Windows XP e SQL Server 2000
    Bacharelando em Ciências da Computação - USP

    Blog sobre Scripting e Windows Powershell: http://viniciuscanto.blogspot.com
    terça-feira, 25 de dezembro de 2007 15:13
    Moderador
  • Filipe,
    desculpe a demora(e que demora), mas era vacilo mesmo, funciona perfeito.
    sexta-feira, 18 de abril de 2008 19:56