none
Problemas no script.vbs Altera Atributo (Active Directory) RRS feed

  • Pergunta

  • Boa Tarde Pessoal,

     

    Estou tentando atualizar os atributos dos usuários do Active Directory utilizando script.vbs apartir de um arquivo CSV. O problema é que não está localizando o usuário no arquivo usermod.csv, alguém poderia me ajudar?

     

    Abaixo segue informações:

     

    Informações do arquivo usermod.csv:

     

    User1,Office Bloguer

    User2,Office Bloguer

     

    Erro: Conta do usuario não encontrado

    Linha:101

     

    Script.vbs:

     

    OPTION EXPLICIT ' Variáveis devem ser declaradas
    ' *************************************************
    ' * Instruções
    ' *************************************************

    ' Modificar as variáveis na seção "Instalação" seção conforme exigido.
    ' Executar o script a partir de um prompt de comando no modo cscript.
    ' por exemplo: cscript usermod.vbs
    ' Você também pode escolher a saída dos resultados para um arquivo texto:
    ' cscript usermod.csv>> results.txt

    ' *************************************************
    ' * Constantes / Declarações
    ' *************************************************
    Const adOpenStatic = 3
    Const adLockOptimistic = 3
    Const adCmdText = &H0001
    Const ADS_PROPERTY_CLEAR = 1

    DIM strSearchAttribute
    DIM strCSVHeader, strCSVFile, strCSVFolder
    DIM strAttribute, userPath, csvHasHDR
    DIM searchAttributePos,pos,userChanges
    DIM cn,cmd,rs
    DIM objUser
    DIM oldVal, newVal
    ' *************************************************
    ' * Instalação
    ' *************************************************

    ' O atributo do Active Directory que está a ser utilizado para combinar as linhas no arquivo CSV para
    ' Contas de usuário do Active Directory. É recomendado para uso exclusivo atributos.
    ' por exemplo: sAMAccountName (Pré login do Windows 2000) ou userPrincipalName
    ' Outros atributos podem ser usados, mas não estão garantidos para ser único. Se múltiplos utilizadores
    ' contas são encontrados, um erro é retornado e nenhuma atualização é realizada.
    strSearchAttribute = "sAMAccountName" 'User Name (Pre Windows 2000)

    ' Altere o cabeçalho CSV para corresponder ao seu arquivo CSV
    ' Ver para atribuir nomes http://www.wisesoft.co.uk/Scripts/activedirectoryschema.aspx
    ' O searchAttribute especificado acima deve aparecer na lista.
    ' Você pode entrar "nulo" para as colunas na csv que não estão a ser incluídas na atualização
    'strCSVHeader = "sAMAccountName,givenName,initials,sn,displayName,description,physicalDeliveryOfficeName," & _
    '  "telephoneNumber,mail,wWWHomePage,cn"

    strCSVHeader = "sAMAccountName,physicalDeliveryOfficeName"

    ' CSV pasta onde está localizada
    strCSVFolder = "C:\"
    ' Nome do Arquivo CSV
    strCSVFile = "usermod.csv"
    ' Diz o texto CSV arquivo tem uma linha de cabeçalho? Opções: "Sim", "Não"
    csvHasHDR = "No"

    ' *************************************************
    ' * Validação
    ' *************************************************

    ' Encontrar a posição da coluna, em busca atributo o arquivo CSV
    searchAttributePos = -1
    pos = 0
    for each strAttribute in SPLIT(strCSVHeader,",")
     if strAttribute = strSearchAttribute then
      searchAttributePos = pos
     end if
     pos = pos + 1
    next
    ' Assegure-se de procurar o atributo existe no cabeçalho CSV.
    if searchAttributePos = -1 then
     err.raise "'" & strSearchAttribute & "' atributo deve ser especificado no cabeçalho CSV." & _
      vbcrlf & "Este atributo é usado para mapear os dados do arquivo csv para os usuários no Active Directory."
    end if

    ' *************************************************
    ' * Iniciar Script
    ' *************************************************

    ' Configuração Conexão ADO para CSV
    Set cn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")

    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
              "Data Source=" & strCSVFolder & ";" & _
              "Extended Properties=""text;HDR=" & csvHasHDR & ";FMT=Delimited"""

    rs.Open "SELECT * FROM [" & strCSVFile & "]", _
              cn, adOpenStatic, adLockOptimistic, adCmdText

    ' Ler arquivo CSV
    Do Until rs.EOF
     ' Receba as ADsPath do usuário procurando por um usuário no Active Directory em busca do atributo
     ' especificada, quando o valor for igual ao valor do csv.
     ' e.g. LDAP://cn=user1,cn=users,dc=wisesoft,dc=co,dc=uk
     ' por exemplo: LDAP://cn=user1,CN=Users,DC=wisesoft,dc=co,dc=uk
     userPath = getUser(strSearchAttribute,rs(searchAttributePos))
     ' Verifique se um ADsPath foi devolvido
     if LEFT(userPath,6) = "Error:" then
      wscript.echo userPath
     else
      wscript.echo userPath
      ' Obter objeto do usuário
      set objUser = getobject(userPath)
      pos = 0
      userChanges = 0
      ' Atualização cada atributo no CSV string
      for each strAttribute in SPLIT(strCSVHeader,",")
       oldval = ""
       newval = ""
       ' Ignorar a pesquisa atributo (isto é apenas usada para procurar a conta do usuário)
       if strAttribute <> strSearchAttribute and strAttribute <> "null" then
        newVal = rs(pos) ' Obter novo valor do atributo arquivo CSV
        if ISNULL(newval) then
         newval = ""
        end if

        ' Especial para o manuseio atributo de nome comum. Se o novo valor contém
        ' vírgulas que deve ser precedido de uma barra.
        if strAttribute = "cn" then
         newVal = REPLACE(newVal,",","\,")
        end if

        IF LCASE(strAttribute) = "manager_samaccountname" THEN
         ' tratamento especial para permitir a atualização do gestor de atributo usando sAMAccountName (UserName)
         ' em vez de usar o nome distinto

         DIM objManager, managerPath
         managerPath = GetUser("sAMAccountName",newVal)
         IF LEFT(managerPath,6) = "Error:" THEN
          wscript.echo "Error resolving manager DN:" & managerPath
          ' Definir oldval = newval (não atualização)
          oldval = ""
          newval = ""
         ELSE
          SET objManager = GetObject(managerPath)
          newVal = objManager.Get("distinguishedName")
          SET objManager = NOTHING
          strAttribute = "manager"
         
          on error resume next ' Ignorar erro, se é valor nulo
          ' Recebe antigos valores de atribuidos
          oldVal = objUser.Get(strAttribute)
          on error goto 0
         END IF 
        
        ELSE
         on error resume next ' Ignorar erro, se é valor nulo
         ' Recebe antigos valores de atribuidos
         oldVal = objUser.Get(strAttribute)
         on error goto 0
        END IF

        
        ' Verifique se o valor tiver sido alterado
        if oldval <> newval then
         wscript.echo "Change " & strAttribute & " from '" & oldVal & "' to '" & newVal & "'"
         if newval = "" then
          ' Tratamento especial para limpar um atributo
          objUser.PutEx ADS_PROPERTY_CLEAR, strAttribute, null
         else
          SELECT CASE LCASE(strAttribute)
          CASE "cn" 'Especial manipulação necessária para common-name atributo
           DIM objContainer
           set objContainer = GetObject(objUser.Parent)

           on error resume next
           objContainer.MoveHere objUser.ADsPath,"cn=" & newval

           ' A atualização pode falhar se um usuário comum, com o mesmo nome existe no anterior
           ' do mesmo recipiente (UO)
           if err.number <> 0 then
            wscript.echo "Erro comum mudando de nome a partir de '" & oldval & "' para '" & newval & _
                  "'.  Verifique se o nome-do-comum é exclusivo dentro do recipiente (UO)"
            err.clear
           end if
           on error goto 0
          CASE ELSE ' Qualquer outro atributo
           ' Atualizar atributo
           objUser.put strAttribute,newVal
          END SELECT
         end if
         ' Usado mais tarde para verificar se todas as alterações têm de ser cometida a AD
         userChanges = userChanges + 1
        end if
       end if
       ' Informa a posição atual atributo na seqüência CSV
       pos = pos + 1
      next
      ' Verifique se precisamos de cometer quaisquer actualizações a AD
      if userChanges > 0 then
       ' Script para permitir que se continue uma atualização falhar
       on error resume next
       err.clear
       ' Guarda as alterações para AD
       objUser.setinfo
       ' Verifica se conseguiu atualizar/falhar
       if err.number <> 0 then
        wscript.echo "Commit Changes: Failed. " & err.description
        err.clear
       else
        wscript.echo "Commit Changes: Succeeded"
       end if
       on error goto 0
      else
       wscript.echo "No Changes"
      end if
      
     end if

      userPath = ""
         rs.MoveNext
    Loop

    ' Cleanup
    rs.close
    cn.close


    ' *************************************************
    ' * Funções
    ' *************************************************
    Function getUser(Byval strSearchAttribute,strSearchValue)
     ' Função ADsPath para retornar à conta de um usuário através de pesquisas
     ' para um determinado valor atributo
     ' por exemplo: LDAP://cn=user1,cn=users,dc=wisesoft,dc=co,dc=uk

     DIM getUserCn,getUserCmd,getUserRS

     on error resume next

     set getUserCn = createobject("ADODB.Connection")
     set getUserCmd = createobject("ADODB.Command")
     set getUserRS = createobject("ADODB.Recordset")

     getUserCn.open "Provider=ADsDSOObject;"
     
     getUserCmd.activeconnection=getUserCn
      getUserCmd.commandtext="<LDAP://DC=XYP,DC=xxx,DC=xxx,DC=xx >;" & _
      "(&(objectCategory=user)(" & strSearchAttribute & "=" & strSearchValue & "));" & _
      "adsPath;subtree"

     set getUserRs = getUserCmd.execute

     if getUserRS.recordcount = 0 then
      getUser = "Erro: Conta do usuário não encontrado"
     elseif getUserRS.recordcount = 1 then
           getUser = getUserRs(0)
     else
      getUser = "Erro: Múltiplas contas de usuário encontrado. Espera uma conta de usuário."
     end if
     
     getUserCn.close
    end function

    quarta-feira, 10 de dezembro de 2008 19:27

Todas as Respostas