El Blog de Gualtrysoft

Windows 2000/2003/2008, Active Directory, VBScript, Hyper-V, PowerShell y todo aquello interesante a la hora de usar, configurar y administrar Windows Server. También tenemos longanizas…

Script VBScript Para Borrar Usuarios De Active Directory

Posted by urpiano en Jueves 31 \31\UTC julio \31\UTC 2008

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] [/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.
?   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

– Borra 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

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] [/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.    *
'*                                                                     *
'*                                                                     *
'* 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                                *
'*                                                                     *
'* - Borra 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                              *
'*                                                                     *
'*                                                                     *
'*                                                                     *
'*                                                                     *
'* © Fernando Reyes                                                    *
'* Julio De 2008                                                       *
'*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°*
'*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*

'Exigimos la declaración de variables
Option Explicit


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

'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 & _
              "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 borrar"
            
        Else
        
            'El objeto ha sido borrado, ponemos el éxito
            'en el mensaje
            str_Mensaje = str_Mensaje & vbTab & _
                          "Fue borrado con éxito"
            
        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
    
    
    int_Posicion = InStr(1,str_Usuario,"\")
    
    If int_Posicion > 0 Then
    
        str_UsuarioLDAP = f_NTaDN(str_Usuario,"")  
        str_Mensaje = str_Mensaje & str_Usuario
        
    Else
    
        str_UsuarioLDAP = f_NTaDN(str_Dominio & "\" & str_Usuario,"")
        str_Mensaje = str_Mensaje & str_Dominio & "\" & str_Usuario
    
    End If
    
    WScript.Echo str_UsuarioLDAP
    
    On Error Resume Next
    Set obj_Usuario = GetObject("LDAP://" & str_UsuarioLDAP)
    
    If Err.Number <> 0 Then
    
        str_Mensaje = str_Mensaje & vbTab & _
                      Err.Description & vbTab & _
                      Err.Number 
        f_BorrarUsuario = False
        Err.Clear
        On Error Goto 0
        Exit Function
        
    End If    
    
    str_OU = obj_Usuario.Parent
    str_CN = obj_Usuario.Name
    
    If Err.Number <> 0 Then
    
        str_Mensaje = str_Mensaje & vbTab & _
                      Err.Description & vbTab & _
                      Err.Number
                     
        f_BorrarUsuario = False
        Err.Clear
        On Error Goto 0
        Exit Function
        
    End If
      
    Set obj_OU = GetObject(str_OU)
    
    If Err.Number <> 0 Then
    
        str_Mensaje = str_Mensaje & vbTab & _
                      Err.Description & vbTab & _
                      Err.Number
                     
        f_BorrarUsuario = False
        Err.Clear
        On Error Goto 0
        Set obj_Usuario = Nothing
        Exit Function
        
    End If
       
    obj_OU.Delete "user", str_CN

    If Err.Number <> 0 Then
    
        str_Mensaje = str_Mensaje & vbTab & _
                      Err.Description & vbTab & _
                      Err.Number
        f_BorrarUsuario = False
        Err.Clear
        On Error Goto 0
        Exit Function
        
    End If    

    On Error Goto 0
    
    str_Mensaje = str_Mensaje & vbTab & _
                  "No se produjo error" & _
                  vbTab & "0"
    
    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

    '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] [/T:fichero] [/D:dom" & _
                 "inio] [/?]"
    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 ""
    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 "- Borra los usuarios mortadelo,bacterio,ofelia y " & _
                 "almacena los resultados en el"
    WScript.Echo "fichero 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"
    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
    Dim obj_Dominio
    
    'Conectamos con rootDSE
    Set obj_RootDSE = GetObject("LDAP://rootDSE")
    
    'Creamos el objeto dominio con el defaultNamingContext
    Set obj_Dominio = GetObject("LDAP://" & _
                obj_RootDSE.Get("defaultNamingContext"))
    
    'Devolvemos el nombre NT del dominio
    f_NombreNTDeDominio = obj_Dominio.Get("Name")
    
    'Limpieza de bullarenga :-)
    Set obj_Dominio = Nothing
    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, obj_Dominio
    
    arr_Dominio = Split(str_DNS,".")
    str_LDAP = "DC=" & Join(arr_Dominio,",DC=")
    Set obj_Dominio = GetObject("LDAP://" & str_LDAP)
    
    f_DominioDNSaNT = obj_Dominio.Get("Name")
    
    Set obj_Dominio = Nothing
        
End Function 'f_DominioDNSaNT

 

 

5 comentarios to “Script VBScript Para Borrar Usuarios De Active Directory”

  1. RICARDO said

    NO SE SI ESTE ES EL PROCEDIMIENTO CORRECTO. SI NO ES ASÍ PERDONA POR ELLO.
    ME PODRIAS INDICAR COMO PUEDO MEDIANTE SCRIPT DE VB LISTAR LOS GRUPOS CREADOS EN UN DOMINIO DETERMINADO DEL DIRECTORIO ACTIVO.
    POR FAVOR ENVIAME LA CONSTESTACION AL CORREO QUE TE HE INDICADO.
    GRACIAS DE ANTEMANO.

  2. Jose Ramon Pernia Reyes said

    Buenas tardes, estoy tratando de hacer un Script similar al tuyo pero en ves de eliminar los usuarios que los bloquee, y los cambie de UO, esto con la finalidad de guardar un histórico de usuarios, por otra parte también estoy creando un Script para cambiar las contraseñas de usuarios en el dominio desde el equipo de HelpDesk esto con la finalidad de que se puede cambiar la contraseña de forma remota y a su vez se guarde una bitácora de estos cambios, si me puedes orientar te lo agradezco o si tienes algún Script que haga algo similar seria perfecto.

  3. urpiano said

    Jose Ramon Pernia Reyes,

    Mira en el script center, que tiees la forma de realizar las tareas que necesitas:

    http://www.microsoft.com/technet/scriptcenter/scripts/default.mspx?mfr=true

  4. […] Publicado por urpiano en Viernes 16 de Enero de 2009 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. […]

  5. Rodolfo Alvarez said

    Hola, estoy viendo tu script, muy buen trabajo; pero tengo una duda, en la opcion /F: (fichero de usuarios), es el listado de usuarios masivos a eliminar; el archivo puede soportar TXT o CSV????

    Saludos

    Gracias.
    Rodolfo

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

 
A %d blogueros les gusta esto: