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 Generar Un Fichero De Inclusión De Usuarios De ADMT v3.0

Posted by urpiano en Jueves 18 \18\UTC diciembre \18\UTC 2008

Este script crea un fichero de valores separados por comas destinado ser utilizado como fichero de objetos de usuario a migrar con ADMT v3.0. En el fichero va el nombre sAMAccountName, del usuario del dominio de origen, como SourceName, el RDN del usuario de origen como TargetRDN de destino, la parte de usuario del UPN de origen + arroba + sufijo recibido como parámetro como TargetUPN y la ruta y nombre del fichero de valores separados por comas en el que se vuelca la información.

Sintaxis

cscript [//nologo] admt-users.vbs /O:ruta_LDAP /U:sufijo_UPN /F:fichero [/?]

Siendo

Etiqueta Dato ¿Requerido? Descripción
O ruta_LDAP
Ruta LDAP del contenedor del que se listan los usuarios. Se listarán todos aquellos que estén en el subárbol de raíz la ruta pasada
U sufijo_UPN
Sufijo de nombre UPN del usuario de destino. Sustituirá el sufijo del UPN del usuario de origen (Ej: mortadelo@tia.gob pasa a ser mortadelo@tia.org)
F fichero
Ruta y nombre del fichero de valores separados por comas en el cual se volcarán los resultado
?   No
Muestra la ayuda en línea.

Ejemplos:

– Crea el fichero de valores separados por comas bestiajez-pcusuariosusuarios-tia.csv, para ser utilizado en la migración de usuarios con ADMT v3.0, de la OU OU=Agentes,DC=tia,DC=org; a los usuarios migrados se les pondrá tia.org como sufijo de su UPN:

cscript //nologo admt-users.vbs /O:OU=Agentes,DC=tia,DC=org /U:tia.org /F:bestiajez-pcusuariosusuarios-tia.csv

Este es el código del script

'*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
'*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°*
'* admt-users.vbs                                                      *
'*                                                                     *
'* Este script crea un fichero de valores separados por comas          *
'* destinado ser utilizado como fichero de objetos de usuario a migrar *
'* con ADMT v3.0. En el fichero va el nombre sAMAccountName, del       *
'* usuario del dominio de origen, como SourceName, el RDN del usuario  *
'* de origen como TargetRDN de destino, la parte de usuario del UPN de *
'* origen + arroba + sufijo recibido como parámetro como TargetUPN y   *
'* la ruta y nombre del fichero de valores separados por comas en el   *
'* que se vuelca la información.                                       *
'*                                                                     *
'* Sintaxis                                                            *
'*                                                                     *
'* cscript [//nologo] admt-users.vbs /O:ruta_ldap /U:sufijo_UPN        *
'* /F:fichero [/?]                                                     *
'*                                                                     *
'* Siendo                                                              *
'*                                                                     *
'* - /O: ruta_ldap (Requerido):                                        *
'*         Ruta LDAP del contenedor del que se listan los usuarios. Se *
'*         listarán todos aquellos que estén en el subárbol de raíz la *
'*         ruta pasada                                                 *
'*                                                                     *
'* - /U: sufijo_UPN (Requerido):                                       *
'*         Sufijo de nombre UPN del usuario de destino. Sustituirá el  *
'*         sufijo del UPN del usuario de origen (Ej: mortadelo@tia.gob *
'*         pasa a ser mortadelo@tia.org)                               *
'*                                                                     *
'* - /F: fichero (Requerido):                                          *
'*         Ruta y nombre del fichero de valores separados por comas en *
'*         el cual se volcarán los resultado.                          *
'*                                                                     *
'* - /?: ayuda (Opcional):                                             *
'*         Muestra la ayuda en línea                                   *
'*                                                                     *
'*                                                                     *
'* Ejemplos:                                                           *
'*                                                                     *
'* - Crea un fichero de valores separados por comas, para ser          *
'* utilizado en la migración de usuarios con ADMT v3.0, de la OU       *
'* OU=Agentes,DC=tia,DC=org; a los usuarios migrados se les pondrá     *
'* tia.org como sufijo de su UPN.:                                     *
'*                                                                     *
'* cscript //nologo admt-users.vbs /O:OU=Agentes,DC=tia,DC=org         *
'* /U:tia.org /F:bestiajez-pcusuariosusuarios-tia.csv              *
'*                                                                     *
'*                                                                     *
'*                                                                     *
'*                                                                     *
'* © Fernando Reyes                                                    *
'* Junio De 2008                                                       *
'*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°*
'*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*

'Exigimos la declaración de variables
Option Explicit


Dim str_Error 'As String
Dim int_Error 'As String
Dim str_OU 'As String
Dim str_SufijoUPN 'As String
Dim str_Fichero 'As String
Dim str_Salida 'As String
Dim str_RDN 'As String
Dim str_UPN 'As String
Dim ado_Conexion 'As ADODB.Connection
Dim ado_Comando 'As ADODB.Command
Dim ado_RS 'As ADODB.Recordset

Dim obj_FS 'As Scripting.FileSystemObject
Dim obj_TS 'As Scripting.TextStream

Dim int_Usuarios 'As Integer



'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 una conexión ADO a Active Directory
Set ado_Conexion = CreateObject("ADODB.Connection")
ado_Conexion.Open "Provider=ADsDSOObject;"
 
'Creamos un objeto Comando ADO
Set ado_Comando = CreateObject("ADODB.Command")
ado_Comando.ActiveConnection = ado_Conexion
 
'Establecemos la búsqueda de usuarios, obteniendo su nombre
'distinguido, su nombre pre Windows 2000, su UPN y sólo en el
'propio nivel de la OU
ado_Comando.CommandText = _
    "<LDAP://" & str_OU & ">;(&(objectCategory=User)" & _
         "(objectClass=person));samAccountName,distingui" & _
         "shedName,UserPrincipalName;onelevel"
  
'Obtenemos el recordset de usuarios
Set ado_RS = ado_Comando.Execute
 
'Ponemos los encabezados a la salida
str_Salida = "SourceName,TargetRDN,TargetUPN,TargetSAM" & vbCrLf

'Iniciamos la cuenta de usuarios
int_Usuarios = 0

'Recorremos el recordset de usuarios
Do While Not ado_RS.EOF

	'Obtenemos el nombre relativo
	str_RDN = f_RDN(ado_RS.Fields("distinguishedName").Value)

    'Establecemos control de errores
    On Error Resume Next
    
    'Obtenemos su UPN
    str_UPN = Split(ado_RS.Fields("UserPrincipalName").Value,"@")(0) & _
                    "@" & str_SufijoUPN

    'Si no se ha producido error
    If Err.Number = 0 Then
	
	    'Volcamos la información obtenida y generada
	    str_Salida = str_Salida &  _
        		        """" & ado_RS.Fields("sAMAccountName").Value & _
        		        """,""" & _
  		 		str_RDN & """,""" & _
 		 		str_UPN & """,""" & _
 		 		ado_RS.Fields("sAMAccountName").Value & """" & _
 		 		vbCrLf
 		
 		'Incrementamos el contador de usuario
 		int_Usuarios = int_Usuarios + 1 		
 		
    'si se ha producido error...
    Else

        'Borramos el error
        Err.Clear

    End If            
	
    'Devolvemos el control de errores a CScript
    On Error Goto 0		 
    
	'vamos al siguiente registro
	ado_RS.MoveNext

Loop

'Cerramos el recordset
ado_RS.Close

'Cerramos la conexión
ado_Conexion.Close

'Volcamos los resultados al fichero
'Creamos un objeto FileSystemObject
Set obj_FS = CreateObject("Scripting.FileSystemObject")

'Creamos el fichero de salida
Set obj_TS = obj_FS.CreateTextFile(str_Fichero)

'Volcamos la información de salida en el fichero
obj_TS.Write str_Salida

'Cerramos el fichero de salida
obj_TS.Close


'Limpieza de popa :-)
Set obj_TS = Nothing
Set ado_RS = Nothing
Set ado_Conexion = Nothing
Set ado_Comando = Nothing

If int_Usuarios = 0 Then obj_FS.DeleteFile(str_Fichero)

Set obj_FS = Nothing

Function f_RevisarArgumentos( _
                             str_Error, _
                             int_Error _
                             ) 'As Boolean
'***********************************************************************
'* Procedimiento: f_RevisarArgumentos                                  *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : 23/06/2008 18:23:10                                  *
'* 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 tres 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, por último,      *
'*                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 omás argumentos almacenan su valor en la misma   *
'*                variable). En el caso de producirse más de un tipo   *
'*                de error, el número de error será la suma de ambos   *
'*                de los errores recibidos, es decir 3, 5 o 6          *
'***********************************************************************

    Dim bol_Devolucion 'As Boolean
    Dim bol_Error1 'As Boolean
    Dim bol_Error2 'As Boolean
    Dim bol_Error4 'As Boolean

    'Iniciamos los indicadores
    bol_Devolucion = False
    bol_Error1 = False
    bol_Error2 = False
    bol_Error4 = 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 requerido 
    '/O (ruta_ldap)
    If WScript.Arguments.Named.Exists("O") Then

        str_OU =  _
               WScript.Arguments.Named("O")

    Else

        str_Error = str_Error & vbcrlf & _
                    "Error 2, falta argumento " & _
                    "requerido con nombre: " & _
                    "/O (ruta_ldap)" & vbCrLf
        bol_Error2 = True

    End If

    'Revisamos que esté el argumento requerido 
    '/U (sufijo_UPN)
    If WScript.Arguments.Named.Exists("U") Then

        str_SufijoUPN =  _
               WScript.Arguments.Named("U")

    Else

        str_Error = str_Error & vbcrlf & _
                    "Error 2, falta argumento " & _
                    "requerido con nombre: " & _
                    "/U (sufijo_UPN)" & vbCrLf
        bol_Error2 = True

    End If

    'Revisamos que esté el argumento requerido 
    '/F (fichero)
    If WScript.Arguments.Named.Exists("F") Then

        str_Fichero =  _
               WScript.Arguments.Named("F")

    Else

        str_Error = str_Error & vbcrlf & _
                    "Error 2, falta argumento " & _
                    "requerido con nombre: " & _
                    "/F (fichero)" & vbCrLf
        bol_Error2 = 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))
    '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)

    '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 : 23/06/2008 18:23:10                                  *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Este procedimiento muestra la ayuda en línea.        *
'*                Recibe un parámetro de tipo cadena que si 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 crea un fichero de valores separados " & _
                 "por comas destinado ser"
    WScript.Echo "utilizado como fichero de objetos de usuario a mi" & _
                 "grar con ADMT v3.0. En el"
    WScript.Echo "fichero va el nombre sAMAccountName, del usuario " & _
                 "del dominio de origen, como"
    WScript.Echo "SourceName, el RDN del usuario de origen como Tar" & _
                 "getRDN de destino, la parte de"
    WScript.Echo "usuario del UPN de origen + arroba + sufijo recib" & _
                 "ido como parámetro como"
    WScript.Echo "TargetUPN y la ruta y nombre del fichero de valor" & _
                 "es separados por comas en el"
    WScript.Echo "que se vuelca la información."
    WScript.Echo ""
    WScript.Echo "Sintaxis"
    WScript.Echo ""
    WScript.Echo "cscript [//nologo] admt-users.vbs /O:ruta_ldap /U" & _
                 ":sufijo_UPN /F:fichero [/?]"
    WScript.Echo ""
    WScript.Echo "Siendo"
    WScript.Echo ""
    WScript.Echo "- /O: ruta_ldap (Requerido):"
    WScript.Echo "Ruta LDAP del contenedor del que se listan los us" & _
                 "uarios. Se"
    WScript.Echo "listarán todos aquellos que estén en el subárbol " & _
                 "de raíz la"
    WScript.Echo "ruta pasada"
    WScript.Echo ""
    WScript.Echo "- /U: sufijo_UPN (Requerido):"
    WScript.Echo "Sufijo de nombre UPN del usuario de destino. Sust" & _
                 "ituirá el"
    WScript.Echo "sufijo del UPN del usuario de origen (Ej: mortade" & _
                 "lo@tia.gob"
    WScript.Echo "pasa a ser mortadelo@tia.org)"
    WScript.Echo ""
    WScript.Echo "- /F: fichero (Requerido):"
    WScript.Echo "Ruta y nombre del fichero de valores separados po" & _
                 "r comas en el"
    WScript.Echo "cual se volcarán los resultado."
    WScript.Echo ""
    WScript.Echo "- /?: ayuda (Opcional):"
    WScript.Echo "Muestra la ayuda en línea"
    WScript.Echo ""
    WScript.Echo ""
    WScript.Echo "Ejemplos:"
    WScript.Echo ""
    WScript.Echo "- Crea un fichero de valores separados por comas," & _
                 " para ser utilizado en la"
    WScript.Echo "migración de usuarios con ADMT v3.0, de la OU OU=" & _
                 "Agentes,DC=tia,DC=org; a los"
    WScript.Echo "usuarios migrados se les pondrá tia.org como sufi" & _
                 "jo de su UPN.:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo admt-users.vbs /O:OU=Agentes,DC=" & _
                 "tia,DC=org /U:tia.org /F:bestiajez-pcusuarios" & _
                 "usuarios-tia.csv"
    WScript.Echo ""
    WScript.Echo ""
    WScript.Echo ""

End Sub 's_Ayuda


Function f_RDN(str_DN) 'As String
'***********************************************************************
'* Procedimiento: f_RDN                                                *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : 15/12/2008 12:55:15                                  *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Esta función recibe un nombre distinguido de         *
'*                usuario y devuelve un nuevo RDN montándolo como      *
'*                "CN=Apellidos, Nombre" siempre que sea posible      *
'***********************************************************************

	Dim str_RDN 'As String
	Dim obj_Usuario 'As iADsUser
	Dim str_SN 'As String
	Dim str_GN 'As String
	
	'Obtenemos el objeto usuario con el proveedor LDAP
	Set obj_Usuario = GetObject("LDAP://" & str_DN)
	
	On Error Resume Next
	
	'Obtenemos los apellidos del usuario
	str_SN = "" & obj_Usuario.LastName
	
	'Obtenemos el nombre propio del usuario
	str_GN = "" & obj_Usuario.FirstName
	
	'Si tanto el nombre propio como los apellidos tienen contenido
	If Len(Trim(str_SN)) > 0 _
	And Len(Trim(str_GN)) > 0 Then
	
		'Montamos el nombre relativo como "Apellidos, Nombre"
		str_RDN = str_SN & ", " & str_GN
		
	'Si sólo el nombre propio tiene contenido
	ElseIf Len(Trim(str_GN)) > 0 Then
	
	   'Montamos el nombre propio como nombre relativo
		str_RDN = str_GN
		
	'En cualquier otro caso se monta como nombre relativo los
	'apellidos
	Else
	
		str_RDN = str_SN
		
	End If
	
	'Si el nombre relativo obtenido está vacío
	If Len(Trim(str_RDN)) = 0 Then

		'Ponemos el nombre distinguido como nombre relativo
		'sustituyendo la aparición de "," (coma literal, no
		'separadora de nombres en nombre distinguido) por un
		'caracter no imprimible
		str_RDN = Replace(str_DN,",",chr(1))
		
		'Nos quedamos con el primer elemento del nombre
		'distinguido
		str_RDN = Split(str_RDN,",")(0)
		
		'Sustituimos el caracter no imprimible por ","
		str_RDN = Replace(str_RDN,Chr(1),",")
		
	'En caso contrario pornemos el calificador "CN=" delante
	'del nombre relativo obtenido
	Else
	
		str_RDN = "CN=" & str_RDN
		
	End If


	'Devolvemos el RDN
	f_RDN = str_RDN
	
	On Error Goto 0
	
	'Vaciamos el objeto usuario
	Set obj_Usuario = Nothing

End Function 'f_RDN

 

 

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: