Usuário com melhor resposta
Mover usuários atraves de uma lista .txt

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, objUserConst ADS_PROPERTY_CLEAR=1
Const ForReading = 1strFileName = "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
LoopObrigado desde já.
Rafael S. AMARAL
U. P. Mackenzie- Editado Rafael S. AMARAL quarta-feira, 14 de março de 2012 15:35
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
- Editado Fábio JrModerator quinta-feira, 15 de março de 2012 11:45 Obs
- Marcado como Resposta Rafael S. AMARAL quinta-feira, 15 de março de 2012 14:33
-
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
- Marcado como Resposta Rafael S. AMARAL quinta-feira, 15 de março de 2012 14:34
- Editado Rafael S. AMARAL quinta-feira, 15 de março de 2012 14:55
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
Fábio de Paula Junior
-
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- Editado Rafael S. AMARAL 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
-
Oi Fábio,
Apresentou a seguinte mensagem:
Rafael S. AMARAL
U. P. Mackenzie- Editado Rafael S. AMARAL quarta-feira, 14 de março de 2012 19:38
-
-
Eu acho que está mais próximo.
Rafael S. AMARAL
U. P. Mackenzie- Editado Rafael S. AMARAL quarta-feira, 14 de março de 2012 19:58
-
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
-
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
- Editado Rafael S. AMARAL quinta-feira, 15 de março de 2012 14:28
-
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
- Editado Fábio JrModerator quinta-feira, 15 de março de 2012 11:45 Obs
- Marcado como Resposta Rafael S. AMARAL quinta-feira, 15 de março de 2012 14:33
-
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
- Marcado como Resposta Rafael S. AMARAL quinta-feira, 15 de março de 2012 14:34
- Editado Rafael S. AMARAL quinta-feira, 15 de março de 2012 14:55