Script VBScript Para Borrar O Deshabilitar Usuarios De Active Directory
Buscando la manera de automatizar mi servidor de dominio, empece a buscar un script que me ayudara a hacer mas corta la tarea de Borrar o Deshabilitar usuarios en el Active directory, me he encontrado con la pagina del amigo Fernando Reyes el cual tiene una gran coleccion de utiles scripts:
Este script permite eliminar del directorio activo una o más cuentas de usuario. Debe ser lanzado por un usuario con los privilegios suficientes para borrar las cuentas. Su uso es indicado, por ejemplo, cuando se desea borrar de forma masiva cuentas de usuario. Está basado en este script anteriormente publicado.
Sintaxis
{wscript | cscript [//nologo]} borrar-usuarios.vbs [/L:lista_de_usuarios] [/F:fichero_con_usuarios] [/OU:unidad_organizativa] [/E:usuarios_excluidos] [/FE:fichero_excluidos] [/R] [/DE] [/T:fichero] [/D:dominio] [/?]
Siendo
| Etiqueta | Dato | ¿Requerido? | Descripción |
| L | lista_de_usuarios | No |
Lista de usuarios a los que se borrará del directorio. Se trata de sus nombres NT. Este parámetro forma un combo junto con el parámetro /F y el /OU, prevaleciendo sobre el /OU, mientras que el /F prevalece sobre él..
|
| F | fichero_con_usuarios | No |
Fichero con los nombres de los usuarios a los que se borrará del directorio, un nombre de usuario por lÃnea. Se trata, al igual que en caso del argumento L, de los nombres NT. Este parámetro forma un combo junto con el parámetro L y el OU, prevaleciendo sobre ambos.
|
| OU | unidad_organizativa | No |
Nombre LDAP de la unidad organizativa a la que se borrarán los usuarios. Este parámetro forma un combo junto con el parámetro L y el OU, prevaleciendo ambos sobre él.
|
| E | usuarios_excluidos | No |
Lista de usuarios excluÃdos de la eliminación. Solo se procesará este argumento cuando se ha pasado el argumento /OU, siendo ignorado si no está presente. Se trata de sus nombres NT. Si se pasan los argumentos /E y /FE a la vez, sólo se tiene encuenta el argumento /FE.
|
| FE | fichero_excluidos | No |
Ruta y nombre de un fichero con los nombres NT de los usuarios que se deben excluir del borrado, uno por lÃnea. Si se pasan los argumentos /E y /FE a la vez, sólo se tiene encuenta el argumento /FE.
|
| R | borrado_recursivo | No |
Si se pasa este argumento, el borrado se realizará de forma recursiva (en todo el subarbol). Al igual que el argumento /E, sólo se tiene en cuenta si se está procesando el argumento /OU.
|
| T | fichero | No |
Fichero de texto, de valores separados por tabulador (ideal para ser abierto con Excel), con los resultados obtenidos en la ejecución del script. Si se omite este argumento, la información se mostrará por pantalla.
|
| D | dominio | No |
Nombre DNS (dominio.com) del dominio al que pertenece el usuario. Si no se pasa este parámetro, se obtiene a partir del dominio al que pertenezca el equipo desde el que se lanza el script. No obstante, si el nombre del usuario es completo (dominiousuario) se eliminará el del dominio indicado por el nombre del usuario, aunque se trate de otro diferente al del equipo desde el que se lanza el script.
|
| DE | No |
Si se pasa este modificador, la cuenta será deshabilitada, no borrada.
|
|
| ? | No |
Muestra la ayuda en lÃnea.
|
Ejemplos:
- Borra los usuarios mortadelo,bacterio,ofelia:
cscript //nologo borrar-usuarios.vbs /L:mortadelo,bacterio,ofelia
- Borra los usuarios listados en el fichero c:tiausuariosborrar-petardos.lst:
cscript //nologo borrar-usuarios.vbs /F:c:tiausuariosborrar-petardos.lst
- Borra los usuarios de la unidad organizativa ou=superintendencia,dc=tia,dc=org:
cscript //nologo borrar-usuarios.vbs /OU:ou=superintendencia,dc=tia,dc=org
- Borra los usuarios del subárbol con raÃz en la unidad organizativa ou=superintendencia,dc=tia,dc=org , excepto los usuarios filemon,bestiajez,vicente:
cscript //nologo borrar-usuarios.vbs /OU:ou=superintendencia,dc=tia,dc=org /E:filemon,bestiajez,vicente /R
- Borra los usuarios de la unidad organizativa ou=superintendencia,dc=tia,dc=org, y todas las subsiguientes, excepto los usuarios listados en el fichero c:tiausuariosno-borrar.lst:
cscript //nologo borrar-usuarios.vbs /OU:ou=superintendencia,dc=tia,dc=org /FE:c:tiausuariosno-borrar.lst /R
- Deshabilita los usuarios mortadelo,bacterio,ofelia y almacena los resultados en el fichero c:tialistadosborrar-petardos.tsv:
cscript //nologo borrar-usuarios.vbs /L:mortadelo,bacterio,ofelia /T:c:tialistadosborrar-petardos.tsv /DE
Este es el código del script
'*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
'*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°*
'* borrar-usuarios.vbs *
'* *
'* Este script permite eliminar del directorio activo una o más *
'* cuentas de usuario. debe ser lanzado por un usuario con los *
'* privilegios suficientes para borrar las cuentas. Su uso es *
'* indicado, por ejemplo, cuando se desea borrar de forma masiva *
'* cuentas de usuario. *
'* *
'* Sintaxis *
'* *
'* {wscript | cscript [//nologo]} borrar-usuarios.vbs *
'* [/L:lista_de_usuarios] [/F:fichero_con_usuarios] *
'* [/OU:unidad_organizativa] [/E:usuarios_excluidos] *
'* [/FE:fichero_excluidos] [/R] [/DE] [/T:fichero] [/D:dominio] [/?] *
'* *
'* Siendo *
'* *
'* - /L: lista_de_usuarios (Opcional): *
'* Lista de usuarios a los que se borrará del directorio. Se *
'* trata de sus nombres NT. Este parámetro forma un combo *
'* junto con el parámetro /F y el /OU, prevaleciendo sobre el *
'* /OU, mientras que el /F prevalece sobre él. *
'* *
'* - /F: fichero_con_usuarios (Opcional): *
'* Fichero con los nombres de los usuarios a los que se *
'* borrará del directorio, un nombre de usuario por lÃnea. Se *
'* trata, al igual que en caso del argumento L, de los nombres *
'* NT. Este parámetro forma un combo junto con el parámetro L *
'* y el OU, prevaleciendo sobre ambos. *
'* *
'* - /OU: unidad_organizativa (Opcional): *
'* Nombre LDAP de la unidad organizativa a la que se borrarán *
'* los usuarios. Este parámetro forma un combo junto con el *
'* parámetro L y el OU, prevaleciendo ambos sobre él. *
'* *
'* - /E: usuarios_excluidos (Opcional): *
'* Lista de usuarios excluÃdos de la eliminación. Solo se *
'* procesará este argumento cuando se ha pasado el argumento *
'* /OU, siendo ignorado si no está presente. Se trata de sus *
'* nombres NT. Si se pasan los argumentos /E y /FE a la vez, *
'* sólo se tiene encuenta el argumento /FE. *
'* *
'* - /FE: fichero_excluidos (Opcional): *
'* Ruta y nombre de un fichero con los nombres NT de los *
'* usuarios que se deben excluir del borrado, uno por lÃnea. *
'* Si se pasan los argumentos /E y /FE a la vez, sólo se tiene *
'* encuenta el argumento /FE. *
'* *
'* - /R: borrado_recursivo (Opcional): *
'* Si se pasa este argumento, el borrado se realizará de forma *
'* recursiva (en todo el subarbol). Al igual que el argumento *
'* /E, sólo se tiene en cuenta si se está procesando el *
'* argumento /OU. *
'* *
'* - /T: fichero (Opcional): *
'* Fichero de texto, de valores separados por tabulador (ideal *
'* para ser abierto con Excel), con los resultados obtenidos *
'* en la ejecución del script. Si se omite este argumento, la *
'* información se mostrará por pantalla. *
'* *
'* - /D: dominio (Opcional): *
'* Nombre DNS (dominio.com) del dominio al que pertenece el *
'* usuario. Si no se pasa este parámetro, se obtiene a partir *
'* del dominio al que pertenezca el equipo desde el que se *
'* lanza el script. No obstante, si el nombre del usuario es *
'* completo (dominio\usuario) se eliminará el del dominio *
'* indicado por el nombre del usuario, aunque se trate de otro *
'* diferente al del equipo desde el que se lanza el script. *
'* *
'* - /DE: deshabilitar (Opcional) *
'* Si se pasa este modificador, los usuarios serán *
'* deshabilitados, en lugar de borrados *
'*
'* Ejemplos: *
'* *
'* - Borra los usuario mortadelo,bacterio,ofelia: *
'* *
'* cscript //nologo borrar-usuarios.vbs /L:mortadelo,bacterio,ofelia *
'* *
'* - Borra los usuario listados en el fichero *
'* c:\tia\usuarios\borrar-petardos.lst: *
'* *
'* cscript //nologo borrar-usuarios.vbs *
'* /F:c:\tia\usuarios\borrar-petardos.lst *
'* *
'* - Borra los usuarios de la unidad organizativa *
'* ou=superintendencia,dc=tia,dc=org: *
'* *
'* cscript //nologo borrar-usuarios.vbs *
'* /OU:ou=superintendencia,dc=tia,dc=org *
'* *
'* - Borra los usuarios del subárbol con raÃz en la unidad *
'* organizativa ou=superintendencia,dc=tia,dc=org , excepto los *
'* usuarios filemon,bestiajez,vicente: *
'* *
'* cscript //nologo borrar-usuarios.vbs *
'* /OU:ou=superintendencia,dc=tia,dc=org /E:filemon,bestiajez,vicente *
'* /R *
'* *
'* - Borra los usuarios de la unidad organizativa *
'* ou=superintendencia,dc=tia,dc=org, y todas las subsiguientes, *
'* excepto los usuarios listados en el fichero *
'* c:\tia\usuarios\no-borrar.lst: *
'* *
'* cscript //nologo borrar-usuarios.vbs *
'* /OU:ou=superintendencia,dc=tia,dc=org *
'* /FE:c:\tia\usuarios\no-borrar.lst /R *
'* *
'* - Deshabilita los usuarios mortadelo,bacterio,ofelia y almacena los *
'* resultados en el fichero c:\tia\listados\borrar-petardos.tsv: *
'* *
'* cscript //nologo borrar-usuarios.vbs /L:mortadelo,bacterio,ofelia *
'* /T:c:\tia\listados\borrar-petardos.tsv /DE *
'* *
'* *
'* *
'* *
'* © Fernando Reyes *
'* Julio De 2007 *
'*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°*
'*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
'Exigimos la declaración de variables
Option Explicit
Const ADS_UF_ACCOUNTDISABLE = 2
Dim str_Error 'As String
Dim int_Error 'As String
Dim str_NuevaClave 'As String
Dim arr_Usuarios 'As String
Dim arr_Excluidos 'As String
Dim bol_Recursivo 'As Boolean
Dim str_TXT 'As String
Dim str_TXTO 'As String
Dim str_Dominio 'As String
Dim str_Mensaje 'As String
Dim int_Usuario 'As Integer
Dim bol_Deshabilitar 'As Boolean
'Iniciamos el indicador de borrado recursivo
bol_Recursivo = False
'Validando los argumentos y almacenando
'sus valores
If f_RevisarArgumentos( _
str_Error, _
int_Error) Then
Call s_Ayuda(str_Error)
WScript.Quit int_Error
End If
'Creamos los encabezados de columna en la salida
str_Mensaje = "Usuario" & vbTab & _
"Acción" & vbTab & _
"Error" & vbTab & _
"Nº Error" & vbTab & _
"Resultado" & vbCrLf
'Recorremos el array de usuarios a borrar
For int_Usuario = LBound(arr_Usuarios) To UBound(arr_Usuarios)
'Si es un elemento vacÃo no lo procesamos
If Not Trim(arr_Usuarios(int_Usuario) = "") Then
'Llamamos a la función que borra el usuario; si
'la devolución es verdadera, se ha borrado con éxito,
'si es falsa es que hubo problemas y no se borró
If Not f_BorrarUsuario(arr_Usuarios(int_Usuario), _
str_Dominio) Then
'El objeto no ha sido borrado, ponemos el fracaso
'en el mensaje
str_Mensaje = str_Mensaje & vbTab & _
"No se pudo "
If bol_Deshabilitar Then
str_Mensaje = str_Mensaje & "deshabilitar"
Else
str_Mensaje = str_Mensaje & "borrar"
End If
Else
'El objeto ha sido borrado, ponemos el éxito
'en el mensaje
str_Mensaje = str_Mensaje & vbTab & _
"Fue "
If bol_Deshabilitar Then
str_Mensaje = str_Mensaje & "deshabilitado con éxito"
Else
str_Mensaje = str_Mensaje & "borrado con éxito"
End If
End If
'Añadimos el resultado en la variable de salida a
'fichero
str_TXTO = str_TXTO & str_Mensaje & vbCrLf
'Mostramos el resultado
WScript.Echo str_Mensaje
'Vaciamos el mensaje para el próximo usuario
str_Mensaje = ""
End If
Next 'int_Usuario
'Si los resultados deben ser volcados a un fichero...
If Len(str_TXT) > 0 Then
Dim obj_FS 'As Scripting.FileSystemObject
Dim obj_TS 'As Scripting.TextStream
'Creamos un objeto FileSystemObject
Set obj_FS = CreateObject( _
"Scripting.FileSystemObject")
'Creamos el fichero de ruta y nombre las recibidas
'como parámetro /T
Set obj_TS = obj_FS.CreateTextFile( _
str_TXT)
'Volcamos los resultados en el fichero
obj_TS.Write str_TXTO
'Cerramos el fichero
obj_TS.close
'Limpieza de la parte posterior saliente
Set obj_TS = Nothing
Set obj_FS = Nothing
'Else
'Como no se
' WScript.Echo str_Mensaje
End If
Function f_BorrarUsuario(str_Usuario, str_Dominio) 'As Boolean
'***********************************************************************
'* Procedimiento: f_BorrarUsuario *
'* Tipo : Función *
'* Devolución : Booleana *
'* Fecha y Hora : 25/07/2007 18:29:44 *
'* Autor : Fernando Reyes *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito : Esta función recibe un nombre de usuario y su *
'* dominio y borra el usuario recibido. En caso de *
'* producirse algún error, devuelve False, si todo va *
'* bien devuelve True. *
'***********************************************************************
Dim obj_Usuario,obj_OU,str_OU,str_CN,int_Posicion, str_UsuarioLDAP
Dim int_UAC
'Vamos a comprobar si se ha pasado nombre de dominio con el nombre
'de usuario
int_Posicion = InStr(1,str_Usuario,"\")
'Si se ha encontrado el back slash, significa que venÃa el nombre
'de dominio
If int_Posicion > 0 Then
'Obtenemos su nombre distinguido
str_UsuarioLDAP = f_NTaDN(str_Usuario,"")
str_Mensaje = str_Mensaje & str_Usuario
Else
'Montamos el nombre de dominio con el usuario y obtenemos el
'nombre distinguido
str_UsuarioLDAP = f_NTaDN(str_Dominio & "\" & str_Usuario,"")
str_Mensaje = str_Mensaje & str_Dominio & "\" & str_Usuario
End If
WScript.Echo str_usuario
WScript.Echo str_UsuarioLDAP
'Reflejamos la acción a realizar en el log
If bol_Deshabilitar Then
str_Mensaje = str_Mensaje & vbTab & _
"Deshabilitar"
Else
str_Mensaje = str_Mensaje & vbTab & _
"Borrar"
End if
WScript.Echo str_UsuarioLDAP
On Error Resume Next
'Obtenemos el objeto de usuario
Set obj_Usuario = GetObject("LDAP://" & str_UsuarioLDAP)
'Comprobamos si se ha producido error
If Err.Number <> 0 Then
'Obtenemos el error
str_Mensaje = str_Mensaje & vbTab & _
Err.Description & vbTab & _
Err.Number
'La función devolverá False
f_BorrarUsuario = False
'Vaciamos el objeto de error
Err.Clear
'Devolvemos el control de errores a CScript
On Error Goto 0
'Salimos de la función
Exit Function
End If
'Obtenemos el nombre distinguido del contenedor del objeto
str_OU = obj_Usuario.Parent
'Obtenemos el nombre del usuario
str_CN = obj_Usuario.Name
'Si se ha producido error
If Err.Number <> 0 Then
'Obtenemos el error
str_Mensaje = str_Mensaje & vbTab & _
Err.Description & vbTab & _
Err.Number
'La función devolverá False
f_BorrarUsuario = False
'Vaciamos el objeto de error
Err.Clear
'Devolvemos el control de errores a CScript
On Error Goto 0
'Salimos de la función
Exit Function
End If
'Obtenemos el objeto del contenedor
Set obj_OU = GetObject(str_OU)
'Si se ha producido error
If Err.Number <> 0 Then
'Obtenemos el error
str_Mensaje = str_Mensaje & vbTab & _
Err.Description & vbTab & _
Err.Number
'La función devolverá False
f_BorrarUsuario = False
'Vaciamos el objeto de error
Err.Clear
'Devolvemos el control de errores a CScript
On Error Goto 0
'Vaciamos el objeto usuario
Set obj_Usuario = Nothing
'Salimos de la función
Exit Function
End If
'Si hay que borrar
If Not bol_Deshabilitar Then
'Borramos el usuario
obj_OU.Delete "user", str_CN
'Si hay que deshabilitar
Else
'Obtenemos el control de cuenta del usuario
int_UAC = obj_Usuario.Get("userAccountControl")
'Deshabilitamos el usuario
obj_Usuario.Put "userAccountControl", _
int_UAC OR ADS_UF_ACCOUNTDISABLE
'Guardamos el cambio
obj_Usuario.SetInfo
End If
If Err.Number <> 0 Then
'Obtenemos el error
str_Mensaje = str_Mensaje & vbTab & _
Err.Description & vbTab & _
Err.Number
'La función devolverá False
f_BorrarUsuario = False
'Vaciamos el objeto de error
Err.Clear
'Devolvemos el control de errores a CScript
On Error Goto 0
'Vaciamos el objeto usuario
Set obj_Usuario = Nothing
'Vaciamos el objeto del contenedor
Set obj_OU = Nothing
'Salimos de la función
Exit Function
End If
'devolvemos el control de errores a CScript
On Error Goto 0
'Completamos el mensaje
str_Mensaje = str_Mensaje & vbTab & _
"No se produjo error" & _
vbTab & "0"
'La función devuelve True, pues no se ha producido el error
f_BorrarUsuario = True
End Function 'f_BorrarUsuario
Function f_RevisarArgumentos( _
str_Error, _
int_Error _
) 'As Boolean
'***********************************************************************
'* Procedimiento: f_RevisarArgumentos *
'* Tipo : Función *
'* Devolución : Booleana *
'* Fecha y Hora : 25/07/2007 17:09:38 *
'* Autor : Fernando Reyes *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito : Esta función revisa los argumentos recibidos, *
'* recogiendo los posibles fallos por falta de *
'* argumentos requeridos y almacenando en las *
'* variables correspondientes los argumentos *
'* recibidos. recibe dos parámetros cuyo fin es ser de *
'* salida: una cadena que almacenará los errores *
'* detectados y un entero que almacenará el código de *
'* los errores detectados. Hay cuatro tipos de error; *
'* error 1 para los argumentos sin nombre requeridos y *
'* no encontrados, error 2 para los argumentos con *
'* nombre requeridos y no encontrados, error 4 para los *
'* combos de argumentos opcionales (un combo de *
'* argumentos opcionales es aquel conjunto de *
'* argumentos opcionales que es requerido que se pase *
'* al menos uno de ellos y que si se pasa más de uno se *
'* ignorarán aquellos que estén detrás en la prioridad *
'* entre ellos; una caracterÃstica clara de lo que es *
'* un combo de argumentos es cuando dos o más *
'* argumentos almacenan su valor en la misma variable), *
'* por último, error 8 en el caso de que se haya pasado *
'* una unidad organizativa como argumento /OU que no *
'* tenga ningún usuario. En el caso de producirse más *
'* de un tipo de error, el número de error será la suma *
'* de los errores recibidos, es decir 3, 5, 6, 7, 9, *
'* 10, 11, 12, 13. 14 o 15 *
'***********************************************************************
Dim bol_Devolucion 'As Boolean
Dim bol_Error1 'As Boolean
Dim bol_Error2 'As Boolean
Dim bol_Error4 'As Boolean
Dim bol_Error8 'As Boolean
Dim obj_FS 'As Scripting.FileSystemObject
Dim obj_TS 'As Scripting.TextStream
Dim bol_Excluidos 'As Boolean
'Iniciamos los indicadores
bol_Devolucion = False
bol_Error1 = False
bol_Error2 = False
bol_Error4 = False
bol_Error8 = False
'Si hay que mostrar la ayuda, se muestra y
'termina el script
If WScript.Arguments.Named.Exists("?") Then
Call s_Ayuda("******************" & vbCrLf & _
"* AYUDA *" & vbCrLf & _
"******************")
WScript.Quit 0
End If
'Revisamos que esté el argumento
'/T (fichero)
If WScript.Arguments.Named.Exists("T") Then
str_TXT = _
WScript.Arguments.Named("T")
End If
'Revisamos que esté el argumento
'/D (dominio)
If WScript.Arguments.Named.Exists("D") Then
str_Dominio = _
f_DominioDNSaNT(WScript.Arguments.Named("D"))
Else
str_Dominio = f_NombreNTDeDominio
End If
'Revisamos si ha sido pasado el argumento
'/F (fichero_con_usuarios)
If WScript.Arguments.Named.Exists("F") Then
Set obj_FS = CreateObject( _
"Scripting.FileSystemObject")
Set obj_TS = obj_FS.OpenTextFile( _
Wscript.Arguments.Named("F"))
arr_Usuarios = Split( _
obj_TS.ReadAll,vbCrLf)
'Revisamos si ha sido pasado el argumento
'/L (lista_de_usuarios)
Elseif WScript.Arguments.Named.Exists("L") Then
arr_Usuarios = _
Split(WScript.Arguments.Named("L"),",")
'Revisamos si ha sido pasado el argumento
'/OU (unidad_organizativa)
Elseif WScript.Arguments.Named.Exists("OU") Then
'Revisamos que esté el argumento
'/R (borrado_recursivo)
If WScript.Arguments.Named.Exists("R") Then
bol_Recursivo = True
End If
'Revisamos si ha sido pasado el argumento
'/FE (fichero_excluidos)
If WScript.Arguments.Named.Exists("FE") Then
Set obj_FS = CreateObject( _
"Scripting.FileSystemObject")
Set obj_TS = obj_FS.OpenTextFile( _
Wscript.Arguments.Named("FE"))
arr_Excluidos = Split( _
obj_TS.ReadAll,vbCrLf)
bol_Excluidos = True
'Revisamos que esté el argumento
'/E (usuarios_excluidos)
ElseIf WScript.Arguments.Named.Exists("E") Then
arr_Excluidos = _
Split(WScript.Arguments.Named("E"),",")
bol_Excluidos = True
Else
bol_Excluidos = False
End If
'Declaraciones necesarias para obtener los
'usuarios de la OU
Dim obj_Conexion, obj_Comando, str_OU
Dim bol_Excluido, str_Filtro, str_Consulta
Dim rs_Usuarios, obj_Argumentos, str_Atributos
Dim str_Usuarios, int_Excluido
str_OU = "<LDAP://" & WScript.Arguments.Named("OU") & ">"
Set obj_Conexion = CreateObject("ADODB.Connection")
Set obj_Comando = CreateObject("ADODB.Command")
obj_Conexion.Provider = "ADsDSOOBject"
obj_Conexion.Open "Active Directory Provider"
Set obj_Comando.ActiveConnection = obj_Conexion
str_Filtro = "(&(objectCategory=person)(objectClass=user))"
str_Atributos = "distinguishedName,sAMAccountName"
str_Consulta = str_OU & ";" & str_Filtro & ";" & _
str_Atributos
If bol_Recursivo Then
str_Consulta = str_Consulta & ";subtree"
Else
str_Consulta = str_Consulta & ";onelevel"
End if
obj_Comando.CommandText = str_Consulta
obj_Comando.Properties("Page Size") = 1000
obj_Comando.Properties("Timeout") = 300
obj_Comando.Properties("Cache Results") = False
Set rs_Usuarios = obj_Comando.Execute
' rs_Usuarios.MoveFirst
Do Until rs_Usuarios.EOF
If bol_Excluidos Then
bol_Excluido = False
For int_Excluido = LBound(arr_Excluidos) _
To UBound(arr_Excluidos)
If UCase(arr_Excluidos(int_Excluido)) _
= _
UCase(rs_Usuarios.Fields("sAMAccountName")) _
Then
bol_Excluido = True
Exit For
End If
Next 'int_Excluido
If Not bol_Excluido Then _
str_Usuarios = str_Usuarios & _
str_Dominio & "\" & _
rs_Usuarios.Fields( _
"sAMAccountName") & ","
Else
str_Usuarios = str_Usuarios & _
str_Dominio & "\" & _
rs_Usuarios.Fields( _
"sAMAccountName") & ","
End If
rs_Usuarios.MoveNext
bol_Excluido = False
Loop
obj_Conexion.Close
Set obj_Conexion = Nothing
Set obj_Comando = Nothing
Set rs_Usuarios = Nothing
If Len(str_Usuarios) > 0 Then
str_Usuarios = Left(str_Usuarios,Len(str_Usuarios)-1)
arr_Usuarios = Split(str_Usuarios,",")
Else
str_Error = "Error 8: la unidad organizativa " & _
str_OU & ",pasada como parámetro " & _
"/OU, no contiene ningún usuario," & _
" o todos los que contiene están " & _
"excluidos del borrado."
bol_Error8 = True
End If
Else
str_Error = str_Error & _
"Error 4: No se ha pasado " & _
"ninguno de los argumentos" & _
" integrantes de un combo " & _
"de argumentos. En un comb" & _
"o de argumentos todos los" & _
" argumentos son opcionale" & _
"s, sin embargo debe ser p" & _
"asado uno al menos; si se" & _
" pasa más de uno, sólo se" & _
" tendrá en cuenta uno, el" & _
" primero en el orden de a" & _
"rgumentos del combo. En e" & _
"ste caso los argumentos q" & _
"ue integran el combo son " & _
"(en orden de prioridad): "
str_Error = str_Error & _
"""/F""" & _
", ""/L""" & _
" y ""/OU""" & vbCrLf
bol_Error4 = True
End If
'Si se ha pasado el modificador /DE ponemos a True el indicador de
'deshabilitar en lugar de borrar
If WScript.Arguments.Named.Exists("DE") Then bol_Deshabilitar = True
'Preparamos las variables de devolucion:
'el entero como suma de los posibles errores 1, 2 y 4
int_Error = Abs(bol_Error1) + _
(2 * Abs(bol_Error2)) + _
(4 * Abs(bol_Error4)) + _
(8 * Abs(bol_Error8))
'La devolucion de la función será True en caso de
'haber alguno de los errores
bol_Devolucion = (bol_Error1 _
Or _
bol_Error2 _
Or _
bol_Error4 _
Or _
bol_Error8)
'Hacemos la devolución de la función
f_RevisarArgumentos = bol_Devolucion
End Function 'f_RevisarArgumentos
Sub s_Ayuda(str_Error)
'***********************************************************************
'* Procedimiento: s_Ayuda *
'* Tipo : Sub *
'* Devolución : *
'* Fecha y Hora : 30/07/2007 17:50:40 *
'* Autor : Fernando Reyes *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito : Este procedimiento muestra la ayuda en lÃnea. *
'* Recibe un parámetro de tipo cadena que si no viene *
'* será mostrado antes de la lÃnea; pensado para que *
'* se muestre un error que se haya detectado. *
'***********************************************************************
'Si hay que mostrar algún texto previo a la ayuda, lo hacemos
If Len(str_Error) > 0 Then
WScript.Echo str_Error & vbCrLf & vbCrLf
End If
'A continuación, mostramos la ayuda por pantalla
WScript.Echo "Este script permite eliminar del directorio activ" & _
"o una o más cuentas de"
WScript.Echo "usuario. debe ser lanzado por un usuario con los " & _
"privilegios suficientes para"
WScript.Echo "borrar las cuentas. Su uso es indicado, por ejemp" & _
"lo, cuando se desea borrar de"
WScript.Echo "forma masiva cuentas de usuario."
WScript.Echo ""
WScript.Echo "Sintaxis"
WScript.Echo ""
WScript.Echo "{wscript | cscript [//nologo]} borrar-usuarios.vb" & _
"s [/L:lista_de_usuarios]"
WScript.Echo "[/F:fichero_con_usuarios] [/OU:unidad_organizativ" & _
"a] [/E:usuarios_excluidos]"
WScript.Echo "[/FE:fichero_excluidos] [/R] [/DE] [/T:fichero] [" & _
"/D:dominio] [/?]"
WScript.Echo ""
WScript.Echo "Siendo"
WScript.Echo ""
WScript.Echo "- /L: lista_de_usuarios (Opcional):"
WScript.Echo "Lista de usuarios a los que se borrará del direct" & _
"orio. Se trata"
WScript.Echo "de sus nombres NT. Este parámetro forma un combo" & _
" junto con el"
WScript.Echo "parámetro /F y el /OU, prevaleciendo sobre el /OU" & _
", mientras que"
WScript.Echo "el /F prevalece sobre él.."
WScript.Echo ""
WScript.Echo "- /F: fichero_con_usuarios (Opcional):"
WScript.Echo "Fichero con los nombres de los usuarios a los que" & _
" se borrará"
WScript.Echo "del directorio, un nombre de usuario por lÃnea. S" & _
"e trata, al"
WScript.Echo "igual que en caso del argumento L, de los nombres" & _
" NT. Este"
WScript.Echo "parámetro forma un combo junto con el parámetro L" & _
" y el OU,"
WScript.Echo "prevaleciendo sobre ambos."
WScript.Echo ""
WScript.Echo "- /OU: unidad_organizativa (Opcional):"
WScript.Echo "Nombre LDAP de la unidad organizativa a la que se" & _
" borrarán los"
WScript.Echo "usuarios. Este parámetro forma un combo junto con" & _
" el parámetro"
WScript.Echo "L y el OU, prevaleciendo ambos sobre él."
WScript.Echo ""
WScript.Echo "- /E: usuarios_excluidos (Opcional):"
WScript.Echo "Lista de usuarios excluÃdos de la eliminación. So" & _
"lo se"
WScript.Echo "procesará este argumento cuando se ha pasado el a" & _
"rgumento /OU,"
WScript.Echo "siendo ignorado si no está presente. Se trata de " & _
"sus nombres"
WScript.Echo "NT. Si se pasan los argumentos /E y /FE a la vez," & _
" sólo se tiene"
WScript.Echo "encuenta el argumento /FE."
WScript.Echo ""
WScript.Echo "- /FE: fichero_excluidos (Opcional):"
WScript.Echo "Ruta y nombre de un fichero con los nombres NT de" & _
" los usuarios"
WScript.Echo "que se deben excluir del borrado, uno por lÃnea. " & _
"Si se pasan"
WScript.Echo "los argumentos /E y /FE a la vez, sólo se tiene e" & _
"ncuenta el"
WScript.Echo "argumento /FE."
WScript.Echo ""
WScript.Echo "- /R: borrado_recursivo (Opcional):"
WScript.Echo "Si se pasa este argumento, el borrado se realizar" & _
"á de forma"
WScript.Echo "recursiva (en todo el subarbol). Al igual que el " & _
"argumento /E,"
WScript.Echo "sólo se tiene en cuenta si se está procesando el " & _
"argumento /OU."
WScript.Echo ""
WScript.Echo "- /T: fichero (Opcional):"
WScript.Echo "Fichero de texto, de valores separados por tabula" & _
"dor (ideal"
WScript.Echo "para ser abierto con Excel), con los resultados o" & _
"btenidos en la"
WScript.Echo "ejecución del script. Si se omite este argumento, la"
WScript.Echo "información se mostrará por pantalla."
WScript.Echo ""
WScript.Echo "- /D: dominio (Opcional):"
WScript.Echo "Nombre DNS (dominio.com) del dominio al que perte" & _
"nece el"
WScript.Echo "usuario. Si no se pasa este parámetro, se obtiene" & _
" a partir del"
WScript.Echo "dominio al que pertenezca el equipo desde el que " & _
"se lanza el"
WScript.Echo "script. No obstante, si el nombre del usuario es " & _
"completo"
WScript.Echo "(dominio\usuario) se eliminará el del dominio ind" & _
"icado por el"
WScript.Echo "nombre del usuario, aunque se trate de otro difer" & _
"ente al del"
WScript.Echo "equipo desde el que se lanza el script."
WScript.Echo ""
WScript.Echo "/DE: deshabilitar (Opcional):"
WScript.Echo "Si se pasa este modificador, los usuarios serán d" & _
"eshabilitados, en lugar de borrados"
WScript.Echo ""
WScript.Echo "Ejemplos:"
WScript.Echo ""
WScript.Echo "- Borra los usuario mortadelo,bacterio,ofelia:"
WScript.Echo ""
WScript.Echo "cscript //nologo borrar-usuarios.vbs /L:mortadelo" & _
",bacterio,ofelia"
WScript.Echo ""
WScript.Echo "- Borra los usuario listados en el fichero c:\tia" & _
"\usuarios\borrar-petardos.lst:"
WScript.Echo ""
WScript.Echo "cscript //nologo borrar-usuarios.vbs /F:c:\tia\us" & _
"uarios\borrar-petardos.lst"
WScript.Echo ""
WScript.Echo "- Borra los usuarios de la unidad organizativa"
WScript.Echo "ou=superintendencia,dc=tia,dc=org:"
WScript.Echo ""
WScript.Echo "cscript //nologo borrar-usuarios.vbs /OU:ou=super" & _
"intendencia,dc=tia,dc=org"
WScript.Echo ""
WScript.Echo "- Borra los usuarios del subárbol con raÃz en la " & _
"unidad organizativa"
WScript.Echo "ou=superintendencia,dc=tia,dc=org , excepto los u" & _
"suarios"
WScript.Echo "filemon,bestiajez,vicente:"
WScript.Echo ""
WScript.Echo "cscript //nologo borrar-usuarios.vbs /OU:ou=super" & _
"intendencia,dc=tia,dc=org"
WScript.Echo "/E:filemon,bestiajez,vicente /R"
WScript.Echo ""
WScript.Echo "- Borra los usuarios de la unidad organizativa"
WScript.Echo "ou=superintendencia,dc=tia,dc=org, y todas las su" & _
"bsiguientes, excepto los"
WScript.Echo "usuarios listados en el fichero c:\tia\usuarios\n" & _
"o-borrar.lst:"
WScript.Echo ""
WScript.Echo "cscript //nologo borrar-usuarios.vbs /OU:ou=super" & _
"intendencia,dc=tia,dc=org"
WScript.Echo "/FE:c:\tia\usuarios\no-borrar.lst /R"
WScript.Echo ""
WScript.Echo "- Deshabilita los usuarios mortadelo,bacterio,ofe" & _
"lia y almacena los resultados en elfichero c:\tia" & _
"\listados\borrar-petardos.tsv:"
WScript.Echo ""
WScript.Echo "cscript //nologo borrar-usuarios.vbs /L:mortadelo" & _
",bacterio,ofelia"
WScript.Echo "/T:c:\tia\listados\borrar-petardos.tsv /DE"
WScript.Echo ""
WScript.Echo ""
WScript.Echo ""
End Sub 's_Ayuda
Function f_NTaDN(str_RutaNT, str_DN)' As String
'***********************************************************************
'* Procedimiento: f_NTaDN *
'* Tipo : Función *
'* Devolución : Cadena *
'* Fecha y Hora : May 2007 *
'* Autor : Fernando Reyes *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito : Esta función recibe o bien el nombre NT *
'* ("dominio\nombre"), como primer parámetro, de un *
'* objeto de dominio y devuelve el nombre distinguido *
'* de ese objeto, o bien el nombre distinguido de un *
'* objeto, como segundo parámetro, y devuelve el *
'* nombre NT. *
'* Basada en el código de Richard Mueller, MVP de *
'* Scripting y ADSI (http://www.rlmueller.net) *
'***********************************************************************
'Constantes para el objeto NameTranslate
Const ADS_NAME_INITTYPE_GC = 3
Const ADS_NAME_TYPE_NT4 = 3
Const ADS_NAME_TYPE_1779 = 1
Dim obj_TraductorDeNombres
Dim int_De, int_A,str_Nombre
If Len(str_RutaNT) > 0 Then
int_De = ADS_NAME_TYPE_NT4
int_A = ADS_NAME_TYPE_1779
str_Nombre = str_RutaNT
ElseIf Len(str_DN) > 0 Then
int_De = ADS_NAME_TYPE_1779
int_A = ADS_NAME_TYPE_NT4
str_Nombre = str_DN
Else
WScript.Echo "Error 1 en f_NTaDN: No se ha pasado " & _
"ningún nombre para traducir."
Exit Function
End If
'Creamos el objeto NameTranslate.
Set obj_TraductorDeNombres = CreateObject("NameTranslate")
On Error Resume Next
'Lo iniciamos localizando el catálogo global
obj_TraductorDeNombres.Init ADS_NAME_INITTYPE_GC, ""
'Establecemos el parámetro de nombre en el traductor de nombres
obj_TraductorDeNombres.Set int_De, str_Nombre
'Usamos el método Get del traductor de nombres para obtener el
'nombre traducido
f_NTaDN = obj_TraductorDeNombres.Get(int_A)
'Limpieza de kks
Set obj_TraductorDeNombres = Nothing
On Error GoTo 0
End Function 'f_NTaDN
Function f_IIf(bol_Expresion, _
var_Verdadero, _
var_Falso) 'As Variant
'***********************************************************************
'* Procedimiento: f_IIf *
'* Tipo : Función *
'* Devolución : Variant *
'* Fecha y Hora : Julio de 2007 *
'* Autor : Fernando Reyes *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito : Esta función emula la función IIf de VBA.Recibe una *
'* booleana, que será el resultado de una expresión *
'* que se ponga como parámetro al llamar la función, *
'* tal y como se hace en la función IIf de VBA, y *
'* devolverá lo que se pase como parámetro *
'* var_Verdadero, si la booleana es verdadera o lo que *
'* se pase como parámetro var_Falso si la booleana es *
'* falsa. *
'***********************************************************************
if bol_Expresion Then
f_IIF = var_Verdadero
Else
f_IIf = var_Falso
End If
End Function 'f_IIf
Function f_NombreNTDeDominio() 'As String
'***********************************************************************
'* Procedimiento: f_NombreNTDeDominio *
'* Tipo : Función *
'* Devolución : Booleana *
'* Fecha y Hora : 31/07/2007 18:53:29 *
'* Autor : Fernando Reyes *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito : Esta función obtiene el nombre NT de el dominio al *
'* que está unido el equipo desde el que se lanza. *
'* Para ello, utiliza el objeto rootDSE. *
'***********************************************************************
Dim obj_RootDSE 'As rootDSE
'Conectamos con rootDSE
Set obj_RootDSE = GetObject("LDAP://rootDSE")
'Devolvemos el nombre NT del dominio
f_NombreNTDeDominio = f_NTaDN("", _
obj_RootDSE.Get("defaultNamingContext"))
f_NombreNTDeDominio = Left(f_NombreNTDeDominio, _
Len(f_NombreNTDeDominio) - 1)
'Limpieza de bullarenga
Set obj_RootDSE = Nothing
End Function 'f_NombreNTDeDominio
Function f_DominioDNSaNT(str_DNS) 'As String
'***********************************************************************
'* Procedimiento: f_DominioDNSaNT *
'* Tipo : Función *
'* Devolución : Booleana *
'* Fecha y Hora : 31/07/2007 18:56:19 *
'* Autor : Fernando Reyes *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito : Esta función recibe un nombre DNS de dominio *
'* (dominio.com) y devuelve su nombre NT. Para ello *
'* convierte el nombre DNS en nombre distinguido, *
'* conecta con el dominio, usando el nombre *
'* distinguido con el proveedor LDAP, y obtiene su *
'* nombre NT. *
'***********************************************************************
Dim arr_Dominio, str_LDAP
arr_Dominio = Split(str_DNS,".")
str_LDAP = "DC=" & Join(arr_Dominio,",DC=")
f_DominioDNSaNT = f_NTaDN("",str_LDAP)
f_DominioDNSaNT = Left(f_DominioDNSaNT,Len(f_DominioDNSaNT) - 1)
End Function 'f_DominioDNSaNT

Leave a Reply