none
Mover usuários atraves de uma lista .txt RRS feed

  • Pergunta

  • Bom dia,

    Poderiam me auxiliar em um script.

    Esse script tem a função de mover usuários através de uma lista .txt para uma OU definida no script, mas está dando erro. Verifiquei que o script move atraves da DN, e apaga o atributo script de logon. É possível fazer pelo sAMAccountName e não apagar o script de logon ?

    Erro:

    Script:

    Option Explicit

    Dim strFileName, strTargetOU, strUserDN
    Dim objFSO, objInputFile, objOU, objUser

    Const ADS_PROPERTY_CLEAR=1
    Const ForReading = 1

    strFileName = "c:\scripts\teste.txt"

    Set objFSO = CreateObject("scripting.filesystemobject")
    Set objInputFile = objFSO.OpenTextFile(strFileName,ForReading)

    strTargetOU = "LDAP://ou=teste,dc=XXXXXX,dc=com,dc=br"

    Set objOU = GetObject(strTargetOU)

    Do While Not objInputFile.AtEndOfStream
     strUserDN = Trim(objInputFile.ReadLine)
     Set objUser = GetObject(strUserDN)
     objUser.PutEx ADS_PROPERTY_CLEAR, "scriptPath", 0
     objUser.SetInfo
     objOU.MoveHere strUserDN,vbNullString
    Loop

    Obrigado desde já.


    Rafael S. AMARAL
    U. P. Mackenzie


    quarta-feira, 14 de março de 2012 15:33

Respostas

  • Neste script que vc passou tente mudar esta linha

    "<LDAP://" & strDNSDomain & ">;(&(objectCategory=computer)(cn=" & strComputer & "));adspath,cn;subtree"


    por esta

    "<LDAP://" & strDNSDomain & ">;(&(ObjectClass=user)(ObjectCategory=person)(samAccountName=" & strComputer & "));adspath,cn;subtree"

    Ele vai pesquisar logins de usuários ao invés de conta de computadores


    Fábio de Paula Junior


    quinta-feira, 15 de março de 2012 11:44
    Moderador
  • Bom dia Fábio,

    Agora sim! Muito Obrigado Fábio.!

    A quem se interessar, esse script lê um arquivo .txt (nome do txt tem que ser move.txt, se desejar mudar, tem que alterar no script. O script deve ficar junto com script onde será executado (exe: se vc executar do desktop o script, o txt tbm deverá estar no desktop). O txt  tem que conter o login da pessoa(samAccountName). Com isso você move os usuários para a OU desejada, com isso você deixa de usar as linhas de comando DSMOVE, etc......,e no final cria um log informando em qual OU o usuário fazia parte antes de ser movido.

    on error resume next 
     
    CONST ForReading = 1 
    Const ForAppending = 8 
     
    Set oFS = CreateObject("Scripting.FileSystemObject") 
    Set oTS = oFS.OpenTextFile("Move.txt",ForReading) 
    set oLS = oFS.OpenTextFile("movecomputerlog.txt",ForAppending,True) 
    Set objRootDSE = GetObject("LDAP://RootDSE") 
    strDNSDomain = objRootDSE.Get("defaultNamingContext") 
    Set objCommand = CreateObject("ADODB.Command") 
    Set objConnection = CreateObject("ADODB.Connection") 
    objConnection.Provider = "ADsDSOObject" 
    objConnection.Open "Active Directory Provider" 
    objCommand.ActiveConnection = objConnection 
     
    'Modify the following line to desired OU 
    Set objNewOU = GetObject("LDAP://OU=xxxxxx,OU=xxxxxx,dc=xxxxxx,dc=com,dc=br") 
    Do Until oTS.AtEndOfStream 
            strComputer = oTS.ReadLine 
            strQuery = _ 
              "<LDAP://" & strDNSDomain & ">;(&(ObjectClass=user)(ObjectCategory=person)(samAccountName=" & strComputer & "));adspath,cn;subtree"
            objCommand.CommandText = strQuery 
            Set RS = objCommand.Execute 
            While not RS.EOF 
                    strPath = RS.Fields("adspath") 
                    strName = "CN=" & RS.Fields("cn") 
                    oLS.Writeline(strPath) 
                    Set objMoveComputer = objNewOU.MoveHere(strPath,strName) 
                    RS.MoveNext 
            Wend 
    Loop 


    Rafael S. AMARAL
    U. P. Mackenzie






    quinta-feira, 15 de março de 2012 14:27

Todas as Respostas

  • Rafael,

    Para fazer alterações em contas do AD é necessário fazer um "binding" na conta e o atributo utilizado para isto é o DN(o binding é feito na linha Set ObjUser...).

    Se a sua lista tem o sAMAccountName então vc deve pesquisar o AD e recuperar o DN utilizando a informação que vc tem como critério de pesquisa.

    Por estes dias teve um dúvida aqui no fórum que eu ajudei com uma função que busca esta informação (função GETDN), dá uma olhada lá e tenta adaptar no seu script, qualquer coisa post aqui o seu script modificado.

    Para não apagar o scriptPath basta apagar a linha

    objUser.PutEx ADS_PROPERTY_CLEAR, "scriptPath", 0
     

    Script Altera atributos de usuários

    http://social.technet.microsoft.com/Forums/pt-BR/scriptadminpt/thread/4af8aaa2-28fe-4d37-83b9-3bcbff8fa441


    Fábio de Paula Junior

    quarta-feira, 14 de março de 2012 16:22
    Moderador
  • Fábio,

    Primeiramente obrigado.

    Deu erro.


    O código ficou assim:


    Option Explicit
    
    Dim strFileName, strTargetOU, strUserDN
    Dim objFSO, objInputFile, objOU, objUser
    
    Const ADS_PROPERTY_CLEAR=1
    Const ForReading = 1
    
    strFileName = "c:\scripts\teste.txt"
    
    Set objFSO = CreateObject("scripting.filesystemobject")
    Set objInputFile = objFSO.OpenTextFile(strFileName,ForReading)
    
    strTargetOU = "LDAP://ou=teste,dc=xxxxx,dc=com,dc=br"
    
    Set objOU = GetObject(strTargetOU)
    
    Do While Not objInputFile.AtEndOfStream
    	strUserDN = Trim(objInputFile.ReadLine)
    	Set objUser = GetObject(strUserDN)
    	ObjUser.SetInfo
    	objOU.MoveHere strUserDN,vbNullString
    Loop
    
    
      Dim oConnection, oCommand, oRoot, sDNSDomain, sQuery, sFilter, oResults
       GetDN = ""
       sDisplayName = sUser
       On Error Resume Next
       ' Use ADO to search the domain for all users.
       Set oConnection = CreateObject("ADODB.Connection")
       Set oCommand = CreateObject("ADODB.Command")
       oConnection.Provider = "ADsDSOOBject"
       oConnection.Open "Active Directory Provider"
       Set oCommand.ActiveConnection = oConnection
       ' Determine the DNS domain from the RootDSE object.
       Set oRoot = GetObject("LDAP://RootDSE")
       sDNSDomain = oRoot.Get("DefaultNamingContext")
       sFilter = "(&(ObjectClass=user)(ObjectCategory=person)(samAccountName=" & sUser & "))"
       sQuery = "<LDAP://" & sDNSDomain & ">;" & sFilter & ";distinguishedname,displayName;subtree"
       oCommand.CommandText = sQuery
       oCommand.Properties("Page Size") = 100
       oCommand.Properties("Timeout") = 30
       oCommand.Properties("Cache Results") = False
       Set oResults = oCommand.Execute
       Do Until oResults.EOF
         if oResults.Fields("displayName") <> "" then
           sDisplayName = oResults.Fields("displayName")
           GETDN = oResults.Fields("distinguishedname")
         End if
         oResults.MoveNext
       Loop
       On Error Goto 0
     
    End Function


    Rafael S. AMARAL
    U. P. Mackenzie


    quarta-feira, 14 de março de 2012 17:43
  • Rafael,

    Vc cortou uma linha da Função, a primeira linha, a que tem o nome da função

    Fiz algumas alterações mas não testei.

    Option Explicit
    
    Dim strFileName, strTargetOU, strUserDN
    Dim objFSO, objInputFile, objOU, objUser
    
    Const ADS_PROPERTY_CLEAR=1
    Const ForReading = 1
    
    strFileName = "c:\scripts\teste.txt"
    
    
    Set objFSO = CreateObject("scripting.filesystemobject")
    Set objInputFile = objFSO.OpenTextFile(strFileName,ForReading)
    
    strTargetOU = "LDAP://ou=teste,dc=xxxxx,dc=com,dc=br"
    
    Set objOU = GetObject(strTargetOU)
    
    Do While Not objInputFile.AtEndOfStream
    	strUserDN = Trim(objInputFile.ReadLine)
    	Set objUser = GetObject(GetDN(strUserDN))
    	ObjUser.SetInfo
    	objOU.MoveHere strUserDN,vbNullString
    Loop
    
    
    Function GetDN(sUser)
    
      Dim oConnection, oCommand, oRoot, sDNSDomain, sQuery, sFilter, oResults,sDisplayName
       GetDN = ""
       sDisplayName = sUser
       On Error Resume Next
       ' Use ADO to search the domain for all users.
       Set oConnection = CreateObject("ADODB.Connection")
       Set oCommand = CreateObject("ADODB.Command")
       oConnection.Provider = "ADsDSOOBject"
       oConnection.Open "Active Directory Provider"
       Set oCommand.ActiveConnection = oConnection
       ' Determine the DNS domain from the RootDSE object.
       Set oRoot = GetObject("LDAP://RootDSE")
       sDNSDomain = oRoot.Get("DefaultNamingContext")
       sFilter = "(&(ObjectClass=user)(ObjectCategory=person)(samAccountName=" & sUser & "))"
       sQuery = "<LDAP://" & sDNSDomain & ">;" & sFilter & ";distinguishedname,displayName;subtree"
       oCommand.CommandText = sQuery
       oCommand.Properties("Page Size") = 100
       oCommand.Properties("Timeout") = 30
       oCommand.Properties("Cache Results") = False
       Set oResults = oCommand.Execute
       Do Until oResults.EOF
         if oResults.Fields("displayName") <> "" then
           sDisplayName = oResults.Fields("displayName")
           GETDN = oResults.Fields("distinguishedname")
         End if
         oResults.MoveNext
       Loop
       On Error Goto 0
     
    End Function


    Fábio de Paula Junior

    quarta-feira, 14 de março de 2012 19:11
    Moderador
  • Oi Fábio,

    Apresentou a seguinte mensagem:


    Rafael S. AMARAL
    U. P. Mackenzie


    quarta-feira, 14 de março de 2012 19:38
  • Tente substituir a linha

    Set objUser = GetObject(GetDN(strUserDN))

    por esta

    Set objUser = GetObject("LDAP://" & GetDN(strUserDN))


    Fábio de Paula Junior

    quarta-feira, 14 de março de 2012 19:51
    Moderador
  • Eu acho que está mais próximo.


    Rafael S. AMARAL
    U. P. Mackenzie


    quarta-feira, 14 de março de 2012 19:57
  • Rafael,

    Será que todos os logins do seu arquivo ainda existem? Acho que o erro é esse.

    Troque toda a parte do Loop por esta:

    Do While Not objInputFile.AtEndOfStream
    	strUserDN = Trim(objInputFile.ReadLine)
    
    	if GetDN(strUserDN)<>"" then
    	
    		Set objUser = GetObject(GetDN(strUserDN))
    		ObjUser.SetInfo
    		objOU.MoveHere strUserDN,vbNullString
    	else
    		wscript.echo strUserDN & " não existe"
    	end if
    Loop

    Ele só vai tentar mover as contas que existem.


    Fábio de Paula Junior

    quarta-feira, 14 de março de 2012 22:54
    Moderador
  • Boa Noite Fábio,

    O usuário existe sim, só tem o meu login na no .txt, mas depois que você falou, coloquei mais logins e também deu na mesma.

    Eu tenho um script que faz a mesma coisa, só que para computadores. e funciona perfeito. (ainga gera logs )

    Segue

    on error resume next
     
    CONST ForReading = 1
    Const ForAppending = 8
     
    Set oFS = CreateObject("Scripting.FileSystemObject")
    Set oTS = oFS.OpenTextFile("Move.txt",ForReading)
    set oLS = oFS.OpenTextFile("movecomputerlog.txt",ForAppending,True)
    Set objRootDSE = GetObject("LDAP://RootDSE")
    strDNSDomain = objRootDSE.Get("defaultNamingContext")
    Set objCommand = CreateObject("ADODB.Command")
    Set objConnection = CreateObject("ADODB.Connection")
    objConnection.Provider = "ADsDSOObject"
    objConnection.Open "Active Directory Provider"
    objCommand.ActiveConnection = objConnection
     
    'Modify the following line to desired OU
    Set objNewOU = GetObject("LDAP://OU=deletar,OU=Computadores,dc=xxxx,dc=com,dc=br")
    Do Until oTS.AtEndOfStream
            strComputer = oTS.ReadLine
            strQuery = _
              "<LDAP://" & strDNSDomain & ">;(&(objectCategory=computer)(cn=" & strComputer & "));adspath,cn;subtree"
            objCommand.CommandText = strQuery
            Set RS = objCommand.Execute
            While not RS.EOF
                    strPath = RS.Fields("adspath")
                    strName = "CN=" & RS.Fields("cn")
                    oLS.Writeline(strPath)
                    Set objMoveComputer = objNewOU.MoveHere(strPath,strName)
                    RS.MoveNext
            Wend
    Loop


    Rafael S. AMARAL U. P. Mackenzie


    quinta-feira, 15 de março de 2012 03:16
  • Neste script que vc passou tente mudar esta linha

    "<LDAP://" & strDNSDomain & ">;(&(objectCategory=computer)(cn=" & strComputer & "));adspath,cn;subtree"


    por esta

    "<LDAP://" & strDNSDomain & ">;(&(ObjectClass=user)(ObjectCategory=person)(samAccountName=" & strComputer & "));adspath,cn;subtree"

    Ele vai pesquisar logins de usuários ao invés de conta de computadores


    Fábio de Paula Junior


    quinta-feira, 15 de março de 2012 11:44
    Moderador
  • Bom dia Fábio,

    Agora sim! Muito Obrigado Fábio.!

    A quem se interessar, esse script lê um arquivo .txt (nome do txt tem que ser move.txt, se desejar mudar, tem que alterar no script. O script deve ficar junto com script onde será executado (exe: se vc executar do desktop o script, o txt tbm deverá estar no desktop). O txt  tem que conter o login da pessoa(samAccountName). Com isso você move os usuários para a OU desejada, com isso você deixa de usar as linhas de comando DSMOVE, etc......,e no final cria um log informando em qual OU o usuário fazia parte antes de ser movido.

    on error resume next 
     
    CONST ForReading = 1 
    Const ForAppending = 8 
     
    Set oFS = CreateObject("Scripting.FileSystemObject") 
    Set oTS = oFS.OpenTextFile("Move.txt",ForReading) 
    set oLS = oFS.OpenTextFile("movecomputerlog.txt",ForAppending,True) 
    Set objRootDSE = GetObject("LDAP://RootDSE") 
    strDNSDomain = objRootDSE.Get("defaultNamingContext") 
    Set objCommand = CreateObject("ADODB.Command") 
    Set objConnection = CreateObject("ADODB.Connection") 
    objConnection.Provider = "ADsDSOObject" 
    objConnection.Open "Active Directory Provider" 
    objCommand.ActiveConnection = objConnection 
     
    'Modify the following line to desired OU 
    Set objNewOU = GetObject("LDAP://OU=xxxxxx,OU=xxxxxx,dc=xxxxxx,dc=com,dc=br") 
    Do Until oTS.AtEndOfStream 
            strComputer = oTS.ReadLine 
            strQuery = _ 
              "<LDAP://" & strDNSDomain & ">;(&(ObjectClass=user)(ObjectCategory=person)(samAccountName=" & strComputer & "));adspath,cn;subtree"
            objCommand.CommandText = strQuery 
            Set RS = objCommand.Execute 
            While not RS.EOF 
                    strPath = RS.Fields("adspath") 
                    strName = "CN=" & RS.Fields("cn") 
                    oLS.Writeline(strPath) 
                    Set objMoveComputer = objNewOU.MoveHere(strPath,strName) 
                    RS.MoveNext 
            Wend 
    Loop 


    Rafael S. AMARAL
    U. P. Mackenzie






    quinta-feira, 15 de março de 2012 14:27