Anuncios

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.

Anuncios

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

Anuncios

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

Anuncios

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
Anuncios

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
Anuncios

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.

Anuncios

Desactivando usuarios

Anuncios

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
Anuncios

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
Anuncios

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
Anuncios

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.

Anuncios

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
Anuncios

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
Anuncios

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.

Anuncios

Borrando usuarios

Anuncios

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
Anuncios

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.

Anuncios

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)))
Anuncios

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
Anuncios

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.

Anuncios

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.

Anuncios

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.00