Bienvenidos sean a este post, hasta el post anterior hemos visto como gestionar distintas acciones sobre nuestro AD por medio de VBScript.
Hoy nos centraremos en algunos de esos scripts y modificaremos algunos para efectuar acciones masivas para poder ahorrar mucho tiempo y esfuerzo, para ello necesitamos no solamente modificar nuestro codigo sino tambien generar un archivo donde almacenaremos la informacion y despues con el codigo recuperaremos dicha informacion para poder enviarla al objeto que estemos creando o modificando, para el archivo les recomiendo:
- Usen un archivo de texto simple como por ejemplo de extension .CSV
- Este formato de archivos puede ser generado por ejemplo con Excel
- La ventaja de esto es que tendremos cada campo separado y nos sera facil cargarlo
- Les recomiendo usar el separador de listas con punto y coma (;) para que no se les confunda con el separador decimal
- Tambien nos permitira usar comas dentro de los campos sin inconvenientes
- Esto pueden modificarlo en las configuraciones regionales del equipo
Con esto establecido vamos a ver el primer script que vamos a modificar como es el alta de usuarios.
Alta masiva de usuarios
Para este caso veamos primero el archivo que vamos a generar, en la primera linea estableceremos los campos y luego los datos que enviaremos, veamos como queda:
cuenta;nombre;apellido;empresa;descrip;pais;departamento
Usuario1;Nombre1;Apellido1;Tinchicus;Primer Usuario;ar;IT
Usuario2;Nombre2;Apellido2;Tinchicus;Segundo Usuario;br;RRHH
Usuario3;Nombre3;Apellido3;Tinchicus;Tercer Usuario;cl;Comercio Exterior
Usuario4;Nombre4;Apellido4;Tinchicus;Cuarto Usuario;ar;Vendors
Usuario5;Nombre5;Apellido5;Tinchicus;Quinto Usuario;py;RRHH
Usuario6;Nombre6;Apellido6;Tinchicus;Sexto Usuario;us;IT
Usuario7;Nombre7;Apellido7;Tinchicus;Septimo Usuario;ar;Ventas
Usuario8;Nombre8;Apellido8;Tinchicus;Octavo Usuario;co;Call Center
Usuario9;Nombre9;Apellido9;Tinchicus;Novemos Usuario;uy;Call Center
Usuario10;Nombre10;Apellido10;Tinchicus;Decimo Usuario;ar;Call Center
En este caso vemos como la primer linea equivaldra al campo que preguntamos y abajo tendremos los valores que corresponden a cada usuario, observen como cada campo esta separado por el punto y coma (;), pasemos ahora ver nuestro «nuevo» codigo:
newuserfromcsv.vbs
Const Dominio = "dc=laboratorio,dc=local"
Const udominio = "laboratorio.local"
Const titulo = "Alta de usuario v. 1.0"
Const filein = "usuarios.csv"
ahora = now
ano = datepart("yyyy",ahora)
mes = datepart("m",ahora)
dia = datepart("d",ahora)
hora = datepart("h",ahora)
minuto = datepart("n",ahora)
segundo = datepart("s",ahora)
ahora = ano & mes & dia & hora & minuto & segundo
fileout = "Creados -" & ahora & ".log"
Dim objFSOut, objStreamout, fileout,textolog
Dim objFSO, objStream, linea, vuelta
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objStream = objFSO.OpenTextFile(filein, 1, false)
Set objFSOut = CreateObject("Scripting.FileSystemObject")
Set objStreamout = objFSOut.CreateTextFile(fileout, 1, false)
objStreamout.WriteLine("Inicio: " & date() & " " & time())
do while objStream.AtEndOfStream <> true
linea = objStream.readline
if vuelta > 0 then CrearUsuario(linea)
vuelta = vuelta + 1
loop
objStreamout.write "Final: " & date() & " " & time()
objStreamout.close()
Set objStreamout = nothing
Set objFSOut = nothing
objStream.close()
Set objStream = nothing
Set objFSO = nothing
msgbox "Listo el pollo" & vbCrLf & "Pelada la gallina"
sub CrearUsuario(datos)
d = split(datos,";")
cuenta = d(0)
nombre = d(1)
apellido = d(2)
uDisplay = apellido & ", " & nombre
chequeo = FindUser(cuenta,uDisplay,ucase(Dominio))
if (chequeo="Not Found") then
empresa = d(3)
descrip = d(4)
pais = d(5)
departamento = d(6)
Set oRootLDAP = GetObject("LDAP://rootDSE")
Set oContenedor = GetObject("LDAP://CN=Users," & Dominio)
Set oNuevoUsuario = oContenedor.Create("User","cn=" & chr(34) & uDisplay & chr(34))
oNuevoUsuario.put "sAMAccountName", lcase(cuenta)
oNuevoUsuario.put "givenName", nombre
oNuevoUsuario.put "sn", apellido
oNuevoUsuario.put "UserPrincipalName", lcase(cuenta) & "@" & uDominio
oNuevoUsuario.put "cn", uDisplay
oNuevoUsuario.put "DisplayName", uDisplay
oNuevoUsuario.put "company", empresa
oNuevoUsuario.put "c", pais
oNuevoUsuario.put "department", departamento
oNuevoUsuario.put "Description", descrip
oNuevoUsuario.SetInfo
randomize timer
dim texto
do while a<12
if (a=0) then
caracter = int(rnd * 24) + 65
texto = ucase(chr(caracter))
a = a + 1
else
caracter = int(rnd * 122) + 1
if ((caracter>47 and caracter<58) or (caracter>96 and caracter<123)) then
texto = texto & chr(caracter)
a = a + 1
end if
end if
loop
uPassword = texto
oNuevoUsuario.SetPassword uPassword
oNuevoUsuario.Put "pwdLastSet", 0
oNuevoUsuario.put "userAccountControl", 544
oNuevoUsuario.SetInfo
textolog = "Se creo la cuenta: " & cuenta & vbCrLf
textolog = textolog & "El nombre completo: " & uDisplay & vbCrLf
textolog = textolog & "La contraseña es: " & uPassword & vbCrLf
textolog = textolog & "========================================" & vbCrLf
objStreamout.Write textolog
else
textolog = "Se encontro el siguiente objeto: " & chequeo &vbCrLf
textolog = textolog & "========================================" & vbCrLf
objStreamout.Write textolog
end if
end sub
Function FindUser(Byval UserName, ByVal CanonName, Byval Domain)
set cn = createobject("ADODB.Connection")
set cmd = createobject("ADODB.Command")
set rs = createobject("ADODB.Recordset")
cn.open "Provider=ADsDSOObject;"
cmd.activeconnection=cn
cmd.commandtext="SELECT ADsPath FROM 'GC://" & Domain & _
"' WHERE sAMAccountName = '" & UserName & "'"
set rs = cmd.execute
if err<>0 then
FindUser="Error conectandose a la base del AD:" & err.description
else
if not rs.BOF and not rs.EOF then
FindUser=UserName
else
cmd.commandtext="SELECT ADsPath FROM 'GC://" & Domain & _
"' WHERE cn = '" & CanonName & "'"
set rs = cmd.execute
if not rs.BOF and not rs.EOF then
FindUser=CanonName
else
FindUser = "Not Found"
end if
end if
end if
cn.close
end function
Basicamente es muy parecido a lo que vimos en este post y en este otro pero con unas sutiles diferencias, veamos las primeras:
Const filein = "usuarios.csv"
ahora = now
ano = datepart("yyyy",ahora)
mes = datepart("m",ahora)
dia = datepart("d",ahora)
hora = datepart("h",ahora)
minuto = datepart("n",ahora)
segundo = datepart("s",ahora)
ahora = ano & mes & dia & hora & minuto & segundo
fileout = "Creados -" & ahora & ".log"
Dim objFSOut, objStreamout, fileout,textolog
Dim objFSO, objStream, linea, vuelta
Nuestra primer linea definiremos cual va a ser nuestro archivo donde estara la informacion, se puede reemplazar por un inputbox pero les recomiendo usarlo asi, luego crearemos una variable llamada ahora a la cual le asignaremos el valor de now y lo separaremos por medio de datepart y lo volveremos a ensamblar en ahora pero en el siguiente orden:
- año
- mes
- dia
- hora
- minutos
- segundos
Nuestro siguiente paso sera crear una variable llamada fileout, la cual sera el nombre de nuestro archivo de salida, a la cual le asignaremos el nombre «Creados» junto al valor generado en ahora y lo finalizamos con el .log, despues agregaremos una nueva linea para declarar las variables nuevas (objStream, linea, vuelta), pasemos a analizar el siguiente bloque:
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objStream = objFSO.OpenTextFile(filein, 1, false)
Set objFSOut = CreateObject("Scripting.FileSystemObject")
Set objStreamout = objFSOut.CreateTextFile(fileout, 1, false)
objStreamout.WriteLine("Inicio: " & date() & " " & time())
do while objStream.AtEndOfStream <> true
linea = objStream.readline
if vuelta > 0 then CrearUsuario(linea)
vuelta = vuelta + 1
loop
Las primera linea nos creara un objeto para poder acceder a los objetos del sistema como un archivo, la segunda creara otro objeto en base al anterior para abrir el archivo informado en filein y podamos leerlo, las siguientes lineas hacen exactamente lo mismo pero para escribir en nuestro archivo informado en fileout, nuestra siguiente linea escribira en el archivo de salida (fileout) el inicio de la operacion, luego usaremos un bucle con do que se hara mientras exista una linea en el archivo, en el cuerpo del bucle primero leeremos la linea y la asignaremos a la variable llamada linea, luego tendremos un condicional donde verifica que vuelta sea mayor a 0 si es verdad llama a CrearUsuario pasando como parametro el valor de linea, por ultimo incrementamos a vuelta, esto lo hacemos para que omita la primera linea del archivo que es la descripcion de cada columna, si no tienes esta linea puedes quitar el condicional y que trabaje directamente, pasemos a nuestro siguiente bloque:
Nota: Como pueden observar hemos quitado la creacion del archivo de salida del ejemplo anterior porque ahora debemos agregar mas lineas a las anteriores y hemos puesto a fileout al principio.
sub CrearUsuario(datos)
d = split(datos,";")
cuenta = d(0)
nombre = d(1)
apellido = d(2)
uDisplay = apellido & ", " & nombre
chequeo = FindUser(cuenta,uDisplay,ucase(Dominio))
if (chequeo="Not Found") then
empresa = d(3)
descrip = d(4)
pais = d(5)
departamento = d(6)
Set oRootLDAP = GetObject("LDAP://rootDSE")
Set oContenedor = GetObject("LDAP://CN=Users," & Dominio)
Set oNuevoUsuario = oContenedor.Create("User","cn=" & chr(34) & uDisplay & chr(34))
oNuevoUsuario.put "sAMAccountName", lcase(cuenta)
oNuevoUsuario.put "givenName", nombre
oNuevoUsuario.put "sn", apellido
oNuevoUsuario.put "UserPrincipalName", lcase(cuenta) & "@" & uDominio
oNuevoUsuario.put "cn", uDisplay
oNuevoUsuario.put "DisplayName", uDisplay
oNuevoUsuario.put "company", empresa
oNuevoUsuario.put "c", pais
oNuevoUsuario.put "department", departamento
oNuevoUsuario.put "Description", descrip
oNuevoUsuario.SetInfo
randomize timer
dim texto
do while a<12
if (a=0) then
caracter = int(rnd * 25) + 65
texto = chr(caracter)
a = a + 1
else
caracter = int(rnd * 122) + 1
if ((caracter>47 and caracter<58) or (caracter>96 and caracter<123)) then
texto = texto & chr(caracter)
a = a + 1
end if
end if
loop
uPassword = texto
oNuevoUsuario.SetPassword uPassword
oNuevoUsuario.Put "pwdLastSet", 0
oNuevoUsuario.put "userAccountControl", 544
oNuevoUsuario.SetInfo
textolog = "Se creo la cuenta: " & cuenta & vbCrLf
textolog = textolog & "El nombre completo: " & uDisplay & vbCrLf
textolog = textolog & "La contraseña es: " & uPassword & vbCrLf
textolog = textolog & "========================================" & vbCrLf
objStreamout.Write textolog
else
textolog = "Se encontro el siguiente objeto: " & chequeo &vbCrLf
textolog = textolog & "========================================" & vbCrLf
objStreamout.Write textolog
end if
En este caso todo lo que teniamos en nuestro script para generar usuarios lo transformamos en un sub llamada CrearUsuario y como atributo recibe la linea leida del archivo, a diferencia de antes esta vez no pediremos los datos sino que tomaremos el dato recibido y por medio de split lo separaremos, lo asignremos a la variable d, despues a cada uno de los campos le asignaremos el valor de d en su respectiva posicion pero al igual que antes primero asignaremos la cuenta, el nombre y el apellido, generamos a uDisplay y lo chequeamos por FindUser y si no lo encuentra procede a crear el usuario igual que antes con la creacion de la notificacion y una vez finalizado lo agrega al archivo de salida (fileout), en esto no cambio nada (salvo el hecho de que obtenemos los datos en lugar de pedirlos) y en caso de haberlo encontrado crea un mensaje de que objeto encontrado y lo agrega al archivo de salida, esto lo hara por cada linea que encuentre, una vez que termine el bucle procedera a este bloque:
objStreamout.write "Final: " & date() & " " & time()
objStreamout.close()
Set objStreamout = nothing
Set objFSOut = nothing
objStream.close()
Set objStream = nothing
Set objFSO = nothing
msgbox "Listo el pollo" & vbCrLf & "Pelada la gallina"
En este bloque agregamos la ultima linea de nuestro archivo de salida para notificar cuando finaliza y luego procedemos a cerrar ambos archivos y por ultimo mostramos la notificacion de finalizado nuestro script, veamos este script en accion
Como pueden ver en el ejemplo es la utilidad mas practica para trabajar con nuestro AD porque realmente nos ahorra nuestro trabajo, aca les comparto como se genero nuestro archivo:
Creados -20201411378.log
Inicio: 04/01/2020 11:37:08 a.m.
Se creo la cuenta: Usuario1
El nombre completo: Apellido1, Nombre1
La contraseña es: Spr5nnnudacv
========================================
Se creo la cuenta: Usuario2
El nombre completo: Apellido2, Nombre2
La contraseña es: Pcybm4vxhaan
========================================
Se encontro el siguiente objeto: Usuario3
========================================
Se encontro el siguiente objeto: Usuario4
========================================
Se creo la cuenta: Usuario5
El nombre completo: Apellido5, Nombre5
La contraseña es: Vyxwbon9rgxt
========================================
Se creo la cuenta: Usuario6
El nombre completo: Apellido6, Nombre6
La contraseña es: Dsls72tr16ja
========================================
Se creo la cuenta: Usuario7
El nombre completo: Apellido7, Nombre7
La contraseña es: C9lttk7v4zhl
========================================
Se creo la cuenta: Usuario8
El nombre completo: Apellido8, Nombre8
La contraseña es: L63iclyki90e
========================================
Se creo la cuenta: Usuario9
El nombre completo: Apellido9, Nombre9
La contraseña es: Lvx7xma4nduf
========================================
Se creo la cuenta: Usuario10
El nombre completo: Apellido10, Nombre10
La contraseña es: Es2f4i8m3hfj
========================================
Final: 04/01/2020 11:37:08 a.m.
En este caso como fueron pocos usuarios se hace realmente muy rapido pero con mas usuarios puede incrementar esta demora, con esto hemos cubierto como hacer una alta masiva de usuarios, pasemos al siguiente tema.
Bloqueo masivo de usuarios
En este caso veremos como bloquear masivamente usuarios para ello usaremos el mismo metodo que anteriormente por medio de un archivo con extension .CSV aca les paso un ejemplo del arhivo:
usuarios.csv
cuenta;motivo
Usuario1;Desvinculado
Usuario2;Renuncio
Usuario3;Sospechado de robo
Usuario4;Devinculado
Usuario5;Renuncio
Usuario6;Renuncio
Usuario7;Sospechado de hackeo
Usuario8;Renuncio
Usuario9;Despedido
Usuario10;Despedido
Para poder realizar la accion del titulo debemos usar el siguiente codigo:
bloqueofromcsv.vbs
Const ADS_UF_ACCOUNTDISABLE = 2
Const uDominio = "dc=laboratorio, dc=local"
Const titulo = "Bloqueo de usuarios v. 1.0"
Const filein = "usuarios.csv"
ahora = now
ano = datepart("yyyy",ahora)
mes = datepart("m",ahora)
dia = datepart("d",ahora)
hora = datepart("h",ahora)
minuto = datepart("n",ahora)
segundo = datepart("s",ahora)
ahora = ano & mes & dia & hora & minuto & segundo
fileout = "Bloqueados -" & ahora & ".log"
Dim objFSOut, objStreamout, fileout,textolog
Dim objFSO, objStream, linea, vuelta
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objStream = objFSO.OpenTextFile(filein, 1, false)
Set objFSOut = CreateObject("Scripting.FileSystemObject")
Set objStreamout = objFSOut.CreateTextFile(fileout, 1, false)
objStreamout.WriteLine("Inicio: " & date() & " " & time())
do while objStream.AtEndOfStream <> true
linea = objStream.readline
if vuelta > 0 then BloquearUsuario(linea)
vuelta = vuelta + 1
loop
objStreamout.write "Final: " & date() & " " & time()
objStreamout.close()
Set objStreamout = nothing
Set objFSOut = nothing
objStream.close()
Set objStream = nothing
Set objFSO = nothing
msgbox "Listo el pollo" & vbCrLf & "Pelada la gallina"
sub BloquearUsuario(usuario)
d = split(usuario,";")
cuenta = d(0)
motivo = d(1)
chequeo = FindUser(cuenta, uDominio)
if chequeo <> "Not found" then
ahora = monthname(mes) & ", " & dia & " de " & ano
fecha = (dateserial(ano, mes, dia)) + 1
Set objUser = GetObject(chequeo)
objUser.Put "userAccountControl", intUAC OR ADS_UF_ACCOUNTDISABLE
objUser.SetInfo
objUser.AccountExpirationDate = fecha
objUser.SetInfo
cuenta = "B-" & cuenta
objUser.put "sAMAccountName", lcase(cuenta)
objUser.put "UserPrincipalName", lcase(cuenta & "@laboratorio.local")
objUser.put "Description", motivo & " el " & ahora
objUser.SetInfo
textolog = "Se bloqueo el usuario: " & cuenta &vbCrLf
textolog = textolog & "==============================" & vbCrLf
else
textolog = "Usuario no encontrado: " & cuenta & vbCrLf
textolog = textolog & "==============================" & vbCrLf
end if
objStreamout.Write textolog
end sub
Function FindUser(Byval UserName, Byval Domain)
dim vUsuario
set cn = createobject("ADODB.Connection")
set cmd = createobject("ADODB.Command")
set rs = createobject("ADODB.Recordset")
cn.open "Provider=ADsDSOObject;"
cmd.activeconnection=cn
cmd.commandtext="SELECT ADsPath FROM 'GC://" & Domain & _
"' WHERE sAMAccountName = '" & UserName & "'"
set rs = cmd.execute
if err<>0 then
FindUser="Error conectandose a la base del AD:" & err.description
else
if not rs.BOF and not rs.EOF then
rs.MoveFirst
vUsuario = Replace(rs(0),"GC://","LDAP://")
FindUser=vUsuario
else
FindUser = "Not Found"
end if
end if
cn.close
end function
La primera parte trabaja de la misma forma que vimos antes pero la unica diferencia es que en lugar de llamar al archivo Creados lo llama Bloqueados, inclusive la forma de leer el archivo de origen es similar y llama al metodo BloquearUsuario, veamos este metodo:
sub BloquearUsuario(usuario)
d = split(usuario,";")
cuenta = d(0)
motivo = d(1)
chequeo = FindUser(cuenta, uDominio)
if chequeo <> "Not found" then
ahora = monthname(mes) & ", " & dia & " de " & ano
fecha = (dateserial(ano, mes, dia)) + 1
Set objUser = GetObject(chequeo)
objUser.Put "userAccountControl", intUAC OR ADS_UF_ACCOUNTDISABLE
objUser.SetInfo
objUser.AccountExpirationDate = fecha
objUser.SetInfo
cuenta = "B-" & cuenta
objUser.put "sAMAccountName", lcase(cuenta)
objUser.put "UserPrincipalName", lcase(cuenta & "@laboratorio.local")
objUser.put "Description", motivo & " el " & ahora
objUser.SetInfo
textolog = "Se bloqueo el usuario: " & cuenta &vbCrLf
textolog = textolog & "==============================" & vbCrLf
else
textolog = "Usuario no encontrado: " & cuenta & vbCrLf
textolog = textolog & "==============================" & vbCrLf
end if
objStreamout.Write textolog
end sub
Recibe la linea del archivo, la dividimos y luego los asignamos a las variables de cuenta y motivo, en lugar de pedirlas, despues trabaja de la misma forma que antes, esto lo vimos en este post, si lo encuentra lo modifica completamente pero en lugar de mostrar una notificacion creamos un texto que lo agregaremos al archivo de salida (fileout) para notificar que usuario se bloquea, en caso de no encontrarlo tambien nos notifica en el archivo, y al igual que antes una vez terminada la lectura del archivo cierra todo y nos notifica que finalizo, veamos como trabaja
Como pueden ver obtuvimos un accion sobre muchos usuarios en muy poco tiempo con todas las modificaciones que necesitamos, veamos el archivo de salida:
Bloqueados -202014121545.log
Inicio: 04/01/2020 12:15:45 p.m.
Se bloqueo el usuario: B-Usuario1
==============================
Se bloqueo el usuario: B-Usuario2
==============================
Se bloqueo el usuario: B-Usuario3
==============================
Se bloqueo el usuario: B-Usuario4
==============================
Se bloqueo el usuario: B-Usuario5
==============================
Se bloqueo el usuario: B-Usuario6
==============================
Se bloqueo el usuario: B-Usuario7
==============================
Se bloqueo el usuario: B-Usuario8
==============================
Se bloqueo el usuario: B-Usuario9
==============================
Se bloqueo el usuario: B-Usuario10
==============================
Final: 04/01/2020 12:15:45 p.m.
Ahora hablaremos sobre el ultimo tema como es la eliminacion de usuarios.
Eliminacion masiva de usuarios
Este va a ser nuestro ultimo paso, con este podremos limpiar el AD de forma segura y crearemos un pequeño log para ver cuales fueron eliminados, el archivo solamente debe tener las cuentas sin ninguna descripcion como los casos anteriores, les muestro un ejemplo:
usuarios.csv
B-Usuario1
B-Usuario2
B-Usuario3
B-Usuario4
B-Usuario5
B-Usuario6
B-Usuario7
B-Usuario8
B-Usuario9
B-Usuario10
Nuestro codigo sera el siguiente:
deletefromcsv.vbs
Const uDominio = "dc=laboratorio, dc=local"
Const titulo = "Eliminacion de usuarios v. 1.0"
Const filein = "usuarios.csv"
ahora = now
ano = datepart("yyyy",ahora)
mes = datepart("m",ahora)
dia = datepart("d",ahora)
hora = datepart("h",ahora)
minuto = datepart("n",ahora)
segundo = datepart("s",ahora)
ahora = ano & mes & dia & hora & minuto & segundo
fileout = "Eliminados -" & ahora & ".log"
Dim objFSOut, objStreamout, fileout,textolog
Dim objFSO, objStream, linea, vuelta
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objStream = objFSO.OpenTextFile(filein, 1, false)
Set objFSOut = CreateObject("Scripting.FileSystemObject")
Set objStreamout = objFSOut.CreateTextFile(fileout, 1, false)
objStreamout.WriteLine("Inicio: " & date() & " " & time())
do while objStream.AtEndOfStream <> true
linea = objStream.readline
BorrarUsuario(linea)
loop
objStreamout.write "Final: " & date() & " " & time()
objStreamout.close()
Set objStreamout = nothing
Set objFSOut = nothing
objStream.close()
Set objStream = nothing
Set objFSO = nothing
msgbox "Listo el pollo" & vbCrLf & "Pelada la gallina"
sub BorrarUsuario(cuenta)
chequeo = FindUser(cuenta, uDominio)
if chequeo <> "Not found" then
d = split(chequeo, ",")
c = d(0) & "," & d(1)
cuenta = replace(c,"\","")
cuenta = mid(cuenta,1,3) & chr(34) & mid(cuenta,4,len(cuenta)) & chr(34)
for a=2 to ubound(d)
ou = ou & "," & d(a)
next
ou = lcase(mid(ou,2,len(ou)))
Set objOU = GetObject("LDAP://" & ou)
objOU.Delete "user", cuenta
textolog = "El usuario " & linea & " fue eliminado del AD." & vbCrLf
textolog = textolog & "========================================" & vbCrLf
else
textolog = "El usuario " & linea & " no fue encontrado." & vbCrLf
textolog = textolog & "========================================" & vbCrLf
end if
objStreamout.Write textolog
end sub
Function FindUser(Byval UserName, Byval Domain)
dim vUsuario
set cn = createobject("ADODB.Connection")
set cmd = createobject("ADODB.Command")
set rs = createobject("ADODB.Recordset")
cn.open "Provider=ADsDSOObject;"
cmd.activeconnection=cn
cmd.commandtext="SELECT cn FROM 'GC://" & Domain & _
"' WHERE sAMAccountName = '" & UserName & "'"
set rs = cmd.execute
if err<>0 then
FindUser="Error conectandose a la base del AD:" & err.description
else
if not rs.BOF and not rs.EOF then
rs.MoveFirst
vUsuario = Replace(rs(0),"GC://","")
FindUser=vUsuario
else
FindUser = "Not Found"
end if
end if
cn.close
end function
Al igual que en los casos anteriores utilizaremos las rutinas para leer el archivo y para escribir un log, las lineas encargadas de eliminar el usuario se transforman en la sub BorrarUsuario pero en este caso no necesitamos un split sino que recibe directamente el usuario lo busca de la misma forma que lo explicamos en este post y procede a borrarlo si lo encuentra pero la diferencia esta que lo escribe en el archivo de salida, el ciclo es igual al de los casos anteriores, veamos su trabajo
Lo malo de esto es que no podemos volver atras nuestra accion y una vez eliminado se elimino completamente, el archivo de salida quedara de la siguiente forma:
Eliminados -202014123618.log
Inicio: 04/01/2020 12:36:18 p.m.
El usuario B-Usuario1 fue eliminado del AD.
========================================
El usuario B-Usuario2 fue eliminado del AD.
========================================
El usuario B-Usuario3 fue eliminado del AD.
========================================
El usuario B-Usuario4 fue eliminado del AD.
========================================
El usuario B-Usuario5 fue eliminado del AD.
========================================
El usuario B-Usuario6 fue eliminado del AD.
========================================
El usuario B-Usuario7 fue eliminado del AD.
========================================
El usuario B-Usuario8 fue eliminado del AD.
========================================
El usuario B-Usuario9 fue eliminado del AD.
========================================
El usuario B-Usuario10 fue eliminado del AD.
========================================
Final: 04/01/2020 12:36:19 p.m.
Nota: Tecnicamente se puede volver a recuperar el usuario eliminado pero es una tarea tan engorrosa y se necesita una herramienta especial que igualmente no recupera al usuario completamente que es mas facil volver a solicitar la informcion y generarlo nuevamente.
Con esto hicimos tres scripts basicos para poder hacer un simple mantenimiento de un Active Directory en forma masiva ya sea para ingresar nuevos usuarios, bloquearlos o directamente eliminarlos, esto es simplemente una base practica de aqui en mas se puede mejorar y agregar mas opciones, si captaron el concepto de lectura de archivos esto mismo pueden hacer tanto para el desbloqueo de usuarios como para los grupos que vimos en posts anteriores.
En resumen, hoy hemos visto como hacer el alta masiva de usuarios, como poder hacer un log y retener los datos que debemos enviar, hemos visto como desactivar usuarios de forma masiva, y como eliminarlos de forma masiva, hemos visto las pequeñas modificaciones que se deben hacer para poder trabajar con archivos y como poder utilizarlo mientras el archivo contenga informacion, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.
Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.
Tambien podes comprar mi libro sobre VBscript en Amazon


Tambien podes donar
Es para mantenimiento del sitio, gracias!
$1.50