Bienvenidos sean a este post, hoy veremos como se puede desactivar o activar un usuario, como eliminarlo y como desbloquearlo que no es lo mismo que activarlo, vamos a comenzar con el mas sencillo y el mas solicitado como es el desbloqueo de un usuario.
Desbloqueo de usuario
En muchos empresas donde tienen un dominio de Active Directory usan una politica de bloquear el usuario cuando tiene una X cantidad de veces de ingreso incorrecto de la contraseña

Cuando ocurre esto es porque nuestro usuario ha sido bloqueado y si bien permanece activo no podremos ingresar en ningun equipo del dominio, si buscamos su estado en el AD lo veremos de la siguiente manera

Podemos desbloquearlo desde aca simplemente destildando la opcion pero vamos a hacerlo mas divertido por medio de un script, para ello usaremos el siguiente codigo:
unlockusr.vbs
Const uDominio = "dc=laboratorio, dc=local"
Const titulo = "Desbloqueo de usuario v. 1.0"
cuenta = inputbox("Ingresa la cuenta a desbloquear",titulo)
chequeo = FindUser(cuenta, uDominio)
if (chequeo = "Not Found") then
msgbox "Usuario no encontrado en el AD.",,titulo
else
Set objUser = GetObject("LDAP://" & chequeo)
objUser.IsAccountLocked = False
objUser.SetInfo
msgbox "Script finalizado"
end if
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://","")
FindUser=vUsuario
else
FindUser = "Not Found"
end if
end if
cn.close
end function
En este caso definimos las dos constantes que usamos anteriormente para el dominio y el titulo, luego ingresaremos la cuenta a desbloquear para encontrar el dato completo usaremos nuevamente a FindUser donde devolvera el usuario o un «Not Found», despues de finalizada la funcion chequearemos su resultado almacenado en chequeo si es «Not Found» devuelve un mensaje y finaliza, de lo contrario usara este bloque:
Set objUser = GetObject("LDAP://" & chequeo)
objUser.IsAccountLocked = False
objUser.SetInfo
Primero crearemos un objeto con todos los datos obtenidos de la funcion FindUser, desspues en este objeto usaremos la propiedad IsAccountLocked y lo setearemos como false, por ultimo aplicaremos los cambios con SetInfo, con esto desbloqueamos el usuario y nuestra tarea sera realizada, veamos el siguiente video
Nota: Si quieren ver el dato que devuelve usen un msgbox para mostrar a chequeo.
Como pueden ver en el video hicimos un script simple para desbloquear usuarios, ahora hablaremos sobre el siguiente tema como es desactivar usuarios.
Desactivando usuarios
En este caso no dependera de ninguna politica ni nada relacionado sino que es la posibilidad de inhabilitar el acceso a toda la red a un usuario, si bien el bloqueo de un usuario es similar en este caso lo podemos hacer nosotros a pedido ya sea porque el usuario violo un acceso a donde no debia, por alguna razon se lo desvincula, se esta investigando por un tema de seguridad, en fin lo que sea que motive la desactivacion del mismo para ello vamos a usar el siguiente codigo:
desactivar.vbs
Const ADS_UF_ACCOUNTDISABLE = 2
Const uDominio = "dc=laboratorio, dc=local"
Const titulo = "Bloqueo de usuarios v. 1.0"
cuenta = inputbox("Ingresa el usuario", titulo)
motivo = inputbox("Ingresa el motivo", titulo)
chequeo = FindUser(cuenta, uDominio)
if chequeo <> "Not found" then
ahora = now
ano = datepart("yyyy", ahora)
mes = datepart("m", ahora)
dia = datepart("d", ahora)
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
else
msgbox "Usuario no encontrado"
end if
msgbox "Script finalizado"
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
En este codigo la primer constante es la encargada de desactivar el usuario pero ahora solamente lo setearemos, despues ingresaremos dos valores, una va a ser la cuenta y la otra el motivo por el cual se desactiva el usuario, luego tendremos a chequeo donde guardara el valor obtenido de FindUser, en este caso nos devolvera el nombre canonico del usuario, la ubicacion y el dominio, luego tendremos un condicional donde verificara que chequeo sea distinto de «Not found», si es asi procede a ejecutar el bloque que tiene asignado, las primeras lineas tomaran la fecha actual y la dividiran en distintas partes (dia, mes y año) para luego unirlas de otra forma con el el formato de nombre de mes, fecha y año, luego usaremos a dateserial para generar la fecha que dividimos antes y luego explicaremos para que, una vez hecho esto tendremos este bloque:
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
Primero crearemos el objeto en base a lo obtenido con FindUser, con el objeto creado usaremos userAccountControl la cual es la encargada de activar o desactivar el usuario, para eso usamos intUAC con un OR a la constante que definimos al principio, seteamos el nuevo valor, con esto desactivamos el usuario, nuestro siguientes pasos seran administrativos, el AccountExpirationDate recibira el valor que generamos por medio de dateserial (fecha) y tambien lo establecemos, nuestro siguiente paso sera tomar a cuenta y le agregaremos un B- para indicar que fue bloqueado, luego lo pasaremos a sAMAccountName, despues lo pasaremos a UserPrincipalName pero le agregaremos el @laboratorio.local, por ultimo tomaremos a Description y la pasaremos el motivo y la fecha que generamos en ahora, por ultimo establecemos todos los cambios veamos el siguiente video para visualizar como trabaja
Nota: Para este ejemplo cree 4 usuarios nuevos por medio del script newuser.vbs
No es necesario modificar el usuario como lo hicimos pero si es mas practico para hacer una busqueda con todos los usuarios que fueron desactivados para crear una lista y ejecutar lo que veremos un poco mas adelante, con esto ya imposibilitamos al usuario de ingresar al dominio, tomemos algun caso de ejemplo como se ve a continuacion

Ahora pasaremos al siguiente paso que es la reactivacion de dicha cuenta porque esta situacion puede suceder.
Reactivacion de usuarios
Esto trabaja de forma similar pero como hicimos varias modificaciones al momento de desactivarlo ahora tendremos que volver todo hacia atras, veamos el siguiente codigo:
reactivar.vbs
Const ADS_UF_ACCOUNTENABLE = 544
Const uDominio = "dc=laboratorio, dc=local"
Const titulo = "Bloqueo de usuarios v. 1.0"
cuenta = inputbox("Ingresa el usuario", titulo)
chequeo = FindUser("b-" & cuenta, uDominio)
if chequeo <> "Not found" then
Set objUser = GetObject(chequeo)
objUser.Put "userAccountControl", ADS_UF_ACCOUNTENABLE
objUser.SetInfo
objUser.AccountExpirationDate = cdate("1/1/1970")
objUser.SetInfo
objUser.put "sAMAccountName", lcase(cuenta)
objUser.put "UserPrincipalName", lcase(cuenta & "@laboratorio.local")
objUser.put "Description", "usuario reactivado"
objUser.SetInfo
else
msgbox "Usuario no encontrado"
end if
msgbox "Script finalizado"
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
Este trabaja de forma similar al anterior pero al reves, en este caso ingresaremos la cuenta a reactivar, cuando la enviamos a FindUser le agregamos el «B-» que seteamos con el script anterior, entonces procedera a buscar ese usuario, en caso de encontrarlo procedera a ejecutar estos metodos:
Set objUser = GetObject(chequeo)
objUser.Put "userAccountControl", ADS_UF_ACCOUNTENABLE
objUser.SetInfo
objUser.AccountExpirationDate = cdate("1/1/1970")
objUser.SetInfo
objUser.put "sAMAccountName", lcase(cuenta)
objUser.put "UserPrincipalName", lcase(cuenta & "@laboratorio.local")
objUser.put "Description", "usuario reactivado"
objUser.SetInfo
En este caso la primer linea nos creara el objeto que obtuvimos con FindUser, luego modificaremos la propiedad que activa o desactiva al usuario con este valor la constante del principio, la siguiente linea aplica la modificacion, con esto ya activamos el usuario nuestros siguientes pasos seran la parte estetica porque la siguiente linea desactivara la expiracion del usuario, para desactivar la expiracion se debe usar si o si esa fecha, luego aplicamos el cambio, nuestros siguientes pasos sera la modificacion de la cuenta (sAMAccountName), el display principal (UserPrincipalName) y la descripcion (Description) en los dos casos anteriores volver el usuario a la normalidad y en la descripcion, opcional, aclaramos que el usuario se reactivo, una vez terminado aplicamos los cambios, veamos como trabaja en el siguiente video
Con esto podremos reactivar nuestros usuarios y volver hacia atras los cambios realizados en la cuenta, ahora pasaremos al ultimo paso.
Borrando usuarios
Este es el ultimo paso que podremos hacer con un usuario, ya que anteriormente hemos desbloqueado un usuario que fue bloqueado por una politica, hemos desactivado un usuario que fue desvinculado por una razon, hemos visto como reactivar el usuario si fue reincorporado o fue desactivado por error, ahora veremos como eliminar un usuario del AD, vamos a suponer la siguiente situacion, nosotros estamos en una empresa que desactiva los usuarios por 30 dias donde el mismo puede ser recontratado, reincorporado o puede ser revertida la situacion que sea que lo haya desactivado, una vez pasado los 30 dias sino se reincorporo a esta persona debemos proceder a limpiar nuestro AD de gente que no pertenece a la misma, para ello usaremos el siguiente codigo:
killuser.vbs
Const uDominio = "dc=laboratorio, dc=local"
Const titulo = "Eliminacion de usuarios v. 1.0"
cuenta = inputbox("Ingresa el usuario", titulo)
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
msgbox "Usuario terminado."
else
msgbox "El usuario no fue encontrado."
end if
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://","")
FindUser=vUsuario
else
FindUser = "Not Found"
end if
end if
cn.close
end function
Al igual que en otros casos usaremos las dos constantes que vinimos usando hasta ahora para el titulo de los mensajes y el dominio para el AD, nuestro siguiente paso sera ingresar la cuenta a eliminar, si fuera una cuenta que desactivamos con nuestro script anterior recuerden agregar el b- antes de la cuenta porque de lo contrario no la encontrara, una vez ingresada la cuenta la buscaremos con FindUser como vinimos haciendo hasta ahora.
Una vez que nos devuelva todo el Path completo del usuario usaremos el siguiente bloque:
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)))
En este bloque generaremos la ubicacion y la cuenta a eliminar, primero separaremos a chequeo mediante las comas, con esto obtendremos todos los datos que necesitamos, nuestro siguiente paso sera generar la cuenta, para eso usamos una variable llamada c a la cual le pasaremos los dos primeros valores, generando nuestra cuenta pero como el valor debemos pasarlo con comillas tendremos que hacer un par de modificaciones, la primera sera eliminar la barra invertida que posee, para ello usamos el replace para reemplazarla por nada, y luego usaremos dos mid para obtener la parte que dice «cn=» de cuenta, ingresar una comillas por medio de chr, usar otro mid donde obtendremos todo el resto de cuenta y lo cerraremos nuevamente con comillas, nuestro siguiente paso sera generar la ubicacion o el ou de la cuenta, para ello usaremos un bucle for que contara a partir de 2 hasta el ultimo valor de d, recuerden que split lo transformo en array, nuestro siguiente paso sera agregar a ou el valor de cada posicion de d, una vez finalizado usaremos otro mid para eliminar la primer coma que nos quedo de la concatenacion anterior por eso usamos a partir de la segunda posicion hasta el final, pasemos al bloque que hace la magia:
Nota: Si desean y quieren ver como convirtio los datos les recomiendo agregar un msgbox con las variables antes del siguiente bloque y despues del anterior para poder verlos.
Set objOU = GetObject("LDAP://" & ou)
objOU.Delete "user", cuenta
En este caso primero crearemos un objeto donde estara el contenedor de nuestro usuario, pasando el valor generado en ou, luego usaremos el metodo Delete a la cual le diremos que es un User, en este post lo vimos pero para grupos, y luego le pasaremos la variable cuenta, si todo sale bien borrara el usuario y nos notificara en pantalla que fue eliminado, en caso de no haber sido encontrado tambien nos lo notificara, es decir que chequeo es igual a «Not found», con esto ya tenemos un script para eliminar usuarios veamoslo en accion
Con esto ya cubrimos todos los estados que puede tener un usuario, como afectar a los mismos, y en el ultimo caso como limpiar nuestro AD con usuarios que ya no tienen necesidad de estar en el mismo.
En resumen, hoy hemos visto como desbloquear un usuario via VBscript, una de las tareas mas buscadas, como desactivar un usuario y hacer las modificaciones para que no pueda ingresar y quedar documentado, los motivos de porque hacerlo asi, como reactivar dicha cuenta y como volver atras las modificaciones, y por ultimo como eliminar directamente un usuario del AD, 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