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 Crear Un Fichero BAT Para La Migración De Grupos Con ADMT v3.0

Posted by urpiano en Lunes 15 \15\UTC diciembre \15\UTC 2008

Este script se encarga de generar un fichero BAT que, cuando se ejecute, realizará la migración de los grupos contenidos en el fichero recibido como parámetro /F. En ese BAT habrá una línea de llamada a ADMT por cada OU que contenga alguno de los grupos. Se pueden migrar también los SIDs de los grupos, lo que permitirá acceder a los recursos del dominio de origen desde el de destino gracias a tener en el SIDHistory del nuevo objeto el SID que tenía en el dominio de origen. El script BAT deberá ser lanzado desde el equipo que tiene instalado ADMT v3.0 y las rutas que se especifican en los comandos del BAT deberán existir en ese equipo (si es que son rutas locales) y ser accesibles desde ese equipo por el usuario que lanza el script (en el caso de rutas UNC)

Sintaxis

cscript [//nologo] admt-grupos.vbs /F:fichero /B:fichero /R:ruta /O:dominio /D:dominio /DO:equipo /DD:equipo /L:ruta [/C:cadena] [/SID] [/OU:unidad_organizativa] [/?]

Siendo

Etiqueta Dato ¿Requerido? Descripción
F fichero
Fichero con los nombres distinguidos de los grupos que se desean migrar, uno por línea y ordenado por Ous
B fichero
Ruta y nombre del fichero BAT que se generará con las líneas de llamada a ADMT para migrar los grupos de cada OU
R ruta
Ruta de la carpeta en la que se crearán los ficheros CSV con los nombres de los grupos a migrar; se creará uno por cada OU que contenga algún grupo de los listados en el fichero especificado por el parámetro /F. El nombre del fichero será el nombre distinguido de la OU sustituyendo las comas por tildes (~) y extensión CSV
C cadena No
Cadena que se debe quitar a los nombres de los grupos a migrar. Está destinada a quitar los ” (CLECE)”, ” (ACS)” y ” (SPL)” que agregamos en el script membresias.vbs con el que se generaron estos grupos y, en el dominio de destino, ya no son necesarios
O dominio
Nombre DNS del dominio de origen
D dominio
Nombre DNS del dominio de destino
DO equipo
Nombre FQDN del controlador de dominio del dominio de origen con el que se conectará al migrar
DD equipo
Nombre FQDN del controlador de dominio del dominio de destino con el que se conectará al migrar
L ruta
Ruta de la carpeta en la que se crearán los ficheros de log, uno por cada OU. El nombre del fichero será la ruta en el directorio de la OU, quitando el nombre de dominio y sustituyendo la barra de división por tilde (~); por ejemplo “OU Contenedora~OU Contenida”
SID migrar_sids No
Si se pasa este modificador, se migrarán los SID de los objetos
OU unidad_organizativa No
Ruta de unidad organizativa, sin la parte de dominio, en la que se situarán los grupos migrados(ejemplo: “OU Contenedora/OU Contenida”). Si se omite, se intentarán migrar a una OU que tenga la misma ruta en el dominio de destino que la del dominio de origen; de existir fallará la migración
?   No
Muestra la ayuda en línea.

Ejemplos:

– Se migran los grupos del dominio acs-syc.local, contenidos en el fichero acssyc1801MigracionACSgrupos-migracion.lst, al dominio acs.syc.local. Para ello se conectará, en el dominio acs-syc.local, al controlador de dominio acscpd0104.acs-syc.local y, en el dominio acs.syc.local, al controlador de dominio acsscpd0102v.acs.syc.local. Se generará el fichero BAT acssyc1801MigracionACSadmt-grupos.bat, que incluirá una llamada alos ficheros SCV de inclusión que estarán en la carpeta acssyc1801MigracionACS. Los resultados de la migración serán guardados en ficheros Log en la carpeta acssyc1801MigracionACS. Los grupos se migrarán a las OU cuya ruta relativa es igual en el dominio de destino a las del dominio de origen:

cscript //nologo admt-grupos.vbs /F:acssyc1801MigracionACSgrupos-migracion.lst /B:acssyc1801MigracionACSadmt-grupos.bat /R:acssyc1801MigracionACS /O:acs-syc.local /D:acs.syc.local /DO:acscpd0104.acs-syc.local /DD:acsscpd0102v.acs.syc.local /L:acssyc1801MigracionACS

– Se migran los grupos del dominio acs-syc.local, contenidos en el fichero acssyc1801MigracionACSgrupos-migracion.lst, al dominio acs.syc.local. Para ello se conectará, en el dominio acs-syc.local, al controlador de dominio acscpd0104.acs-syc.local y, en el dominio acs.syc.local, al controlador de dominio acsscpd0102v.acs.syc.local. Se generará el fichero BAT acssyc1801MigracionACSadmt-grupos.bat, que incluirá una llamada alos ficheros SCV de inclusión que estarán en la carpeta acssyc1801MigracionACS. Los resultados de la migración serán guardados en ficheros Log en la carpeta acssyc1801MigracionACS. A los grupos se les quitará la cadena ” (ACS)” del nombre. Los grupos se migrarán a las OU cuya ruta relativa es igual en el dominio de destino a las del dominio de origen:

cscript //nologo admt-grupos.vbs /F:acssyc1801MigracionACSgrupos-migracion.lst /B:acssyc1801MigracionACSadmt-grupos.bat /R:acssyc1801MigracionACS /C:" (ACS)" /O:acs-syc.local /D:acs.syc.local /DO:acscpd0104.acs-syc.local /DD:acsscpd0102v.acs.syc.local /L:acssyc1801MigracionACS

– Se migran los grupos del dominio acs-syc.local, contenidos en el fichero acssyc1801MigracionACSgrupos-migracion.lst, al dominio acs.syc.local. Para ello se conectará, en el dominio acs-syc.local, al controlador de dominio acscpd0104.acs-syc.local y, en el dominio acs.syc.local, al controlador de dominio acsscpd0102v.acs.syc.local. Se generará el fichero BAT acssyc1801MigracionACSadmt-grupos.bat, que incluirá una llamada alos ficheros SCV de inclusión que estarán en la carpeta acssyc1801MigracionACS. Los resultados de la migración serán guardados en ficheros Log en la carpeta acssyc1801MigracionACS. A los grupos se les quitará la cadena ” (ACS)” del nombre. La migración incluirá los SIDs de los grupos migrados. Los grupos se migrarán a las OU cuya ruta relativa es igual en el dominio de destino a las del dominio de origen:

cscript //nologo admt-grupos.vbs /F:acssyc1801MigracionACSgrupos-migracion.lst /B:acssyc1801MigracionACSadmt-grupos.bat /R:acssyc1801MigracionACS /C:" (ACS)" /O:acs-syc.local /D:acs.syc.local /DO:acscpd0104.acs-syc.local /DD:acsscpd0102v.acs.syc.local /L:acssyc1801MigracionACS /SID

– Se migran los grupos del dominio acs-syc.local, contenidos en el fichero acssyc1801MigracionACSgrupos-migracion.lst, al dominio acs.syc.local. Para ello se conectará, en el dominio acs-syc.local, al controlador de dominio acscpd0104.acs-syc.local y, en el dominio acs.syc.local, al controlador de dominio acsscpd0102v.acs.syc.local. Se generará el fichero BAT acssyc1801MigracionACSadmt-grupos.bat, que incluirá una llamada alos ficheros SCV de inclusión que estarán en la carpeta acssyc1801MigracionACS. Los resultados de la migración serán guardados en ficheros Log en la carpeta acssyc1801MigracionACS. A los grupos se les quitará la cadena ” (ACS)” del nombre. La migración incluirá los SIDs de los grupos migrados. Los grupos migrados se situarán, en el dominio de destino, en la OU Cabecera/Vista:

cscript //nologo admt-grupos.vbs /F:acssyc1801MigracionACSgrupos-migracion.lst /B:acssyc1801MigracionACSadmt-grupos.bat /R:acssyc1801MigracionACS /C:" (ACS)" /O:acs-syc.local /D:acs.syc.local /DO:acscpd0104.acs-syc.local /DD:acsscpd0102v.acs.syc.local /L:acssyc1801MigracionACS /SID /OU:Cabecera/Vista

Este es el código del script

'*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
'*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°*
'* admt-grupos.vbs                                                     *
'*                                                                     *
'* Este script se encarga de generar un fichero BAT que, cuando se     *
'* ejecute, realizará la migración de los grupos contenidos en el      *
'* fichero recibido como parámetro /F. En ese BAT habrá una línea de   *
'* llamada a ADMT por cada OU que contenga alguno de los grupos. Se    *
'* pueden migrar también los SIDs de los grupos, lo que permitirá      *
'* acceder a los recursos del dominio de origen desde el de destino    *
'* gracias a tener en el SIDHistory del nuevo objeto el SID que tenía  *
'* en el dominio de origen. El script BAT deberá ser lanzado desde el  *
'* equipo que tiene instalado ADMT v3.0 y las rutas que se especifican *
'* en los comandos del BAT deberán existir en ese equipo (si es que    *
'* son rutas locales) a accesibles desde ese equipo por el usuario que *
'* lanza el script (rutas UNC)                                         *
'*                                                                     *
'* Sintaxis                                                            *
'*                                                                     *
'* cscript [//nologo] admt-grupos.vbs /F:fichero /B:fichero /R:ruta    *
'* /O:dominio /D:dominio /DO:equipo /DD:equipo /L:ruta [/C:cadena]     *
'* [/SID] [/OU:unidad_organizativa] [/?]                               *
'*                                                                     *
'* Siendo                                                              *
'*                                                                     *
'* - /F: fichero (Requerido):                                          *
'*         Fichero con los nombres distinguidos de los grupos que se   *
'*         desean migrar, uno por línea y ordenado por Ous             *
'*                                                                     *
'* - /B: fichero (Requerido):                                          *
'*         Ruta y nombre del fichero BAT que se generará con las       *
'*         líneas de llamada a ADMT para migrar los grupos de cada OU  *
'*                                                                     *
'* - /R: ruta (Requerido):                                             *
'*         Ruta de la carpeta en la que se crearán los ficheros CSV    *
'*         con los nombres de los grupos a migrar; se creará uno por   *
'*         cada OU que contenga algún grupo de los listados en el      *
'*         fichero especificado por el parámetro /F. El nombre del     *
'*         fichero será el nombre distinguido de la OU sustituyendo    *
'*         las comas por tildes (~) y extensión CSV                    *
'*                                                                     *
'* - /C: cadena (Opcional):                                            *
'*         Cadena que se debe quitar a los nombres de los grupos a     *
'*         migrar. Está destinada a quitar los " (CLECE)", " (ACS)" y  *
'*         " (SPL)" que agregamos en el script membresias.vbs con el   *
'*         que se generaron estos grupos y, en el dominio de destino,  *
'*         ya no son necesarios                                        *
'*                                                                     *
'* - /O: dominio (Requerido):                                          *
'*         Nombre DNS del dominio de origen                            *
'*                                                                     *
'* - /D: dominio (Requerido):                                          *
'*         Nombre DNS del dominio de destino                           *
'*                                                                     *
'* - /DO: equipo (Requerido):                                          *
'*         Nombre FQDN del controlador de dominio del dominio de       *
'*         origen con el que se conectará al migrar                    *
'*                                                                     *
'* - /DD: equipo (Requerido):                                          *
'*         Nombre FQDN del controlador de dominio del dominio de       *
'*         destino con el que se conectará al migrar                   *
'*                                                                     *
'* - /L: ruta (Requerido):                                             *
'*         Ruta de la carpeta en la que se crearán los ficheros de     *
'*         log, uno por cada OU. El nombre del fichero será la ruta en *
'*         el directorio de la OU, quitando el nombre de dominio y     *
'*         sustituyendo la barra de división por tilde (~); por        *
'*         ejemplo "OU Contenedora~OU Contenida"                       *
'*                                                                     *
'* - /SID: migrar_sids (Opcional):                                     *
'*         Si se pasa este modificador, se migrarán los SID de los     *
'*         objetos                                                     *
'*                                                                     *
'* - /OU: unidad_organizativa (Opcional):                              *
'*         Ruta de unidad organizativa, sin la parte de dominio, en la *
'*         que se situarán los grupos migrados(ejemplo: "OU            *
'*         Contenedora/OU Contenida"). Si se omite, se intentarán      *
'*         migrar a una OU que tenga la misma ruta en el dominio de    *
'*         destino que la del dominio de origen; de existir fallará la *
'*         migración                                                   *
'*                                                                     *
'* - /?: ayuda (Opcional):                                             *
'*         Muestra la ayuda en línea                                   *
'*                                                                     *
'*                                                                     *
'* Ejemplos:                                                           *
'*                                                                     *
'* - Se migran los grupos del  dominio acs-syc.local, contenidos en el *
'* fichero acssyc1801MigracionACSgrupos-migracion.lst, al dominio *
'* acs.syc.local. Para ello se conectará, en el dominio acs-syc.local, *
'* al controlador de dominio acscpd0104.acs-syc.local y, en el dominio *
'* acs.syc.local, al controlador de dominio                            *
'* acsscpd0102v.acs.syc.local. Se generará el fichero BAT              *
'* acssyc1801MigracionACSadmt-grupos.bat, que incluirá una        *
'* llamada alos ficheros SCV de inclusión que estarán en la carpeta    *
'* acssyc1801MigracionACS. Los resultados de la migración serán    *
'* guardados en ficheros Log en la carpeta acssyc1801MigracionACS. *
'* Los grupos se migrarán a las OU cuya ruta relativa es igual en el   *
'* dominio de destino a las del dominio de origen:                     *
'*                                                                     *
'* cscript //nologo admt-grupos.vbs                                    *
'* /F:acssyc1801MigracionACSgrupos-migracion.lst                  *
'* /B:acssyc1801MigracionACSadmt-grupos.bat                       *
'* /R:acssyc1801MigracionACS /O:acs-syc.local /D:acs.syc.local     *
'* /DO:acscpd0104.acs-syc.local /DD:acsscpd0102v.acs.syc.local         *
'* /L:acssyc1801MigracionACS                                       *
'*                                                                     *
'* - Se migran los grupos del  dominio acs-syc.local, contenidos en el *
'* fichero acssyc1801MigracionACSgrupos-migracion.lst, al dominio *
'* acs.syc.local. Para ello se conectará, en el dominio acs-syc.local, *
'* al controlador de dominio acscpd0104.acs-syc.local y, en el dominio *
'* acs.syc.local, al controlador de dominio                            *
'* acsscpd0102v.acs.syc.local. Se generará el fichero BAT              *
'* acssyc1801MigracionACSadmt-grupos.bat, que incluirá una        *
'* llamada alos ficheros SCV de inclusión que estarán en la carpeta    *
'* acssyc1801MigracionACS. Los resultados de la migración serán    *
'* guardados en ficheros Log en la carpeta acssyc1801MigracionACS. *
'* A los grupos se les quitará la cadena " (ACS)" del nombre. Los      *
'* grupos se migrarán a las OU cuya ruta relativa es igual en el       *
'* dominio de destino a las del dominio de origen:                     *
'*                                                                     *
'* cscript //nologo admt-grupos.vbs                                    *
'* /F:acssyc1801MigracionACSgrupos-migracion.lst                  *
'* /B:acssyc1801MigracionACSadmt-grupos.bat                       *
'* /R:acssyc1801MigracionACS /C:" (ACS)" /O:acs-syc.local          *
'* /D:acs.syc.local /DO:acscpd0104.acs-syc.local                       *
'* /DD:acsscpd0102v.acs.syc.local /L:acssyc1801MigracionACS        *
'*                                                                     *
'* - Se migran los grupos del  dominio acs-syc.local, contenidos en el *
'* fichero acssyc1801MigracionACSgrupos-migracion.lst, al dominio *
'* acs.syc.local. Para ello se conectará, en el dominio acs-syc.local, *
'* al controlador de dominio acscpd0104.acs-syc.local y, en el dominio *
'* acs.syc.local, al controlador de dominio                            *
'* acsscpd0102v.acs.syc.local. Se generará el fichero BAT              *
'* acssyc1801MigracionACSadmt-grupos.bat, que incluirá una        *
'* llamada alos ficheros SCV de inclusión que estarán en la carpeta    *
'* acssyc1801MigracionACS. Los resultados de la migración serán    *
'* guardados en ficheros Log en la carpeta acssyc1801MigracionACS. *
'* A los grupos se les quitará la cadena " (ACS)" del nombre. La       *
'* migración incluirá los SIDs de los grupos migrados. Los grupos se   *
'* migrarán a las OU cuya ruta relativa es igual en el dominio de      *
'* destino a las del dominio de origen:                                *
'*                                                                     *
'* cscript //nologo admt-grupos.vbs                                    *
'* /F:acssyc1801MigracionACSgrupos-migracion.lst                  *
'* /B:acssyc1801MigracionACSadmt-grupos.bat                       *
'* /R:acssyc1801MigracionACS /C:" (ACS)" /O:acs-syc.local          *
'* /D:acs.syc.local /DO:acscpd0104.acs-syc.local                       *
'* /DD:acsscpd0102v.acs.syc.local /L:acssyc1801MigracionACS /SID   *
'*                                                                     *
'* - Se migran los grupos del  dominio acs-syc.local, contenidos en el *
'* fichero acssyc1801MigracionACSgrupos-migracion.lst, al dominio *
'* acs.syc.local. Para ello se conectará, en el dominio acs-syc.local, *
'* al controlador de dominio acscpd0104.acs-syc.local y, en el dominio *
'* acs.syc.local, al controlador de dominio                            *
'* acsscpd0102v.acs.syc.local. Se generará el fichero BAT              *
'* acssyc1801MigracionACSadmt-grupos.bat, que incluirá una        *
'* llamada alos ficheros SCV de inclusión que estarán en la carpeta    *
'* acssyc1801MigracionACS. Los resultados de la migración serán    *
'* guardados en ficheros Log en la carpeta acssyc1801MigracionACS. *
'* A los grupos se les quitará la cadena " (ACS)" del nombre. La       *
'* migración incluirá los SIDs de los grupos migrados. Los grupos      *
'* migrados se situarán, en el dominio de destino, en la OU            *
'* Cabecera/Vista:                                                     *
'*                                                                     *
'* cscript //nologo admt-grupos.vbs                                    *
'* /F:acssyc1801MigracionACSgrupos-migracion.lst                  *
'* /B:acssyc1801MigracionACSadmt-grupos.bat                       *
'* /R:acssyc1801MigracionACS /C:" (ACS)" /O:acs-syc.local          *
'* /D:acs.syc.local /DO:acscpd0104.acs-syc.local                       *
'* /DD:acsscpd0102v.acs.syc.local /L:acssyc1801MigracionACS /SID   *
'* /OU:Cabecera/Vista                                                  *
'*                                                                     *
'*                                                                     *
'* © Fernando Reyes                                                    *
'* Julio De 2008                                                       *
'*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°*
'*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*

'Exigimos la declaración de variables
Option Explicit

Dim str_Error 'As String
Dim int_Error 'As String
Dim arr_Grupos 'As String
Dim str_Fichero 'As String
Dim str_BAT 'As String
Dim str_RutaCSV 'As String
Dim str_Quitar 'As String
Dim str_Origen 'As String
Dim str_Destino 'As String
Dim str_DcOrigen 'As String
Dim str_DcDestino 'As String
Dim str_RutaLog 'As String
Dim str_SID 'As String
Dim bol_OU 'As Boolean
Dim str_OUDestino

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

'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 un objeto FileSystemObject
Set obj_FS = CreateObject("Scripting.FileSystemObject")

str_BAT = "@ECHO OFF" & vbCrLf
str_BAT = str_BAT & _
          "REM --------------------------------------------" & _
          "--------" & vbCrLf
str_BAT = str_BAT & _
          "REM" & vbCrLf
str_BAT = str_BAT & _
          "REM Script Shell para lanzar la migración de los" & _
          " grupos " & vbCrLf
str_BAT = str_BAT & _
          "REM de " & str_Origen & " a " & str_Destino & _
          vbCrLf
str_BAT = str_BAT & _
          "REM Cada línea del script migra los grupos" & vbCrLf
str_BAT = str_BAT & _
          "REM perte" & _
          "necientes a determinada OU" & vbCrLf
str_BAT = str_BAT & _
          "REM especificada por el parámetro /SO" & vbCrLf
str_BAT = str_BAT & _
          "REM" & vbCrLf
str_BAT = str_BAT & _
          "REM Generado el " & _
               FormatDateTime(Now,vbShortDate) & " a las " & _
               FormatDateTime(Now,vbShortTime) & vbCrLf
str_BAT = str_BAT & _
          "REM" & vbCrLf
str_BAT = str_BAT & _
          "REM --------------------------------------------" & _
          "--------" & vbCrLf

Call s_GenMigracionGrupos(arr_Grupos, str_Quitar, str_Origen)

'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_BAT

'Cerramos el fichero de salida
obj_TS.Close

'Limpieza de popa :-)
Set obj_TS = Nothing
Set obj_FS = Nothing

Sub s_GenMigracionGrupos(arr_Grupos, str_Quitar, str_DNDominio)
'***********************************************************************
'* Procedimiento: s_GenMigracionGrupos                                 *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : 01/07/2008 16:04:54                                  *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Este método recibe el nombre de un fichero de texto  *
'*                que contiene los nombres distinguidos de los grupos  *
'*                que se quieren migrar. Los nombres están ordenados   *
'*                por contenedor y hay uno por línea. El fin es crear  *
'*                un fichero CSV para ser usado como fichero de        *
'*                inclusión por ADMT, con los nombres RDN de origen y  *
'*                destino, y añadir una línea al BAT para que sean     *
'*                migrados los grupos a los que hace referencia el     *
'*                fichero CSV. Recibe además una cadena que será       *
'*                quitada del nombre RDN de destino; esto para quitar  *
'*                los " (ACS)", " (CLECE)" y "(SPL) que se añadió a    *
'*                los grupos creados para poder migrar los grupos      *
'*                comunes a los tres dominios.                         *
'***********************************************************************

    Dim obj_TS
    Dim str_OU
    Dim str_Grupo

    'Obtenemos el nombre distinguido de la OU a la que pertenece el
    'primer grupo
    str_OU = f_OU(arr_Grupos(0))
    
    'Si no se ha especificado la OU de destino, esta será la misma
    'que la de origen, pero en el otro dominio
    If Not bol_OU Then _
           str_OUDestino = f_OUDNS(str_OU, _
                                 f_DomDNSaLDAP(str_Origen))
                                   
    'Creamos el fichero CSV que incluirá los grupos de esa OU en
    'concreto
    Set obj_TS = obj_FS.CreateTextFile(str_RutaCSV & _
                                  Replace(str_OU,",","~") & ".csv")
    
    'Escribimos el encabezado del fichero CSV
    obj_TS.WriteLine "SourceName,TargetRDN"
    
    For Each str_Grupo In arr_Grupos
    
        'Por si hubiera una línea en blanco en el fichero, nos
        'aseguramos de que será ignorada
        If Len(Trim(str_Grupo)) > 0 Then
        
            'Si la OU del grupo actual es distinta a la OU
            'que teníamos almacenada, debemos cerrar el fichero
            'CSV, y crear otro para volcar los grupos de la nueva
            'OU. Además, añadimos la línea de migración en el BAT
            'con el fichero de inclusión y la OU de origen.
            If UCase(str_OU) <> UCase(f_OU(str_Grupo)) Then
            
                'Cerramos el CSV
                obj_TS.Close
                Set obj_TS = Nothing
                
                'Agregamos la línea de migración en el BAT
                str_BAT = str_BAT & _
                          "@admt group /sd:" & str_Origen & _
                          " /td:" & str_Destino & _
                          " /sdc:" & str_DcOrigen & _
                          " /tdc:" & str_DcDestino & _
                          str_SID & _
                          "/so:""" & f_OUDNS(str_OU, _
                                   f_DomDNSaLDAP(str_Origen)) & _
                          """ /to:""" & str_OUDestino & """ " & _
                          "/f:""" & str_RutaCSV & _
                                Replace(str_OU,",","~") & _
                                ".csv"" " & _
                          "/co:merge > """ & _
                              str_RutaLog & Replace( _
                                       f_OUDNS(str_OU, _
                                               str_DNDominio), _
                                               "/","~") & ".log""" & _
                          vbCrLf                       
                
                'Almacenamos el nombre de la nueva OU
                str_OU = f_OU(str_Grupo)
                
                'Si no se ha especificado la OU de destino,
                'esta será la misma que la de origen, pero
                'en el otro dominio
                If Not bol_OU Then _
                       str_OUDestino = f_OUDNS(str_OU, _
                                 f_DomDNSaLDAP(str_Origen))
                'Creamos el nuevo archivo CSV para los grupos de la OU
                Set obj_TS = obj_FS.CreateTextFile(str_RutaCSV & _
                                      Replace(str_OU,",","~") & ".csv")
                                       
                'Ponemos el encabezado al fichero CSV
                obj_TS.WriteLine "SourceName,TargetRDN"
                
            End If
        
            'Escribimos en el fichero CSV el nombre RDN de origen y el
            'nombre RDN de destino. A los grupos que fueron creados a
            'partir de los comunes les quitaremos la cadena
            'identificadora en el destino (str_Quitar)
            obj_TS.WriteLine """" & f_RDN(str_Grupo) & """,""" & _
                             Replace(f_RDN(str_Grupo), _
                                     str_Quitar,"",1,-1,1) & """"
        
        End If
    
    Next
    
    'Cerramos el fichero CSV
    obj_TS.Close
    Set obj_TS = Nothing
    
    'Escribimos la línea en el BAT correspondiente a la última OU,
    'ya que no se pasó por el If donde se hacía esto dentro del
    'bucle
    str_BAT = str_BAT & _
              "@admt group /sd:" & str_Origen & _
              " /td:" & str_Destino & _
              " /sdc:" & str_DcOrigen & _
              " /tdc:" & str_DcDestino & _
              str_SID & _
              "/so:""" & f_OUDNS(str_OU, _
                       f_DomDNSaLDAP(str_Origen)) & _
              """ /to:""" & str_OUDestino & """ " & _
              "/f:""" & str_RutaCSV & _
                    Replace(str_OU,",","~") & _
                    ".csv"" " & _
              "/co:merge > """ & _
                  str_RutaLog & Replace( _
                           f_OUDNS(str_OU, _
                                   str_DNDominio), _
                                   "/","~") & ".log""" & _
              vbCrLf                       

End Sub 's_GenMigracionGrupos

Function f_RevisarArgumentos( _
                             str_Error, _
                             int_Error _
                             ) 'As Boolean
'***********************************************************************
'* Procedimiento: f_RevisarArgumentos                                  *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : 01/07/2008 15:43:16                                  *
'* 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
    Dim obj_FS 'As Scripting.FileSystemObject
    Dim obj_TS 'As Scripting.TextStream

    '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 
    '/F (fichero)
    If WScript.Arguments.Named.Exists("F") Then

        Set obj_FS = CreateObject("Scripting.FileSystemObject")
        Set obj_TS = obj_FS.OpenTextFile( _
             WScript.Arguments.Named("F"))

        arr_Grupos = _
            Split(obj_TS.ReadAll,vbCrLf)

        obj_TS.Close
        Set obj_TS = Nothing
        Set obj_FS = Nothing

    Else

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

    End If

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

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

    Else

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

    End If

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

        str_RutaCSV =  _
               WScript.Arguments.Named("R")
        If Not(Right(str_RutaCSV,1) = "")Then _
            str_RutaCSV = str_RutaCSV & ""

    Else

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

    End If

    'Revisamos que esté el argumento
    '/C (cadena)
    If WScript.Arguments.Named.Exists("C") Then

        str_Quitar =  _
               WScript.Arguments.Named("C")
               
    Else
    
        str_Quitar = ""

    End If

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

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

    Else

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

    End If

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

        str_Destino =  _
               WScript.Arguments.Named("D")

    Else

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

    End If

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

        str_DcOrigen =  _
               WScript.Arguments.Named("DO")

    Else

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

    End If

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

        str_DcDestino =  _
               WScript.Arguments.Named("DD")

    Else

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

    End If

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

        str_RutaLog =  _
               WScript.Arguments.Named("L")
               
        If Not (Right(str_RutaLog, 1) = "") Then _
                str_RutaLog = str_RutaLog & ""

    Else

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

    End If

    'Revisamos que esté el argumento
    '/SID (migrar_sids)
    If WScript.Arguments.Named.Exists("SID") Then

        str_SID = " /mss:yes "
        
    Else
    
        str_SID = ""

    End If
    
        'Revisamos que esté el argumento
    '/OU (unidad_organizativa)
    If WScript.Arguments.Named.Exists("OU") Then

        str_OUDestino =  _
               WScript.Arguments.Named("OU")
               
        bol_OU = True
        
    Else
    
        bol_OU = False

    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 : 01/07/2008 15:43:16                                  *
'* 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 se encarga de generar un fichero BAT " & _
                 "que, cuando se ejecute,"
    WScript.Echo "realizará la migración de los grupos contenidos e" & _
                 "n el fichero recibido como"
    WScript.Echo "parámetro /F. En ese BAT habrá una línea de llama" & _
                 "da a ADMT por cada OU que"
    WScript.Echo "contenga alguno de los grupos. Se pueden migrar t" & _
                 "ambién los SIDs de los grupos,"
    WScript.Echo "lo que permitirá acceder a los recursos del domin" & _
                 "io de origen desde el de"
    WScript.Echo "destino gracias a tener en el SIDHistory del nuev" & _
                 "o objeto el SID que tenía en"
    WScript.Echo "el dominio de origen."
    WScript.Echo ""
    WScript.Echo "Sintaxis"
    WScript.Echo ""
    WScript.Echo "cscript [//nologo] admt-grupos.vbs /F:fichero /B:" & _
                 "fichero /R:ruta /O:dominio"
    WScript.Echo "/D:dominio /DO:equipo /DD:equipo /L:ruta [/C:cade" & _
                 "na] [/SID] [/?]"
    WScript.Echo ""
    WScript.Echo "Siendo"
    WScript.Echo ""
    WScript.Echo "- /F: fichero (Requerido):"
    WScript.Echo "Fichero con los nombres distinguidos de los grupo" & _
                 "s que se"
    WScript.Echo "desean migrar, uno por línea y ordenado por Ous"
    WScript.Echo ""
    WScript.Echo "- /B: fichero (Requerido):"
    WScript.Echo "Ruta y nombre del fichero BAT que se generará con" & _
                 " las líneas de"
    WScript.Echo "llamada a ADMT para migrar los grupos de cada OU"
    WScript.Echo ""
    WScript.Echo "- /R: ruta (Requerido):"
    WScript.Echo "Ruta de la carpeta en la que se crearán los fiche" & _
                 "ros CSV con"
    WScript.Echo "los nombres de los grupos a migrar; se creará uno" & _
                 " por cada OU"
    WScript.Echo "que contenga algún grupo de los listados en el fi" & _
                 "chero"
    WScript.Echo "especificado por el parámetro /F. El nombre del f" & _
                 "ichero será el"
    WScript.Echo "nombre distinguido de la OU sustituyendo las coma" & _
                 "s por tildes"
    WScript.Echo "(~) y extensión CSV"
    WScript.Echo ""
    WScript.Echo "- /C: cadena (Opcional):"
    WScript.Echo "Cadena que se debe quitar a los nombres de los gr" & _
                 "upos a migrar."
    WScript.Echo "Está destinada a quitar los "" (CLECE)"", "" (ACS" & _
                 ")"" y "" (SPL)"" que"
    WScript.Echo "agregamos en el script membresias.vbs con el que " & _
                 "se generaron"
    WScript.Echo "estos grupos y, en el dominio de destino, ya no s" & _
                 "on necesarios"
    WScript.Echo ""
    WScript.Echo "- /O: dominio (Requerido):"
    WScript.Echo "Nombre DNS del dominio de origen"
    WScript.Echo ""
    WScript.Echo "- /D: dominio (Requerido):"
    WScript.Echo "Nombre DNS del dominio de destino"
    WScript.Echo ""
    WScript.Echo "- /DO: equipo (Requerido):"
    WScript.Echo "Nombre FQDN del controlador de dominio del domini" & _
                 "o de origen"
    WScript.Echo "con el que se conectará al migrar"
    WScript.Echo ""
    WScript.Echo "- /DD: equipo (Requerido):"
    WScript.Echo "Nombre FQDN del controlador de dominio del domini" & _
                 "o de destino"
    WScript.Echo "con el que se conectará al migrar"
    WScript.Echo ""
    WScript.Echo "- /L: ruta (Requerido):"
    WScript.Echo "Ruta de la carpeta en la que se crearán los fiche" & _
                 "ros de log,"
    WScript.Echo "uno por cada OU. El nombre del fichero será la ru" & _
                 "ta en el"
    WScript.Echo "directorio de la OU, quitando el nombre de dominio y"
    WScript.Echo "sustituyendo la barra de división por tilde (~); " & _
                 "por ejemplo"
    WScript.Echo """OU Contenedora~OU Contenida"""
    WScript.Echo ""
    WScript.Echo "- /SID: migrar_sids (Opcional):"
    WScript.Echo "Si se pasa este modificador, se migrarán los SID " & _
                 "de los objetos"
    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 "- Se migran los grupos del  dominio acs-syc.local" & _
                 ", contenidos en el fichero"
    WScript.Echo "acssyc1801MigracionACSgrupos-migracion.lst, " & _
                 "al dominio acs.syc.local. Para"
    WScript.Echo "ello se conectará, en el dominio acs-syc.local, a" & _
                 "l controlador de dominio"
    WScript.Echo "acscpd0104.acs-syc.local y, en el dominio acs.syc" & _
                 ".local, al controlador de"
    WScript.Echo "dominio acsscpd0102v.acs.syc.local. Se generará e" & _
                 "l fichero BAT"
    WScript.Echo "acssyc1801MigracionACSadmt-grupos.bat, que i" & _
                 "ncluirá una llamada alos"
    WScript.Echo "ficheros SCV de inclusión que estarán en la carpe" & _
                 "ta acssyc1801MigracionACS."
    WScript.Echo "Los resultados de la migración serán guardados en" & _
                 " ficheros Log en la carpeta"
    WScript.Echo "acssyc1801MigracionACS.:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo admt-grupos.vbs"
    WScript.Echo "/F:acssyc1801MigracionACSgrupos-migracion.lst"
    WScript.Echo "/B:acssyc1801MigracionACSadmt-grupos.bat /R:" & _
                 "acssyc1801MigracionACS"
    WScript.Echo "/O:acs-syc.local /D:acs.syc.local /DO:acscpd0104." & _
                 "acs-syc.local"
    WScript.Echo "/DD:acsscpd0102v.acs.syc.local /L:acssyc1801Mi" & _
                 "gracionACS"
    WScript.Echo ""
    WScript.Echo "- Se migran los grupos del  dominio acs-syc.local" & _
                 ", contenidos en el fichero"
    WScript.Echo "acssyc1801MigracionACSgrupos-migracion.lst, " & _
                 "al dominio acs.syc.local. Para"
    WScript.Echo "ello se conectará, en el dominio acs-syc.local, a" & _
                 "l controlador de dominio"
    WScript.Echo "acscpd0104.acs-syc.local y, en el dominio acs.syc" & _
                 ".local, al controlador de"
    WScript.Echo "dominio acsscpd0102v.acs.syc.local. Se generará e" & _
                 "l fichero BAT"
    WScript.Echo "acssyc1801MigracionACSadmt-grupos.bat, que i" & _
                 "ncluirá una llamada alos"
    WScript.Echo "ficheros SCV de inclusión que estarán en la carpe" & _
                 "ta acssyc1801MigracionACS."
    WScript.Echo "Los resultados de la migración serán guardados en" & _
                 " ficheros Log en la carpeta"
    WScript.Echo "acssyc1801MigracionACS. A los grupos se les q" & _
                 "uitará la cadena "" (ACS)"""
    WScript.Echo "del nombre:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo admt-grupos.vbs"
    WScript.Echo "/F:acssyc1801MigracionACSgrupos-migracion.lst"
    WScript.Echo "/B:acssyc1801MigracionACSadmt-grupos.bat /R:" & _
                 "acssyc1801MigracionACS"
    WScript.Echo "/C:"" (ACS)"" /O:acs-syc.local /D:acs.syc.local /" & _
                 "DO:acscpd0104.acs-syc.local"
    WScript.Echo "/DD:acsscpd0102v.acs.syc.local /L:acssyc1801Mi" & _
                 "gracionACS"
    WScript.Echo ""
    WScript.Echo "- Se migran los grupos del  dominio acs-syc.local" & _
                 ", contenidos en el fichero"
    WScript.Echo "acssyc1801MigracionACSgrupos-migracion.lst, " & _
                 "al dominio acs.syc.local. Para"
    WScript.Echo "ello se conectará, en el dominio acs-syc.local, a" & _
                 "l controlador de dominio"
    WScript.Echo "acscpd0104.acs-syc.local y, en el dominio acs.syc" & _
                 ".local, al controlador de"
    WScript.Echo "dominio acsscpd0102v.acs.syc.local. Se generará e" & _
                 "l fichero BAT"
    WScript.Echo "acssyc1801MigracionACSadmt-grupos.bat, que i" & _
                 "ncluirá una llamada alos"
    WScript.Echo "ficheros SCV de inclusión que estarán en la carpe" & _
                 "ta acssyc1801MigracionACS."
    WScript.Echo "Los resultados de la migración serán guardados en" & _
                 " ficheros Log en la carpeta"
    WScript.Echo "acssyc1801MigracionACS. A los grupos se les q" & _
                 "uitará la cadena "" (ACS)"""
    WScript.Echo "del nombre. La migración incluirá los SIDs de los" & _
                 " grupos migrados:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo admt-grupos.vbs"
    WScript.Echo "/F:acssyc1801MigracionACSgrupos-migracion.lst"
    WScript.Echo "/B:acssyc1801MigracionACSadmt-grupos.bat /R:" & _
                 "acssyc1801MigracionACS"
    WScript.Echo "/C:"" (ACS)"" /O:acs-syc.local /D:acs.syc.local /" & _
                 "DO:acscpd0104.acs-syc.local"
    WScript.Echo "/DD:acsscpd0102v.acs.syc.local /L:acssyc1801Mi" & _
                 "gracionACS /SID"
    WScript.Echo ""
    WScript.Echo ""
    WScript.Echo ""

End Sub 's_Ayuda

Function f_NTaDN(str_RutaNT, str_DN)
'***********************************************************************
'* 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              *
'*                ("dominionombre"), 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_DomDNSaLDAP(str_Dominio)
'***********************************************************************
'* Procedimiento: f_DomDNSaLDAP                                        *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : 01/07/2008 15:51:56                                  *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Esta función recibe un nombre de dominio FQDN        *
'*                (dominio.local) y devuelve su nombre distinguido     *
'*                (DC=dominio,DC=local)                                *
'***********************************************************************

    f_DomDNSaLDAP = "DC=" & _
                    Replace(str_Dominio, ".",",DC=", 1, -1, 1)    

End Function 'f_DomDNSaLDAP

Function f_OU(str_DN)
'***********************************************************************
'* Procedimiento: f_OU                                                 *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : 15/12/2008 12:08:59                                  *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Esta función recibe el nombre distinguido de un      *
'*                objeto y devuelve el nombre distinguido del          *
'*                contenedor que le aloja.                             *
'***********************************************************************

    Dim str_Temp
    Dim int_Posicion
    
    str_Temp = Replace(str_DN,",","~",1,-1,1)
    
    arr_Nombre = Split(str_Temp,",")
    str_Temp = ""
    
    For int_Posicion = (LBound(arr_Nombre) + 1) To UBound(arr_Nombre)
    
        str_Temp = str_Temp & arr_Nombre(int_Posicion) & ","
    
    Next
    
    str_Temp = Left(str_Temp,Len(str_Temp) - 1)
    
    f_OU = Replace(str_Temp,"~",",")

End Function 'f_OU    Dim arr_Nombre

Function f_RDN(str_DN)
'***********************************************************************
'* Procedimiento: f_RDN                                                *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : 15/12/2008 12:10:01                                  *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Esta función recibe el nombre distinguido de un      *
'*                objeto y devuelve el nombre relativo del mismo (RDN) *
'***********************************************************************

    Dim arr_Nombre
    Dim str_Temp
    Dim int_Posicion
    
    str_Temp = Replace(str_DN,",","~",1,-1,1)
    
    arr_Nombre = Split(str_Temp,",")
    
    f_RDN = Replace(arr_Nombre(0),"~",",")

End Function 'f_RDN

Function f_OUDNS(str_DN,str_DNDominio)
'***********************************************************************
'* Procedimiento: f_OUDNS                                              *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : 15/12/2008 12:17:58                                  *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Esta función recibe el nombre distinguido de un      *
'*                objeto y el nombre distinguido del dominio al que    *
'*                pertenece y devuelve el nombre del objeto en         *
'*                formato DNS. Es decir, si recibe como nombre         *
'*                distinguido de objeto "CN=Filemón                    *
'*                Pi,OU=Investigaciones,DC=tia,DC=org" y como nombre   *
'*                distinguido del dominio"DC=tia,DC=org" la función    *
'*                devuelve "Investigaciones/Filemón Pi".               *
'***********************************************************************

    Dim arr_Nombre       'As String Array
    Dim str_Devolucion   'As String
    Dim str_Temp         'As String
    
    'Quitamos la parte del nombre de dominio al nombre distiguido
    str_Temp = Left(str_DN, Len(str_DN) - (Len(str_DNDominio) + 1))
    
    'Sustituimos las posibles apariciones de comas litarales (por
    'ejemplo "Pi, Filemon", a las cuales se les quita el significado
    'con el caracter de slash inverso por una caracter de poco uso.
    'Esto nos permite luego llamar a split sin que se creen elementos
    'divididos
    str_Temp = Replace(str_Temp,",","~",1,-1,1)
    
    'Obtenemos el array de elementos del nombre distinguido
    arr_Nombre = Split(str_Temp,",")
    
    'Vaciamos la cadena temporal
    str_Temp = ""
    
    'Recorremos los elementos del array
    For Each str_Temp In arr_Nombre
    
        'Evitamos los elementos vacíos
        If Not Len(Trim(str_Temp)) = 0 Then
        
            'Concatenamos el elemento actual delante de los que ya
            'estuvieran en la devolución, quitando los tres primeros
            'caracteres, que corresponden con el identificador de tipo
            'de nombre ("CN=", "DC=", "OU=") 
            f_OUDNS = Replace(Right(str_Temp,Len(str_Temp)-3),"~",",",1,-1,1) & "/" & f_OUDNS
            
        End If
    
    Next 'str_Temp
    
    'Devolvemos el nombre DNS obtenido
    f_OUDNS = Left(f_OUDNS,Len(f_OUDNS)-1)

End Function 'f_OUDNS

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: