Anuncios

Bienvenidos sean a este post, en el post anterior finalizamos (por ahora) un script para generar un usuario en nuestro Active Directory y para el caso de hoy nos centraremos en los grupos.

Anuncios

Estos grupos tienen varios usos pero principalmente para asignar permisos a un grupo de usuarios tambien tienen otros usos pero en general son para eso, veamos primero el script basico para crear un nuevo grupo:

creargrupo.vbs

Const ADS_GROUP_TYPE_LOCAL_GROUP = &h4
Const ADS_GROUP_TYPE_GLOBAL_GROUP = &h2
Const ADS_GROUP_TYPE_UNIVERSAL_GROUP = &h8
Const ADS_GROUP_TYPE_SECURITY_ENABLED = &h80000000
Const titulo = "Alta de grupo v. 1.0"

nombre = inputbox("Ingresa el nombre",titulo)
texto = "Elige el rango del grupo:" & vbCrLf
texto = texto & "1)Dominio Local" & vbCrLf
texto = texto & "2)Global" & vbCrLf
texto = texto & "3)Universal"
rango = inputbox(texto,titulo,1)
texto = "Elige el tipo del grupo:" & vbCrLf
texto = texto & "1)Seguridad" & vbCrLf
texto = texto & "2)Distribucion"
tipo = inputbox(texto, titulo,1)


Set objOU = GetObject("LDAP://cn=users,dc=laboratorio,dc=local")
Set objGroup = objOU.Create("Group", "cn=" & nombre)
objGroup.Put "sAMAccountName", replace(nombre,chr(32),"_",1,100)

select case rango

	case 3
		if tipo = 2 then
			objGroup.Put "groupType", ADS_GROUP_TYPE_UNIVERSAL_GROUP
		else
			objGroup.Put "groupType", ADS_GROUP_TYPE_UNIVERSAL_GROUP or _
			ADS_GROUP_TYPE_SECURITY_ENABLED
		end if 
		

	case 2
		if tipo = 2 then
			objGroup.Put "groupType", ADS_GROUP_TYPE_GLOBAL_GROUP
		else
			objGroup.Put "groupType", ADS_GROUP_TYPE_GLOBAL_GROUP or _
			ADS_GROUP_TYPE_SECURITY_ENABLED
		end if 

	case else
		if tipo = 2 then
			objGroup.Put "groupType", ADS_GROUP_TYPE_LOCAL_GROUP		
		else
			objGroup.Put "groupType", ADS_GROUP_TYPE_LOCAL_GROUP or _
			ADS_GROUP_TYPE_SECURITY_ENABLED
		end if 
		

end select

objGroup.SetInfo

msgbox "Se acabo el script"
Anuncios

Este es un codigo simple para crear un grupo en nuestro AD, para ello primero analicemos este bloque de constantes:

Const ADS_GROUP_TYPE_LOCAL_GROUP = &h4
Const ADS_GROUP_TYPE_GLOBAL_GROUP = &h2
Const ADS_GROUP_TYPE_UNIVERSAL_GROUP = &h8
Const ADS_GROUP_TYPE_SECURITY_ENABLED = &h80000000
Anuncios

Las tres primeras constantes nos serviran para definir el rango del grupo que vamos a crear siendo el primero para el dominio local, el segundo para global y el ultimo para universal, cada rango tiene su propio alcance, el local sera unicamente para el dominio donde se creo, el segundo es ideal para permitir acceder entre distintos dominios pero dentro del dominio local y el universal pueden acceder de distintos dominios a distintos dominios, el primero no permite anidar, el segundo permite anidar pero solamente entre grupos globales o del dominio local pero el tercero si permite anidar cualquier tipo de grupo dentro de ellos, a la hora de definir en general los mas utilizados son los locales y los globales, los ultimos son para cuando nuestro dominio esta compuesto por mas de un bosque o tenemos un gran bosque que a su vez tienen sus propios bosques pero ahondar en este tema sera desperdiciar mucho tiempo, la ultima constante de este bloque es solamente para definir si el grupo es de seguridad, mas adelante veremos este tema, y la constante que quedo afuera del bloque es para el titulo de los mensajes, despues tendremos un bloque de ingreso de valores, el primero sera el nombre del grupo, despues crearemos un texto para mostrar las distintas opciones, en este caso para elegir el tipo de rango que hablamos antes (Local, Global y Universal), despues vendra el inputbox donde guardaremos el valor informado, nuestro siguiente texto para definir el tipo de grupo, en este caso tenemos dos tipos: Seguridad y Distribucion, el primero es utilizado para definir grupos que pueden definir permisos sobre el grupo de usuarios del mismo, en cambio Distribucion es para generar listas de distribucion y otros servicios pero no pueden pasar permisos, en general utilizaremos mas el primero para acceder a recursos o similares y el segundo sera para listas de distribucion de correo, por ejemplo Exchange, y despues guardaremos el valor en la variable tipo, nuestro siguiente bloque sera este:

Set objOU = GetObject("LDAP://cn=users,dc=laboratorio,dc=local")
Set objGroup = objOU.Create("Group", "cn=" & nombre)
objGroup.Put "sAMAccountName", replace(nombre,chr(32),"_",1,100)
Anuncios

Primero crearemos un objeto donde le asignaremos el OU (Unidad Organizacional por sus siglas en ingles) donde almacenaremos el grupo (cn=Users) y el dominio, luego crearemos otro objeto donde usaremos el objeto anterior y por medio de Create le diremos que es un grupo y le pasaremos el nombre que informamos, despues tomaremos este ultimo objeto y le asignaremos a sAMAccountName el nombre anterior pero le diremos que reemplace todos los espacios por el guion bajo, desde el principio y hasta 100 veces para que no se escape ninguno, este ultimo campo es para mantener compatibilidad con equipos anteriores a Windows 2000, veamos el siguiente bloque:

select case rango

	case 3
		if tipo = 2 then
			objGroup.Put "groupType", ADS_GROUP_TYPE_UNIVERSAL_GROUP
		else
			objGroup.Put "groupType", ADS_GROUP_TYPE_UNIVERSAL_GROUP or _
			ADS_GROUP_TYPE_SECURITY_ENABLED
		end if 
		

	case 2
		if tipo = 2 then
			objGroup.Put "groupType", ADS_GROUP_TYPE_GLOBAL_GROUP
		else
			objGroup.Put "groupType", ADS_GROUP_TYPE_GLOBAL_GROUP or _
			ADS_GROUP_TYPE_SECURITY_ENABLED
		end if 

	case else
		if tipo = 2 then
			objGroup.Put "groupType", ADS_GROUP_TYPE_LOCAL_GROUP		
		else
			objGroup.Put "groupType", ADS_GROUP_TYPE_LOCAL_GROUP or _
			ADS_GROUP_TYPE_SECURITY_ENABLED
		end if 
		

end select
Anuncios

Este bloque se encargara de tomar los datos de rango y tipo para asignarlos al grupo, el primer caso sera el 3 donde asignara el rango Universal verifica si tipo es igual 2 y en caso de ser cierto solamente pasara el rango y automaticamente sera de distribucion si no es verdad no solamente agregara el rango Universal sino ademas le pasara el dato de Seguridad que hara a este grupo como Seguridad, el case 2 es similar solamente que trabaja para los grupos globales, y el ultimo caso sera para el Dominio Local y tambien esta hecho de esta forma para que en cualquiera de los casos si omitimos todos los datos creara el grupo como Dominio Local y de Seguridad que son los mas utilizados, despues setearemos todos los datos anteriores en el grupo y por ultimo mostraremos un mensaje para notificar que se termino el script, veamos el siguiente video de ejemplo

En el video podemos ver como se crean varios grupos por medio del script y despues verificamos cada uno de los grupos para ver que se hayan creado correctamente como lo solicitamos, con esto cubrimos la creacion de grupos pero ahora pasaremos a ver como agregar usuarios en el mismo.

Anuncios

Agregando usuarios al grupo

Para nuestro siguiente caso veremos como agregar usuarios dentro de un grupo, veamos el siguiente codigo:

agregaruser.vbs

Const ADS_PROPERTY_APPEND = 3 
Const titulo = "Agregar usuarios a grupo v. 1.0"
Const uDominio = "dc=laboratorio, dc=local"

do while a < 12

grupo = inputbox("Ingresa el nombre del grupo o q para salir", titulo)

if lcase(grupo) = "q" then exit do

Set objGroup = GetObject("LDAP://cn=" & chr(34) & grupo & chr(34) &  ",cn=Users," _
 		& uDominio) 

cuenta = inputbox("Ingresa la cuenta a agregar", titulo)

chequeo = FindUser(cuenta, uDominio)

if (chequeo <> "Not Found") then 
	objGroup.PutEx ADS_PROPERTY_APPEND, "member", Array(chequeo)
	objGroup.SetInfo
else
	msgbox "El usuario no fue encontrado",64,titulo
end if

loop

msgbox "Colorin, Colorado" & vbCrLF & "Este script ha acabado"q

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

Primero analicemos este bloque:

Const ADS_PROPERTY_APPEND = 3 
Const titulo = "Agregar usuarios a grupo v. 1.0"
Const uDominio = "dc=laboratorio, dc=local"
Anuncios

Aca definiremos tres constantes, la primera sera para agregar una propiedad dentro de un objeto del AD, como hablamos en este post las constantes se usan para saber de una mejor foma que hace ese valor ya que en lugar de usar el valor 3 usamos la constante, despues tendremos el titulo para nuestros mensajes y por ultimo el dominio que usaremos para el AD, luego haremos un bucle infinito con el do..loop, porque nunca incrementamos a la variable a, para nuestro siguiente paso analizaremos a este bloque:

grupo = inputbox("Ingresa el nombre del grupo o q para salir", titulo)

if lcase(grupo) = "q" then exit do

Set objGroup = GetObject("LDAP://cn=" & chr(34) & grupo & chr(34) &  ",cn=Users," _
 		& uDominio) 

cuenta = inputbox("Ingresa la cuenta a agregar", titulo)

chequeo = FindUser(cuenta, uDominio)

if (chequeo <> "Not Found") then 
	objGroup.PutEx ADS_PROPERTY_APPEND, "member", Array(chequeo)
	objGroup.SetInfo
else
	msgbox "El usuario no fue encontrado",64,titulo
end if
Anuncios

Primero le pediremos que ingresen el nombre del grupo que desean modificar o que ingresen la letra q para salir, nuestro siguiente linea es un condicional donde verifica si se recibio a q y en caso de ser cierto sale del bucle, para nuestra siguiente linea crearemos un objeto donde le enviaremos el valor de grupo entre comillas por medio de chr(34) (esto por si el nombre tiene espacios en blanco), luego pasaremos la ubicacion y el dominio por medio de la constante que definimos al principio, despues pediremos que ingrese la cuenta que debemos agregar pero como no podemos agregar estos usuarios por cuenta debemos encontrar el nombre canonico y para eso debemos usar a FindUser, el cual lo guardaremos en chequeo, esta funcion no es muy distinta a la que vimos en este post pero la diferencia es que solamente buscara por la cuenta, una vez obtenido chequeara si existe o no, en caso de encontrarlo, se movera a la primer coincidencia, luego usara Replace para reemplazar a «GC://» por nada y esto nos dara como resultado, el cn, la ubicacion y el dominio, lo cual almacenara en vUsuario y lo enviara como salida de FindUSer, en caso de no haberlo encontrado devolvera «Not Found», con esto terminamos con FindUser, continuemos con el bloque anterior, ahora tendremos un condicional donde verifica si es distinta de «Not Found» en caso de ser cierto, pondremos al miembro que tenemos en chequeo pero para este caso usaremos a PutEx (nos permite guardar varios valores al mismo tiempo) y mediante la constante le diremos que lo agregue, por ultimo debemos usar Array para enviar el valor de una forma correcta para nuestro metodo y por ultimo aplicaremos los cambios, de lo contrario si devolvio «Not Found» nos notificara en pantalla que el usuario no existe y volveremos al principio, si salimos del bucle tendremos un mensaje que nos avisa del mismo, probemos el codigo mediante el siguiente video

Con esto ya tenemos dos scripts para crear un grupo en distintos formatos y otro para agregar usuarios dentro de grupos, para nuestro siguiente punto veremos como quitar usuarios de un grupo.

Anuncios

Quitando usuarios de un grupo

Para esta seccion utilizaremos el siguiente codigo:

quitaruser.vbs

Const ADS_PROPERTY_DELETE = 4 
Const titulo = "Quitar usuarios a un grupo v. 1.0"
Const uDominio = "dc=laboratorio, dc=local"

do while a < 12

grupo = inputbox("Ingresa el nombre del grupo o q para salir", titulo)

if lcase(grupo) = "q" then exit do

Set objGroup = GetObject("LDAP://cn=" & chr(34) & grupo & chr(34) &  ",cn=Users," _
 		& uDominio) 

cuenta = inputbox("Ingresa la cuenta a quitar", titulo)

chequeo = FindUser(cuenta, uDominio)

if (chequeo <> "Not Found") then 
	objGroup.PutEx ADS_PROPERTY_DELETE, "member", Array(chequeo)
	objGroup.SetInfo
else
	msgbox "El usuario no fue encontrado",64,titulo
end if

loop

msgbox "Colorin, Colorado" & vbCrLF & "Este script ha acabado"

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

Este codigo es similar al anterior, en su conducta pero tiene pequeñas modificaciones para poder eliminar usuarios en lugar de agregar, la primera modificacion es la constante para borrar en lugar de agregar, nuestra siguiente modificacion es:

objGroup.PutEx ADS_PROPERTY_DELETE, "member", Array(chequeo)
objGroup.SetInfo
Anuncios

Donde trabaja de igual forma pero cambiamos la constante para que elimine en lugar de agregar despues el resto del codigo trabaja exactamente de la misma forma que el anterior, tanto en procesos como en conducta, veamos como trabaja en el siguiente video

Como ultimo dato podemos usar la siguiente linea para eliminar todos los miembros de un grupo en lugar de hacerlo uno por uno:

objGroup.PutEx ADS_PROPERTY_CLEAR, "member", 0 

la constante es igual a 1

Con pocas modificaciones podemos lograr tener una opcion de borrado masivo, por ultimo nos falta el codigo para eliminar un grupo.

Anuncios

Eliminando un grupo del AD

Para eliminar un grupo del AD vamos a utilizar un codigo sencillo pero no por eso poderoso, veamos el codigo:

quitargrupo.vbs

Const titulo = "Eliminar grupo de AD v. 1.0"

nombre = inputbox("Ingresa el nombre del grupo",titulo)

Set objOU = GetObject("LDAP://cn=Users, dc=laboratorio,dc=local")
objOU.Delete "group", "cn=" & nombre

msgbox "Listo el pollo" & vbCrLf & "Pelada la gallina"
Anuncios

En este caso primero ingresaremos el nombre del grupo a eliminar, nuestro siguiente paso sera crear un objeto donde va a estar la ubicacion de nuestro grupo, nuestro siguiente paso sera tomar dicho objeto y por medio de Delete le decimos que es un grupo y luego le paso el nombre canonico almacenado en nombre, por ultimo mostraremos un mensaje para informar que termino el script, veamos como trabaja con el siguiente video

Anuncios

Con esto completamos el ABM de los grupos de Active Directory, ya que vimos como crear, agregar y/o quitar miembros del grupo y como eliminar un grupo, si bien estos scripts son solo una base para poder trabajar ya que estan destinados a un lugar especifico en otro momento hablaremos sobre trabajar con otras ubicaciones.

Anuncios

En resumen, hoy hemos visto como crear un grupo, hemos visto como crearlos con sus propias caracteristicas, como agregar usuarios dichos grupos, como quitar usuarios de los grupos, y finalmente como eliminar grupos todo en nuestro 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.50

Anuncio publicitario