Anuncios

Bienvenidos sean a este post, hoy completaremos definitivamente la saga de Active Directory con VBscript, en este caso vamos a ver como podemos hacer un ABM sobre cuentas de computadoras en el AD, en este caso vamos a realizar tres acciones basicas las cuales son las que mas usaremos, estas son la creacion, el mover y eliminar una cuenta.

Anuncios

Crear una cuenta para Computadora

Comencemos con la primera accion que es crear una cuenta en el AD para una computadora, en este caso tambien agregaremos una opcion, comencemos viendo el codigo:

CrearCom.vbs

Const ADS_UF_PASSWD_NOTREQD		= &h0020
Const ADS_UF_WORKSTATION_TRUST_ACCOUNT	= &h1000
Const titulo = "Agregando equipos v.1.0"
dim computadora, descrip, ou, ruta, dominio, vCompu

Set objRootDSE = GetObject("LDAP://rootDSE")
dominio = objRootDSE.Get("defaultNamingContext")

computadora = inputbox("Ingresa el nombre del equipo",titulo)
vCompu = FindCompu(computadora, dominio)

if (vCompu="Not Found") then
	descrip = inputbox("Descripcion del equipo",titulo)
	ruta = inputbox("Ingresa la OU de destino", titulo)
	if (ruta<>"") then
		ou = ConvertirOU(ruta)
	else
		ou = "cn=Computers"
	end if

	Set objContainer = GetObject("LDAP://" & ou & "," & dominio)

	Set objComputer = objContainer.Create("Computer", "cn=" & computadora)
	objComputer.Put "sAMAccountName", computadora & "$"
	objComputer.Put "userAccountControl", _
			ADS_UF_PASSWORD_NOTREQD Or ADS_UF_WORKSTATION_TRUST_ACCOUNT
	objComputer.Put "Description", descrip
	objComputer.SetInfo

	msgbox "Listo el pollo" & vbCrLf & "Pelada la Gallina!"
else
	Msgbox "El equipo " & computadora & " ya existe,"
end if



function ConvertirOU(ByVal camino)
	dim c, texto
	c = split(camino,"/")
	for a=ubound(c) to 1 step -1
		texto = texto & "ou=" & c(a) & ","
	next
	texto = mid(texto,1,len(texto)-1)
	ConvertirOU = texto
end function

Function FindCompu(Byval CompuName, Byval Domain)

	dim vCompu

	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 = '" & CompuName & "$'"

	set rs = cmd.execute
	if err<>0 then
		 FindCompu="Error conectandose a la base del AD:" & err.description
	else
		if not rs.BOF and not rs.EOF then
			rs.MoveFirst
			vCompu = Replace(rs(0),"GC://","LDAP://")
			FindCompu = vCompu
		else
	 		FindCompu = "Not Found"
		end if
	end if
	cn.close
end function 

Vamos a analizar este codigo, primero veamos el siguiente bloque:

Const ADS_UF_PASSWD_NOTREQD		= &h0020
Const ADS_UF_WORKSTATION_TRUST_ACCOUNT	= &h1000
Const titulo = "Agregando equipos v.1.0"
dim computadora, descrip, ou, ruta, dominio, vCompu
Anuncios

En este caso definiremos tres constantes, las dos primeras nos permitiran agregar la cuenta del equipo, especialmente la segunda establece que el dominio puede confiar en la cuenta, luego usaremos una constante para el titulo de los mensajes, despues declararemos las variables que usaremos durante el programa, antes de continuar con el codigo principal vamos a analizar la primera funcion:

function ConvertirOU(ByVal camino)
	dim c, texto
	c = split(camino,"/")
	for a=ubound(c) to 1 step -1
		texto = texto & "ou=" & c(a) & ","
	next
	texto = mid(texto,1,len(texto)-1)
	ConvertirOU = texto
end function
Anuncios

Esta funcion nos permitira convertir una ubicacion que podemos pasar del AD en un formato que pueda interpretar el AD via script, si quieren saber mas sobre este codigo les recomiendo este post donde explico como trabaja, en este codigo tambien tendremos la siguiente funcion:

Function FindCompu(Byval CompuName, Byval Domain)

	dim vCompu

	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 = '" & CompuName & "$'"

	set rs = cmd.execute
	if err<>0 then
		 FindCompu="Error conectandose a la base del AD:" & err.description
	else
		if not rs.BOF and not rs.EOF then
			rs.MoveFirst
			vCompu = Replace(rs(0),"GC://","LDAP://")
			FindCompu = vCompu
		else
	 		FindCompu = "Not Found"
		end if
	end if
	cn.close
end function
Anuncios

Este es una adaptacion de la funcion para buscar usuarios en una funcion para buscar computadoras, recibira dos datos: el nombre del equipo (CompuName) y el dominio (Domain), y despues crearemos una variable llamada vCompu, nuestro siguiente paso sera establecer la conexion con la base del AD y esto lo logramos con las siguientes cuatro lineas a la variable anterior, nuestra parte mas interesante es esta:

	cmd.commandtext="SELECT ADSPath FROM 'GC://" & Domain & _
	   "' WHERE sAMAccountName = '" & CompuName & "$'"
Anuncios

Esta linea sera la que chequea si existe o no el equipo, porque le diremos que busque el contenedor completo del computador (ADSPath) en base al dominio (Domain) y el nombre del equipo (CompuName), como nosotros vamos a usar el sAMAccountName para la condicion le agregamos un signo de pesos ($) despues del nombre del equipo porque asi se almacena en el AD, luego le diremos que lo ejecute y si err es distinto de cero, nos mostrara un mensaje porque por alguna razon no pudo ejecutar el codigo antes mencionado, en cambio si este se pudo ejecutar usara un condicional para verificar que no esta ni al principio ni al final de rs (objeto donde ejecuto el query), en caso de ser verdadero procedemos a movernos a la primer coincidencia en rs, donde reemplazaremos el dato GC:// por LDAP://, luego asignaremos ese valor a la funcion, en caso de que no sea verdadero (es decir no encontro el equipo) procede a asignar a la funcion la frase “Not Found”, y vuelve al codigo.

Anuncios

Con esto explicado volvamos a nuestro codigo, nuestro primer paso sera crear el objeto objRootDSE, el cual usaremos para obtener la raiz de nuestro AD, despues con Get y defaultNamiingContext obtendremos el dominio para usar en nuestro script por eso lo almacenamos en dominio, el formato es el que puede interpretar el AD via script, nuestro siguiente paso sera pedir que ingrese el nombre del equipo, una vez ingresado usaremos a FindCompu para ver si existe o no, en base a lo que nos devuelva la funcion anterior ejecutaremos el programa o no, para ello usamos un condicional donde chequea si vCompu es igual a “Not Found” o no, en caso de no ser igual a Not Found quiere decir que encontro un equipo con ese nombre, procede a notificarnos que ya existe un equipo con ese nombre y sale del programa, pero si cumple la condicion procedera a ejecutar este bloque:

	descrip = inputbox("Descripcion del equipo",titulo)
	ruta = inputbox("Ingresa la OU de destino", titulo)
	if (ruta<>"") then
		ou = ConvertirOU(ruta)
	else
		ou = "cn=Computers"
	end if

	Set objContainer = GetObject("LDAP://" & ou & "," & dominio)

	Set objComputer = objContainer.Create("Computer", "cn=" & computadora)
	objComputer.Put "sAMAccountName", computadora & "$"
	objComputer.Put "userAccountControl", _
			ADS_UF_PASSWORD_NOTREQD Or ADS_UF_WORKSTATION_TRUST_ACCOUNT
	objComputer.Put "Description", descrip
	objComputer.SetInfo

	msgbox "Listo el pollo" & vbCrLf & "Pelada la Gallina!"
Anuncios

En este caso lo primero que nos pedira sera una descripcion para el equipo en descrip, esta informacion puede ser usada para varios temas, por ejemplo para identificar a quien pertenece el equipo, ya sea por usuario de red, nombre del mismo, la etiqueta de identificacion del equipo, datos del equipo como el serie, marca, modelo, etc, en este campo podemos guardar la informacion que nos parezca necesaria y nos pueda servir para otras tareas, luego podemos ingresar la ubicacion del equipo y la vamos a almacenar en ruta, es decir en que OU lo queremos ubicar o simplemente dejarlo en blanco, luego tendremos un condicional donde chequea si ingresamos un valor a ruta o no, en caso de ser verdadero procede a llamar a ConvertirOU y le enviamos el valor de ruta, lo procesa y se lo asigna a ou, en caso de que lo dejemos en blanco procede con la asignacion de ou con el valor predeterminado.

Nota: En el video mostrare como se obtiene la ubicacion para convertirlo en OU.
Anuncios

Nuestro siguiente paso sera crear el objeto para el contenedor, donde le pasaremos a ou y dominio, el siguiente objeto es la computadora y con el objeto anterior (objContainer) usamos el metodo Create, le decimos que es una computadora (computer) y el nombre canonico sera el de computadora, despues tomaremos este objeto (objComputer) y por medio de Put le asignaremos el sAMAccountName, observen que le pusimos el signo de pesos al final, luego activamos a la cuenta por medio de las constantes que definimos al principio, despues le pondremos los valores que ingreasamos en descrip para finalmente usar el SetInfo y que tome todas las modificaciones que ingresamos, la ultima linea es simplemente para notificarnos que ya se ejecuto el programa con exito 😁, probemos a nuestro programa con el siguiente video

Espero que les haya gustado, ahora procederemos a explicar como realizar el movimiento de un equipo a otra seccion del AD.

Anuncios

Moviendo entre OUs

Muchas veces por un tema de re-organizacion, mejora de la estructura, cambio de la estructura, etc, debemos re-ubicar a los equipos en otros OUs, para ello les voy a proveer de un script simple pero efectivo, veamos primero su codigo:

MoverCpu.vbs

Const titulo = "Moviendo Equipos"
dim rutanueva, rutavieja, equipo

Set objRootDSE = GetObject("LDAP://rootDSE")
Dominio = objRootDSE.Get("defaultNamingContext")

equipo = inputbox("Ingresa el nombre del equipo", titulo)
rutavieja = FindCompu(equipo, ucase(Dominio))

if (rutavieja <> "Not Found") then
	rutanueva = inputbox("Ingresa la nueva OU", titulo)
	rutanueva = ConvertirOu(rutanueva)
	equipo = "CN=" & equipo
	Set objNewOU = GetObject("LDAP://" & rutanueva & "," & Dominio)
	Set objMoveComputer = objNewOU.MoveHere(rutavieja,equipo)
	msgbox "Listo el Pollo" & vbCrLf & "Pelada la gallina"
else
	msgbox "El equipo no fue encontrado"
end if

function ConvertirOU(ByVal camino)
	dim c, texto
	c = split(camino,"/")
	for a=ubound(c) to 1 step -1
		texto = texto & "ou=" & c(a) & ","
	next
	texto = mid(texto,1,len(texto)-1)
	ConvertirOU = texto
end function

Function FindCompu(Byval CompuName, Byval Domain)

	dim vCompu

	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 = '" & CompuName & "$'"

	set rs = cmd.execute
	if err<>0 then
		 FindCompu="Error conectandose a la base del AD:" & err.description
	else
		if not rs.BOF and not rs.EOF then
			rs.MoveFirst
			vCompu = Replace(rs(0),"GC://","LDAP://")
			FindCompu = vCompu
		else
	 		FindCompu = "Not Found"
		end if
	end if
	cn.close
end function 
Anuncios

En este caso primero definimos una constante para el titulo y las variables que usaremos en el codigo, volvemos a crear el objeto objRootDSE para obtener el dominio exactamente igual que el ejemplo anterior, luego tendremos las mismas funciones que el codigo anterior que tambien haran las mismas tareas, la verdadera diferencia estara en el codigo, donde primero le diremos que ingrese el nombre del equipo, este lo buscara por medio de FindCompu y lo almacenara en rutavieja, en caso de que el valor sea “Not Found” procede a mostrar un mensaje diciendo que no encontro el equipo y sale del programa, en caso de haber encontrado el equipo procedera a ejecutar este bloque:

	rutanueva = inputbox("Ingresa la nueva OU", titulo)
	rutanueva = ConvertirOu(rutanueva)
	equipo = "CN=" & equipo
	Set objNewOU = GetObject("LDAP://" & rutanueva & "," & Dominio)
	Set objMoveComputer = objNewOU.MoveHere(rutavieja,equipo)
	msgbox "Listo el Pollo" & vbCrLf & "Pelada la gallina"
Anuncios

En este bloque primero pediremos la nueva ubicacion para el computador, luego lo convertiremos por medio de ConvertirOU, nuestro siguiente paso sera modificar a equipo para que tenga adelante a cn= (canonical name), el siguiente paso sera crear un objeto que sera el nuevo destino (objNewOU), por medio de GetObject le enviamos los datos que creamos anteriormente, para luego crear otro objeto donde usaremos al objeto anterior y por medio del metodo MoveHere le pasaremos la ubicacion anterior, que obtuvimos por medio de FindCompu y el valor de equipo, con esto se abra realizado el movimiento y despues notificamos en pantalla que se realizo la tarea, vamos a probar el programa mediante el siguiente video

Con esto ya logramos dos objetivos, el primero fue crear las pcs en el AD, el segundo fue mover a donde queramos una cuenta de pc, nuestro siguiente paso sera eliminar la cuenta.

Anuncios

Elimnar cuenta de PC

Anuncios

Hay momentos cuando nuestro AD se encuentra saturado porque se han actualizado equipos, se ha desvinculado gente, etc, y tenemos muchos objetos en nuestro AD que ya no son utilizados y a su vez nos dificultan a la hora de tener una mejor visual del mismo, en otros posts hemos visto como eliminar las cuentas de usuarios pero ahora veremos como eliminar las de pc mediante el siguiente codigo:

DeleteCpu.vbs

Const titulo = "Eliminando Equipos"
dim equipo, ruta, dominio, aviso

Set objRootDSE = GetObject("LDAP://rootDSE")

equipo = inputbox("Ingresa el equipo", titulo)
dominio = objRootDSE.Get("defaultNamingContext")
ruta = FindCompu(equipo, Dominio)

if (ruta<>"Not Found") then
	aviso = msgbox("Esta Seguro?",1,titulo)
	if (aviso = 1) then
		set objComputer = GetObject(ruta)
		objComputer.DeleteObject(0)
		msgbox equipo & " Was Destroyed!!!",,titulo	
	end if
else
	msgbox "No se encontro el equipo",,titulo
end if

Function FindCompu(Byval CompuName, Byval Domain)

	dim vCompu

	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 = '" & CompuName & "$'"

	set rs = cmd.execute
	if err<>0 then
		 FindCompu="Error conectandose a la base del AD:" & err.description
	else
		if not rs.BOF and not rs.EOF then
			rs.MoveFirst
			vCompu = Replace(rs(0),"GC://","LDAP://")
			FindCompu = vCompu
		else
	 		FindCompu = "Not Found"
		end if
	end if
	cn.close
end function 
Anuncios

Volvemos a hacer lo mismo, definimos una constante para el titulo en los mensajes, luego las variables que usaremos, definimos nuevamente a objRootDSE, antes de pasar al codigo observemos que no tenemos a ConvertirOU porque en este caso no es necesario pero si seguimos teniendo a FindCompu porque es la que nos buscara el equipo de la misma forma que lo vinimos haciendo hasta ahora, luego pediremos que nos ingresen el nombre del equipo, para luego buscar el dominio y almacenarlo, nuestro siguiente paso sera buscar si existe el equipo o no mediante FindCompu, una vez devuelto tenemos un condicional que chequea si existe o no, sino existe nos muestra un mensaje en pantalla y sale del programa, por lo contrario si existe usa este bloque:

	aviso = msgbox("Esta Seguro?",1,titulo)
	if (aviso = 1) then
		set objComputer = GetObject(ruta)
		objComputer.DeleteObject(0)
		msgbox equipo & " Was Destroyed!!!",,titulo	
	end if
Anuncios

Primero nos notifica si estamos seguro, para este aviso usamos un msgbox que tendra los botones Aceptar y Cancelar, si apretamos Aceptar nos devolvera el valor 1 y si presionamos Cancelar nos devolvera 2, nuestro siguiente paso sera un condicional que chequea si aviso es igual a 1, si es verdadero crea el objeto para ubicar al ordenador en cuestion, el valor lo usamos con lo informado en ruta, la siguiente linea se encarga de borrarlo, por ultimo notificamos que el equipo fue destruido 😱, probemos el programa con el siguiente video

Anuncios

Con esto podemos hacer una ABM basico de nuestro AD a nivel PCs, ya podemos crear, mover y eliminar las mismas.

Anuncios

En resumen, hoy hemos visto como por medio de VBScript se puede, crear una cuenta, ubicarla donde creamos conveniente, donde dejarla de forma predeterminada, como modificar algunos campos, tambien hemos visto como podemos mover las cuentas dentro del AD, simplemente informando el destino y por ultimo hemos visto como eliminarlos cuando ya no sean necesarias, 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