none
Script para preencher campos no AD RRS feed

  • Pergunta


  • Boa Noite

    Achei um script que lista os usuários do AD em uma planilha Excel, porem quero saber se da pra fazer o caminho inverso, alterar campos de usuários no AD exemplo, altero o campo departamento na planilha e incluo no AD.

    É possível fazer isso em vbs?

     Set objNetwork = CreateObject("WScript.Network")

     Set objExcel = CreateObject("Excel.Application")

     

    objExcel.Visible = True

     objExcel.Workbooks.Add

     intRow = 2

     

     objExcel.Cells(1, 1).Value = "Usuario de rede"

     objExcel.Cells(1, 2).Value = "Nome Completo"

     objExcel.Cells(1, 3).Value = "Descrição"

     objExcel.Cells(1, 4).Value = "Email"

     objExcel.Cells(1, 5).Value = "Departamento"

     objExcel.Cells(1, 6).Value = "Compania"

     objExcel.Cells(1, 7).Value = "Conta Desabilitada?"

     

     

    'strDomain = InputBox ("Dominio")

     strDomain = objNetwork.UserDomain

     Set DomObj = GetObject("WinNT://" & strDomain )

     DomObj.Filter = Array("User")

     For Each objUser In DomObj

     

     UserPath = GetUserPath(objUser.Name)

      Set objUserLDAP = getobject(UserPath)

         objExcel.Cells(intRow, 1).Value =

    objUserLDAP.sAMAccountName

         objExcel.Cells(intRow, 2).Value =

    objUserLDAP.DisplayName

         objExcel.Cells(intRow, 3).Value =

    objUserLDAP.Description

         objExcel.Cells(intRow, 4).Value = objUserLDAP.mail

         objExcel.Cells(intRow, 5).Value =

    objUserLDAP.Department

         objExcel.Cells(intRow, 6).Value = objUserLDAP.Company

         objExcel.Cells(intRow, 7).Value =

    objUserLDAP.AccountDisabled

         intRow = intRow + 1

     

    Next

     

    objExcel.Range("A1:G1").Select

     objExcel.Selection.Interior.ColorIndex = 19

     objExcel.Selection.Font.ColorIndex = 11

     objExcel.Selection.Font.Bold = True

     objExcel.Cells.EntireColumn.AutoFit

     

     MsgBox "Concluído"

     

    Function getUserPath(byval sUserName)

         set cmd=createobject("ADODB.Command")

         set cn=createobject("ADODB.Connection")

         set rs=createobject("ADODB.Recordset")

     

        cn.open "Provider=ADsDSOObject;"

     

        cmd.commandtext = "SELECT adspath from 'LDAP://" &

    getnc & _

                   "' WHERE objectCategory = 'User' and

    sAMAccountName = '" & sUserName & "'"

         cmd.activeconnection = cn

     

        set rs = cmd.execute

     

        if rs.bof <> true and rs.eof<>true then

             getUserPath=rs(0)

         else

             getUserPath = ""

         end if

         cn.close

     

    end function

     

    function getNC

         set objRoot=getobject("LDAP://RootDSE")

         getNC=objRoot.get("defaultNamingContext")

     end function


    André de Oliveira Cunha Bueno
    quarta-feira, 23 de novembro de 2011 22:57

Respostas

  • André,

    Para atualizar um usuário (ou qualquer objeto do AD) você precisa fazer um "bind" utilizando o nome distinto do objeto (distinguishedName).

    Na sua planilha(a que você exporta) eu não vi esta informação, então para atualizar o seu AD depois você teria que pesquisar o AD para descobrir o nome distinto.

    Duas alternativas para você:

    #1 Exportar o nome distinto, adicione na sua exportação uma coluna com o atributo distinguishedName (Vantagem: Vc já terá o campo chave quando for fazer a importação de volta, Contra: Se entre o tempo da exportação e importação você mover o usuário de OU então esta referência será perdida e vai dar erro na hora de importar)

    #2 Pesquisar na hora da importação, você tem que adicionar um código que localize o nome distinto na hora da importação utilizando como index de pesquisa o login do usuário (Vantagem: não tem a desvantagem do item anterior, Contra: Você vai ter que adicionar mais código no seu script).


    Fábio de Paula Junior
    quarta-feira, 30 de novembro de 2011 12:07
    Moderador

Todas as Respostas

  • Veja este tópico

    http://social.technet.microsoft.com/Forums/pt-BR/scriptadminpt/thread/401c83dd-f944-4e5c-ba95-81a1760d91f2

     

    Tem um exemplo em .ps1 (powershell) e outro em .VBS (VBScript)


    Fábio de Paula Junior
    quinta-feira, 24 de novembro de 2011 11:00
    Moderador
  • Entendi, mais o que eu queria é pegar a lista em excel criada com script acima, modificar e importar. Importar a mesma planilha excel.

     

    É possivel???

     

     


    André de Oliveira Cunha Bueno
    quinta-feira, 24 de novembro de 2011 11:44
  • Sim é possivel.

    1-Faça um código que leia cada linha da planilha (http://activexperts.com/activmonitor/windowsmanagement/scripts/msoffice/excel/#RES.htm)

    2-Com os dados de cada usuário localize o nome distinto do usuário (Exemplo:LDAP:\\cn=usuario,ou=x,dc=seu,dc=dominio)

    3-Atualize os dados, http://activexperts.com/admin/scripts/adsi/vbscript/0006/

     

    Bom estes são os três passos necessários, se eu tivesse um tempo livre eu faria para vc.


    Fábio de Paula Junior
    • Sugerido como Resposta Matheus Kamphorst quinta-feira, 24 de novembro de 2011 15:02
    quinta-feira, 24 de novembro de 2011 13:08
    Moderador
  • Eu achei esse script, não sei nada sobre vbscript, como eu faço para mostrar que a coluna x é a coluna do company

     

    Option Explicit
    Dim objFSO, strFile, objFile, objRootDSE, strDNSDomain
    Dim strNetBIOSDomain, objTrans, strNTName, strUserDN
    Dim strCompany
    Dim objUser
    Const ForReading = 1
    ' Constants for NameTranslate.
    Const ADS_NAME_INITTYPE_GC = 3
    Const ADS_NAME_TYPE_NT4 = 3
    Const ADS_NAME_TYPE_1779 = 1
    Sub qq()
    ' Specify value of company attribute.
    strCompany = "GIJHARS"
    ' Specify the text file of user names.
    strFile = "c:\Scripts\UserList.txt"
    ' Open the file for read access.
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFile = objFSO.OpenTextFile(strFile, ForReading)
    ' Determine DNS domain name from RootDSE object.
    Set objRootDSE = GetObject("LDAP://rootDSE")
    strDNSDomain = objRootDSE.Get("defaultNamingContext")
    ' Use the NameTranslate object to find the NetBIOS domain name
    ' from the DNS domain name.
    Set objTrans = CreateObject("NameTranslate")
    objTrans.Init ADS_NAME_INITTYPE_GC, "gijharswwa"
    objTrans.Set ADS_NAME_TYPE_1779, strDNSDomain
    strNetBIOSDomain = objTrans.Get(ADS_NAME_TYPE_NT4)
    ' Remove trailing backslash.
    strNetBIOSDomain = Left(strNetBIOSDomain, _
    Len(strNetBIOSDomain) - 1)
    ' Read the file of user names.
    Do Until objFile.AtEndOfStream
    strNTName = Trim(objFile.ReadLine)
    ' Skip blank lines.
    If (strNTName <> "") Then
    ' Use NameTranslate to convert NT name to Distinguished Name.
    On Error Resume Next
    objTrans.Set ADS_NAME_TYPE_NT4, strNetBIOSDomain & "\" & strNTName
    If (Err.Number <> 0) Then
    On Error GoTo 0
    MsgBox "User " & strNTName _
    & " not found in Active Directory"
    Else
    On Error GoTo 0
    strUserDN = objTrans.Get(ADS_NAME_TYPE_1779)
    ' Bind to user object.
    Set objUser = GetObject("LDAP://" & strUserDN)
    ' Only update company attribute if modified.
    If (objUser.company <> strCompany) Then
    ' Update company attribute.
    objUser.company = strCompany
    ' Save changes.
    objUser.SetInfo
    End If
    End If
    End If
    Loop
    ' Clean up.
    objFile.Close
    End Sub

    André de Oliveira Cunha Bueno
    segunda-feira, 28 de novembro de 2011 18:24
  • O script abaixo estaria correto,

     

    Option Explicit
     Dim objRootLDAP, objContainer, objUser, objShell
     Dim objExcel, objSpread, intRow
     Dim strUser, strSheet
     Dim strCN, strSam, strFirst, strLast,strUPN , strSam, strDname, strMail, strComp


     strSheet = "caminho xls"
     
    ' Bind to Active Directory, Users container.
     Set objRootLDAP = GetObject("LDAP://rootDSE")
     Set objContainer = GetObject("LDAP://" & strOU & _
     objRootLDAP.Get("defaultNamingContext"))
     
    ' Open the Excel spreadsheet
     Set objExcel = CreateObject("Excel.Application")
     Set objSpread = objExcel.Workbooks.Open(strSheet)
     intRow = 3 'Row 1 often contains headings

     Do Until objExcel.Cells(intRow,1).Value = ""
       
     strSam = Trim(objExcel.Cells(intRow, 1).Value)
     strDname = Trim(objExcel.Cells(intRow, 2).Value)
     strMail = Trim(objExcel.Cells(intRow, 3).Value)
     strComp = Trim (objExcel.Cells(intRow, 4).Value)
      
     
       ' Build the actual User from data in strSheet.
        Set objUser = objContainer.modify("User", "cn=" & strCN)
     
     If (strSam <> objUser.sAMAccountName) Then
           
         
       objuser.setinfo
     
     'Display
      If (strDname <> "") Then
           objUser.displayName = strDname
         End If
     
     'Email
       If (strMail <> "") Then
           objUser.mail = strMail
         End If

    'Departamento
     if (strComp<> "") Then
      objUser.Company = strComp
     
     End If
     
    intRow = intRow + 1
     Loop
     objExcel.Quit
     
    WScript.Quit


    André de Oliveira Cunha Bueno
    terça-feira, 29 de novembro de 2011 15:05
  • André,

    Para atualizar um usuário (ou qualquer objeto do AD) você precisa fazer um "bind" utilizando o nome distinto do objeto (distinguishedName).

    Na sua planilha(a que você exporta) eu não vi esta informação, então para atualizar o seu AD depois você teria que pesquisar o AD para descobrir o nome distinto.

    Duas alternativas para você:

    #1 Exportar o nome distinto, adicione na sua exportação uma coluna com o atributo distinguishedName (Vantagem: Vc já terá o campo chave quando for fazer a importação de volta, Contra: Se entre o tempo da exportação e importação você mover o usuário de OU então esta referência será perdida e vai dar erro na hora de importar)

    #2 Pesquisar na hora da importação, você tem que adicionar um código que localize o nome distinto na hora da importação utilizando como index de pesquisa o login do usuário (Vantagem: não tem a desvantagem do item anterior, Contra: Você vai ter que adicionar mais código no seu script).


    Fábio de Paula Junior
    quarta-feira, 30 de novembro de 2011 12:07
    Moderador
  • Olá, tudo bem?

    Estou precisando fazer algo parecido, veja:

    http://social.technet.microsoft.com/Forums/pt-BR/winsrv2003pt/thread/b325e9d5-94fb-41cd-a3fe-07e6a0bb750a

     Set objNetwork = CreateObject("WScript.Network")
     Set objExcel = CreateObject("Excel.Application")
     
    objExcel.Visible = True
     objExcel.Workbooks.Add
     intRow = 2
     
     objExcel.Cells(1, 1).Value = "sn"
     objExcel.Cells(1, 2).Value = "company"
     
    'strDomain = InputBox ("Dominio")
     strDomain = objNetwork.UserDomain
     Set DomObj = GetObject("WinNT://" & strDomain )
     DomObj.Filter = Array("User")
     For Each objUser In DomObj
     
     UserPath = GetUserPath(objUser.Name)
      Set objUserLDAP = getobject(UserPath)
         objExcel.Cells(intRow, 1).Value = objUserLDAP.DisplayName
         objExcel.Cells(intRow, 2).Value = objUserLDAP.Company
         intRow = intRow + 1
     
    Next
     
    objExcel.Range("A1:G1").Select
     objExcel.Selection.Interior.ColorIndex = 19
     objExcel.Selection.Font.ColorIndex = 11
     objExcel.Selection.Font.Bold = True
     objExcel.Cells.EntireColumn.AutoFit
     
     MsgBox "Concluído"
     
    Function getUserPath(byval sUserName)
         set cmd=createobject("ADODB.Command")
         set cn=createobject("ADODB.Connection")
         set rs=createobject("ADODB.Recordset")
     
        cn.open "Provider=ADsDSOObject;"
     
    ERRO    cmd.commandtext = "SELECT adspath from 'LDAP://" &
    getnc & _
                   "' WHERE objectCategory = 'User' and
    sAMAccountName = '" & sUserName & "'"
         cmd.activeconnection = cn
     
        set rs = cmd.execute
     
        if rs.bof <> true and rs.eof<>true then
             getUserPath=rs(0)
         else
             getUserPath = ""
         end if
         cn.close
     
    end function
     
    function getNC
         set objRoot=getobject("LDAP://RootDSE")
         getNC=objRoot.get("defaultNamingContext")
     end function

    Alguém poderia me ajudar?

    Grato


    Grato, Trentini

    segunda-feira, 13 de agosto de 2012 21:36