Bienvenidos sean a este post, hoy continuaremos con el post anterior y agregaremos una serie de mejoras a nuestro script para la creacion de usuarios.
Entre las nuevas caracteristicas van a ser una mejor forma de notificar los datos a compartir, una forma de chequear si existe o no el usuario y por ultimo una relacionada a la contraseña. La primera modificacion que haremos sera sobre como chequear si el usuario que creamos existe o no en el AD, para ello agregaremos el siguiente bloque al final del script del post anterior:
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
Esta funcion es la que se encargara de buscar un usuario en nuestro Active Directory para saber si la persona que estamos ingresando existe o no, esto es especialmente util para evitar que hagamos una carga y nos devuelva un error y realizar un trabajo infructuoso, comencemos a hablar sobre el codigo.
La funcion recibira tres datos, el primero sera la cuenta que le asignamos, el segundo sera el uDisplay que generamos con el nombre y apellido y por ultimo la constante con el dominio para el AD, nuestro siguiente paso sera crear tres objetos:
- cn, sera el objeto encargado de crear la conexion
- cmd, sera el objeto que usaremos para ejecutar la busqueda
- rs, sera el objeto encargado de guardar los resultados obtenidos
Una vez creado nuestro primer objeto (cn) el siguiente paso sera usar a open para conectarse al AD por medio de Provider=ADsDSOObject, luego usaremos el segundo objeto donde le diremos cual es la conexion activa por medio activeconnection y le pasaremos el objeto cn para saber cual es el que debe usarse, nuestro siguiente paso sera asignar el query de busqueda en el AD por medio de command al segundo objeto (cmd), el query buscara la ubicacion en el dominio del objeto que pasamos, en este caso sera la cuenta, nuestro siguiente paso sera ejecutar el query anterior por medio de execute y lo asignaremos al tercer objeto (rs).
Procedemos a ejecutarlo y por medio de un condicional verifica si err es distinto de 0 con lo cual en caso de ser verdadero nos devolvera un mensaje de error como que no pudo conectarse a la base del AD con una descripcion del mismo, de lo contrario verifica si rs no esta al principio y no esta al final del resultado, en caso de ser cierto devolveremos el valor de la cuenta (UserName), en caso contrario volveremos a hacer otra busqueda pero esta vez en lugar de usar la cuenta usamos el cn (Canonical Name), lo volvemos a ejecutar con execute y en caso de ser cierto como en el caso anterior devolveremos el valor de CanonName de lo contrario devuelve el valor Not Found, procede a cerrar los condicionales y por ultimo cierra la conexion creada (cn), pasemos a la siguiente modificacion en nuestro codigo pero para ello veremos el codigo anterior con las modificacion y comentaremos las mismas:
Const Dominio = "dc=laboratorio,dc=local"
Const udominio = "laboratorio.local"
Const titulo = "Alta de usuario v. 1.0"
cuenta = inputbox("Ingresa la cuenta",titulo)
nombre = inputbox("Ingresa el nombre",titulo)
apellido = inputbox("Ingresa lel apellido",titulo)
uDisplay = apellido & ", " & nombre
chequeo = FindUser(cuenta,uDisplay,ucase(Dominio))
if (chequeo="Not Found") then
empresa = inputbox("Ingresa la empresa",titulo)
descrip = inputbox("Ingresa la descripcion",titulo)
pais = inputbox("Ingresa el pais",titulo)
departamento = inputbox("Ingresa el departamento",titulo)
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) + 90
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 "userAccountControl", 544
oNuevoUsuario.SetInfo
msgbox "Se creo el usuario y la pass es: " & uPassword
else
msgbox "Se encontro el siguiente objeto: " & chequeo,,titulo
end if
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
Nuestra primera modificacion va a ser este bloque:
cuenta = inputbox("Ingresa la cuenta",titulo)
nombre = inputbox("Ingresa el nombre",titulo)
apellido = inputbox("Ingresa lel apellido",titulo)
uDisplay = apellido & ", " & nombre
chequeo = FindUser(cuenta,uDisplay,ucase(Dominio))
if (chequeo="Not Found") then
En este caso la modificacion mas evidente fue que subimos el uDisplay para que lo cree despues de ingresado la cuenta, el nombre y el apellido, con el dato de la cuenta y el nombre almacenado en uDisplay lo pasamos a FindUser como explicamos antes y el resultado lo vamos a almacenar en chequeo, lo siguiente es un condicional donde verifica si chequeo es igual a Not Found, en caso de ser cierto continuara con la recoleccion de datos y procedera a crear el usuario tal como lo hicimos en el post anterior, veamos la siguiente modificacion que realizamos:
msgbox "Se creo el usuario y la pass es: " & uPassword
else
msgbox "Se encontro el siguiente objeto: " & chequeo,,titulo
end if
En este caso despues de la notificacion de creacion del usuario pusimos un else, recuerden que anteriormente usamos un condicional, porque chequeo es distinto de Not Found y por ende nos mostrara un mensaje de cual fue encontrado si la cuenta o el nombre completo, tambien se considera un objeto unico y no puede estar repetido, con esto nos evitaremos trabajo innecesario.
Para nuestra siguiente modificacion cambiaremos la forma de mostrar el resultado de nuestra creacion porque si bien podemos ver en pantalla la password, tambien podemos crear un archivo de texto con los datos del usuario que podemos copiar y pegar en un correo para enviarselo al jefe de dicha persona, un ejemplo practico, para ello deberemos hacer algunas modificaciones, primero deberemos agregar los objetos necesarios al comienzo del script:
Dim objFSOut, objStreamout, fileout,textolog
Con esto definimos los objetos que usaremos, esto se define al comienzo despues de las constantes y antes de comenzar con el bloque de ingreso de datos, para nuestra siguiente modificacion reemplazaremos la linea que nos notificaba la password y creacion del usuario:
msgbox "Se creo el usuario y la pass es: " & uPassword
Por el siguiente bloque:
fileout = cuenta & ".log"
textolog = "Se creo la cuenta: " & cuenta & vbCrLf
textolog = textolog & "El nombre completo: " & uDisplay & vbCrLf
textolog = textolog & "La contraseña es: " & uPassword
Set objFSOut = CreateObject("Scripting.FileSystemObject")
Set objStreamout = objFSOut.CreateTextFile(fileout, 1, false)
objStreamout.Write textolog
objStreamout.close()
Set objStreamout = nothing
Set objFSOut = nothing
msgbox "Se creo el usuario correctamente"
En este caso primero crearemos el nombre del archivo, para ello usaremos la cuenta que generamos y le concatenaremos la palabra log, despues usaremos a textolog para generar nuestro texto en el archivo, para ello primero usaremos una linea para informar la cuenta, despues pasaremos el nombre que en este caso sera el que aparecera en el AD, y por ultimo una linea que mostrara la contraseña que se le asigno, nuestro siguiente paso sera crear el objeto que se encargara de darnos la posibilidad de crear archivos, ya hablamos de esto en este post, luego crearemos el archivo con el nombre que definimos anteriormente, una vez creado el archivo le escribiremos el texto por medio de Write para despues proceder a cerrar el archivo y setear los objetos a nada (nothing) para liberar memoria, por ultimo modificamos el mensaje de notificacion para en lugar de mostrar la contraseña nos notifica que se genero el usuario, dando por finalizado nuestro script, y para nuestra ultima modificacion del script sera el seteo de que el usuario deba cambiar la contraseña al iniciar sesion por primera vez, para ello debemos agregar la siguiente linea en el bloque de password:
oNuevoUsuario.Put "pwdLastSet", 0
Es simplemente agregar esto despues de que seteamos la password, con todo esto ya tenemos todo lo necesario para crear nuestro primer usuario, tener un medio para notificarlo y como obligar al mismo al ingreso de su pc a cambiar la contraseña, antes de pasar a ver un video veamos el codigo final:
Const ADS_PROPERTY_APPEND = 3
Const ADS_PORPERTY_UPDATE = 2
Const Dominio = "dc=laboratorio,dc=local"
Const udominio = "laboratorio.local"
Const titulo = "Alta de usuario v. 1.0"
Dim objFSOut, objStreamout, fileout,textolog
cuenta = inputbox("Ingresa la cuenta",titulo)
nombre = inputbox("Ingresa el nombre",titulo)
apellido = inputbox("Ingresa el apellido",titulo)
uDisplay = apellido & ", " & nombre
chequeo = FindUser(cuenta,uDisplay,ucase(Dominio))
if (chequeo="Not Found") then
empresa = inputbox("Ingresa la empresa",titulo)
descrip = inputbox("Ingresa la descripcion",titulo)
pais = inputbox("Ingresa el pais",titulo)
departamento = inputbox("Ingresa el departamento",titulo)
ou = inputbox("Ingresa la ubicacion del objeto (ou)",titulo)
if (ou="") then ou="cn=Users"
Set oRootLDAP = GetObject("LDAP://rootDSE")
Set oContenedor = GetObject("LDAP://" & ou & "," & 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
'msgbox uPassword
oNuevoUsuario.SetPassword uPassword
oNuevoUsuario.Put "pwdLastSet", 0
oNuevoUsuario.put "userAccountControl", 544
oNuevoUsuario.SetInfo
fileout = cuenta & ".log"
textolog = "Se creo la cuenta: " & cuenta & vbCrLf
textolog = textolog & "El nombre completo: " & uDisplay & vbCrLf
textolog = textolog & "La contraseña es: " & uPassword
Set objFSOut = CreateObject("Scripting.FileSystemObject")
Set objStreamout = objFSOut.CreateTextFile(fileout, 1, false)
objStreamout.Write textolog
objStreamout.close()
Set objStreamout = nothing
Set objFSOut = nothing
msgbox "Se creo el usuario correctamente"
else
msgbox "Se encontro el siguiente objeto: " & chequeo,,titulo
end if
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
Ahora si veamos el siguiente video de como funciona nuestro script en el servidor del AD
En este caso podemos ver como ejecutamos el script, nos pide dato por datos, cuando terminamos de cargar los mismos procede a crearlo donde vemos como genero el archivo y nos notifica la creacion del mismo, despues refrescamos el AD y vemos como el usuario se creo correctamente, con toda la informacion que le enviamos, con la opcion de cambiar la contraseña cuando inicie sesion por primera vez y a su vez activa, por ultimo abrimos el archivo donde vemos que nos almaceno la informacion basica para enviar al usuario, tanto via telefonica, como por mail o un mensaje de texto, vamos a ver el siguiente video
En este caso vemos la notificacion de error en caso de que el usuario ya existe tanto por cuenta como por nombre, pasemos al ultimo video donde veremos como ingresa el usuario a su equipo con su nueva cuenta
En este video primero ingresaremos con los datos generados para nuestro usuario, nos pedira que cambiemos la misma y debemos hacerlo por una que coincida con las politicas del dominio, una vez cambiada correctamente ingresara al equipo y esta contraseña nueva quedara como definitiva, en el video vemos como al cerrar sesion y volver a ingresar lo hicimos con la nueva contraseña y no nos volvio a pedir el cambio de la misma, con esto completamos nuestro primer script 100% operativo y practico para usar en cualquier dominio, salvando que deben hacer las modificaciones necesarias para el que se deba usar.
Nota: En todos los casos que vimos hasta aca las politicas son las predeterminadas del Controlador de Dominio, si desean modificarlas pueden usar el editor de politicas y tambien pueden hacerlo para adaptarlas a las de la empresa que trabajen.
En resumen, hoy hemos modificado el script de creacion de usuarios, hemos hecho una funcion que busca los objetos que identifican al usuario para notificarnos si existen y abortar el programa o de lo contrario continuar, hemos visto como crear un archivo de log para almacenar la informacion basica del usuario generado para enviar via notificacion ya sea por email, telefono o sms, hemos agregado la opcion para obligar al usuario a modificar su contraseña al primer logueo, como lo carga, como trabaja las notificaciones de existencia y como es el primer ingreso de un usuario, 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