none
Inclusão de informação no "Display Name" do AD com validação de e-mail RRS feed

  • Pergunta

  • Bom dia pessoal,

     

    Segue um desafio para os experts em scripts.

     

    - Preciso incluir uma informação na propriedade "Display name" (Nome para exibição) do AD de mais de 4.000 usuários da minha rede, porém, que se aplique APENAS se o usuário tem conta de e-mail no Exchange, caso não tenha, não faça a inclusão da informação.

     

    Por ex:

    User: mmiranda

    Display name: Marco Antonio Miranda

     

    Se eu tiver conta de e-mail no Exchange (mmiranda@enchange.com), alterar o "Display name" para:

    User: mmiranda

    Display name: Marco Antonio Miranda - TESTESxxx

     

    Lembrando, que essa alteração deva ser realizada apenas se o usuário tiver conta de e-mail, pois tenho mais de 100 contas de serviço que não devem sofrer a alteração ok?

     

    Obrigado desde já.

     

    Abraços

    sexta-feira, 9 de dezembro de 2011 13:11

Respostas

  • Segue o script....

    -------------------------

    Const SE_DACL_PROTECTED = 4096

    'On Error Resume Next

    Dim sDomain
    Dim sADsPath
    Dim sPDC

    Dim oCon
    Dim oCmd
    Dim oRst
    Set oRst = CreateObject("ADODB.Recordset")
    Set oCmd = CreateObject("ADODB.Command")
    Set oCon = CreateObject("ADODB.Connection")

    Dim oRoot
    Dim oDomain
    Dim oADInfo
    Dim oInfo

    Set oADInfo = CreateObject("ADSystemInfo")
    Set oInfo = CreateObject("WinNTSystemInfo")
    sPDC = oInfo.PDC & "." & oADInfo.DomainDNSName

    oCon.Provider = "ADSDSOObject"
    oCon.Open "Active Directory Provider"

    oCmd.ActiveConnection = oCon
    oCmd.Properties("Page Size") = 1200

    Set oRoot = GetObject("LDAP://rootDSE")
    sDomain = oRoot.Get("defaultNamingContext")
    Set oDomain = GetObject("LDAP://" & sDomain)
    sADsPath = "<" & oDomain.ADsPath & ">"

    oCmd.CommandText = sADsPath & ";" & _
         "(&(objectCategory=user)(objectClass=user)(samAccountName=*)(!userAccountControl:1.2.840.113556.1.4.803:=2));displayName,sAMAccountName,userPrincipalName;Subtree"

    WScript.Echo "Selecionando os objetos no Active Directory..."

    Set oRst = oCmd.Execute

    If oRst.RecordCount = 0 Then
        WScript.Echo "Nenhum objeto foi encontrato!"
        WScript.Quit
    End If

    numTotal = 0

    Do While Not oRst.EOF

       strPesquisaUsuario  = QueryActiveDirectory( oRst.Fields( "sAMAccountName" ) )

       If Not ( strPesquisaUsuario = "Nao encontrado" ) Then

        Set objUser = GetObject("LDAP://" & strPesquisaUsuario )

     Set objMailbox = objUser
     If Not ( objMailbox.HomeMDB = "" ) Then

        sDisplayName=objUser.Get("DisplayName") & " - TESTEsxxx"

        wscript.echo "    [-] " & objUser.Get( "sAMAccountName" ) & " -> " & sDisplayName

        ' Descomentar as duas linhas abaixo apos os seus testes
        ' objUser.Put "DisplayName", sDisplayName
        ' objUser.Setinfo

        numTotal = numTotal + 1

     End If

       End If

       oRst.MoveNext

    Loop

    Wscript.echo "Total de Usuários: [" & oRst.RecordCount & "]"
    Wscript.echo "Total de Usuários Alterados: [" & numTotal  & "]"
    Wscript.echo "Total de Usuários Sem Alteração: [" & oRst.RecordCount - numTotal & "]"

     

    '-------------------------------------------------------------
    Public Function QueryActiveDirectory(sUserMatricula)
     
    QueryActiveDirectory = "Not Found"
    if Len(sUserMatricula) > 0 then

        Dim oAD
        Dim oGlobalCatalog
        Dim oRecordSet
        Dim oConnection
        Dim strADsPath
        Dim strQuery
        Dim strUPN

        set oRecordSet = CreateObject("ADODB.Recordset")
        set oConnection = CreateObject("ADODB.Connection")

        Set oAD = GetObject("GC:")
        For Each oGlobalCatalog In oAD
            strADsPath = oGlobalCatalog.AdsPath
        Next

        oConnection.Provider = "ADsDSOObject"

        oConnection.Open "ADs Provider"

        strQuery = "<" & strADsPath & _
          ">;(&(objectClass=user)(objectCategory=person)(sAMAccountName=" & _
          sUserMatricula & "));userPrincipalName,cn,distinguishedName;subtree" 

        Set oRecordSet = oConnection.Execute(strQuery)
        If oRecordSet.EOF And oRecordSet.BOF Then   
            QueryActiveDirectory = "Not Found"
        Else
            While Not oRecordSet.EOF
                QueryActiveDirectory = oRecordSet.Fields("distinguishedName")
                oRecordSet.MoveNext
            Wend
        End If

    End If

    End Function

    sexta-feira, 9 de dezembro de 2011 14:16
  • Não percebi o erro quando mandei o script.

    Altere desta forma.

    ' Set oDomain = GetObject("LDAP://OU=Teste," & sDomain)
    sADsPath = "<LDAP://OU=Teste," & sDomain & ">"

    Tenha certeza que a OU esta na raiz o AD.

    OU=Teste,DC=dominio, ....

     

     

    • Marcado como Resposta Marco_AM quarta-feira, 14 de dezembro de 2011 19:19
    sexta-feira, 9 de dezembro de 2011 18:19
  • Não seria isso:

        ' Descomentar as duas linhas abaixo apos os seus testes
        ' objUser.Put "DisplayName", sDisplayName
        ' objUser.Setinfo

     

     

    • Marcado como Resposta Marco_AM quarta-feira, 14 de dezembro de 2011 19:19
    sexta-feira, 9 de dezembro de 2011 19:20

Todas as Respostas

  • Segue o script....

    -------------------------

    Const SE_DACL_PROTECTED = 4096

    'On Error Resume Next

    Dim sDomain
    Dim sADsPath
    Dim sPDC

    Dim oCon
    Dim oCmd
    Dim oRst
    Set oRst = CreateObject("ADODB.Recordset")
    Set oCmd = CreateObject("ADODB.Command")
    Set oCon = CreateObject("ADODB.Connection")

    Dim oRoot
    Dim oDomain
    Dim oADInfo
    Dim oInfo

    Set oADInfo = CreateObject("ADSystemInfo")
    Set oInfo = CreateObject("WinNTSystemInfo")
    sPDC = oInfo.PDC & "." & oADInfo.DomainDNSName

    oCon.Provider = "ADSDSOObject"
    oCon.Open "Active Directory Provider"

    oCmd.ActiveConnection = oCon
    oCmd.Properties("Page Size") = 1200

    Set oRoot = GetObject("LDAP://rootDSE")
    sDomain = oRoot.Get("defaultNamingContext")
    Set oDomain = GetObject("LDAP://" & sDomain)
    sADsPath = "<" & oDomain.ADsPath & ">"

    oCmd.CommandText = sADsPath & ";" & _
         "(&(objectCategory=user)(objectClass=user)(samAccountName=*)(!userAccountControl:1.2.840.113556.1.4.803:=2));displayName,sAMAccountName,userPrincipalName;Subtree"

    WScript.Echo "Selecionando os objetos no Active Directory..."

    Set oRst = oCmd.Execute

    If oRst.RecordCount = 0 Then
        WScript.Echo "Nenhum objeto foi encontrato!"
        WScript.Quit
    End If

    numTotal = 0

    Do While Not oRst.EOF

       strPesquisaUsuario  = QueryActiveDirectory( oRst.Fields( "sAMAccountName" ) )

       If Not ( strPesquisaUsuario = "Nao encontrado" ) Then

        Set objUser = GetObject("LDAP://" & strPesquisaUsuario )

     Set objMailbox = objUser
     If Not ( objMailbox.HomeMDB = "" ) Then

        sDisplayName=objUser.Get("DisplayName") & " - TESTEsxxx"

        wscript.echo "    [-] " & objUser.Get( "sAMAccountName" ) & " -> " & sDisplayName

        ' Descomentar as duas linhas abaixo apos os seus testes
        ' objUser.Put "DisplayName", sDisplayName
        ' objUser.Setinfo

        numTotal = numTotal + 1

     End If

       End If

       oRst.MoveNext

    Loop

    Wscript.echo "Total de Usuários: [" & oRst.RecordCount & "]"
    Wscript.echo "Total de Usuários Alterados: [" & numTotal  & "]"
    Wscript.echo "Total de Usuários Sem Alteração: [" & oRst.RecordCount - numTotal & "]"

     

    '-------------------------------------------------------------
    Public Function QueryActiveDirectory(sUserMatricula)
     
    QueryActiveDirectory = "Not Found"
    if Len(sUserMatricula) > 0 then

        Dim oAD
        Dim oGlobalCatalog
        Dim oRecordSet
        Dim oConnection
        Dim strADsPath
        Dim strQuery
        Dim strUPN

        set oRecordSet = CreateObject("ADODB.Recordset")
        set oConnection = CreateObject("ADODB.Connection")

        Set oAD = GetObject("GC:")
        For Each oGlobalCatalog In oAD
            strADsPath = oGlobalCatalog.AdsPath
        Next

        oConnection.Provider = "ADsDSOObject"

        oConnection.Open "ADs Provider"

        strQuery = "<" & strADsPath & _
          ">;(&(objectClass=user)(objectCategory=person)(sAMAccountName=" & _
          sUserMatricula & "));userPrincipalName,cn,distinguishedName;subtree" 

        Set oRecordSet = oConnection.Execute(strQuery)
        If oRecordSet.EOF And oRecordSet.BOF Then   
            QueryActiveDirectory = "Not Found"
        Else
            While Not oRecordSet.EOF
                QueryActiveDirectory = oRecordSet.Fields("distinguishedName")
                oRecordSet.MoveNext
            Wend
        End If

    End If

    End Function

    sexta-feira, 9 de dezembro de 2011 14:16
  • Olá Eugenio,

     

    Gostaria de testar a princípio em apenas usuários de um única OU, como faço? O que preciso alterar no script?

     

    Obrigado

    sexta-feira, 9 de dezembro de 2011 15:12
  • Só alterar a variavel sADsPath

    de:

    sADsPath = "<" & oDomain.ADsPath & ">"

    para:

    sADsPath = "<OU=XXXX," & oDomain.ADsPath & ">"

    sexta-feira, 9 de dezembro de 2011 15:31
  • Eugenio,

     

    Salvei o script como .vbs e após alterar a variável conforme indicou para a OU que desejo testar, ocorre o erro abaixo:

     

    - Após aparecer a janela "Selecionando os objetos no Active Directory...", apresenta erro na linha 42, caract. 1, Erro: Tabela inexistente.

     

    Abraço

    sexta-feira, 9 de dezembro de 2011 16:06
  • Poste a linha que você alterou.


    Fábio de Paula Junior
    sexta-feira, 9 de dezembro de 2011 17:11
    Moderador
  • Fabio,

     

    Alterei apenas a linha da variável sAdsPath conforme o Eugenio havia passado. Quero testar apenas em uma OU de TESTE primeiro que criei.

     

    de:

    sADsPath = "<" & oDomain.ADsPath & ">"

    para:

    sADsPath = "<OU=TESTE," & oDomain.ADsPath & ">"

    sexta-feira, 9 de dezembro de 2011 17:18
  • Entendi,

    é porque o oDomain.ADsPaht tem o valor = LDAP://DC=seudominio,DC=com,dc=br e acaba concatenando errado ficando assim <ou=teste,ldap:\\dc=seucomini...)

    Faça esta alteração:

    sADsPath = "<LDAP://OU=TESTE," & odomain.distinguishedname & ">"
    



    Fábio de Paula Junior
    sexta-feira, 9 de dezembro de 2011 17:36
    Moderador
  • Fabio, erro na mesma linha e caract, mas com a mensagem agora: "Não há tal objeto no servidor."

     

    Preciso alterar mais alguma linha ou somente na variável sADsPath?

    sexta-feira, 9 de dezembro de 2011 17:47
  • No meu dá esse erro quando eu coloco uma OU que não existe.

    Configura o caminho completo da OU.

     

    Para conferir o nome correto da sua OU vá no seu domain controller e digite este comando no prompt

    dsquery ou -name "TESTE"

    Ele vai listar todas as OU com o nome TESTE.

    Qualquer coisa poste aqui a sua linha(adspath) e a saida do dsquery.


    Fábio de Paula Junior
    sexta-feira, 9 de dezembro de 2011 18:09
    Moderador
  • Não percebi o erro quando mandei o script.

    Altere desta forma.

    ' Set oDomain = GetObject("LDAP://OU=Teste," & sDomain)
    sADsPath = "<LDAP://OU=Teste," & sDomain & ">"

    Tenha certeza que a OU esta na raiz o AD.

    OU=Teste,DC=dominio, ....

     

     

    • Marcado como Resposta Marco_AM quarta-feira, 14 de dezembro de 2011 19:19
    sexta-feira, 9 de dezembro de 2011 18:19
  • Estamos quase lá pessoal, rodou o script, leu meus usuários na UO certinho, mas não fez a alteração no Display name.

    Outro detalhe, minha OU de teste não estava na raiz do domínio, mesmo colocando o caminho completo dela não rodava. Já na raiz rodou mas não fez a alteração. Estou com apenas 2 usuários nesta OU, 1 com e-mail e o outro não...

     

    O que acham agora???

    Obrigado pela força!!

    sexta-feira, 9 de dezembro de 2011 18:42
  • Não seria isso:

        ' Descomentar as duas linhas abaixo apos os seus testes
        ' objUser.Put "DisplayName", sDisplayName
        ' objUser.Setinfo

     

     

    • Marcado como Resposta Marco_AM quarta-feira, 14 de dezembro de 2011 19:19
    sexta-feira, 9 de dezembro de 2011 19:20
  • Bom dia pessoal, voltando aos testes!!! Sai mais cedo na sexta-feira, por isso não respondi...

     

    Então, deu certo descomentando as linhas sugeridas... Mas só uma observação...

     

    Vendo os usuários pela console do Active Directory, não aparece a mudança, apenas visualizo se entrar na propriedade do objeto do usuário, falta alguma coisa ainda será??? Ou fica desta forma???

     

    Obrigado

    segunda-feira, 12 de dezembro de 2011 10:30
  • Bom dia

    Provavelmente só um F5 com a OU selecionada.

    segunda-feira, 12 de dezembro de 2011 11:54
  • Olá Eugenio, infelizmente não é suficiente o "F5"... Não seria necessário adicionar no script a propriedade de "Nome completo" também? Porque se eu tento renomear o usuário pela console do AD é nessa propriedade que é alterado para que fique visível tbm..

     

    Outro detalhe, só funciona se deixo a OU na raiz do domínio, mesmo que eu coloque o caminho completo da OU no script não funciona..

     

    Abraço

    segunda-feira, 12 de dezembro de 2011 14:02
  • Marco,

    Existem dois atributos que você pode testar: cn e name.

    Você precisa apenas adcionar a linha antes do .setinfo, tente um de cada vez e avise se funcionou.

    objUser.Put "DisplayName", sDisplayName
    objUser.Put "name",sDisplayName
    objUser.Setinfo
    
    


    Fábio de Paula Junior
    segunda-feira, 12 de dezembro de 2011 14:10
    Moderador
  • Fabio e Eugenio, obrigado pela força!!!

     

    Estou fazendo uma OU por vez, mas está atendendo o que precisava, obrigado pelo empenho de vcs!!!

     

    Abraços

    quarta-feira, 14 de dezembro de 2011 19:20