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 Establecer El Perfil De Terminal Services A Uno O Varios Usuarios De Active Directory

Posted by urpiano en Martes 3 \03\UTC marzo \03\UTC 2009

Este script permite establecer la ruta del perfil de Terminal Services a uno o más usuarios de Active Directory. El script recibe una determinada ruta y establece el perfil en una subcarpeta de la la ruta de nombre igual a atributo sAMAccoutName de cada usuario (el mismo efecto que cuando se establece \servidorcarpeta%USERNAME%).

Sintaxis

cscript [//nologo] cambiar-perfil-TS.vbs [/P:ruta_perfil] [/U:lista_usuarios] [/F:fichero_usuarios] [/C:contenedor] [/R] [/T:fichero_salida] [/E:excluidos] [/FE:fichero_excluidos] [/?]

Siendo

Etiqueta Dato ¿Requerido? Descripción
P ruta_perfil No
Ruta padre del perfil. El script establecerá como ruta del perfil una subcarpeta de esta ruta de nombre el atributo sAMAccoutName del usuario (el mismo reultado de establecer \servidorcarpeta%USERNAME%). Si se omite, se dejará en blanco la ruta del perfil de Terminal Services del usuario.
U lista_usuarios No
Lista, valores separados por comas, de usuarios a los que se establecerá la ruta del perfil de Terminal Service. Si no se pasa este argumento, ni el argumento /F, ni el argumento /C, se producirá un error, pues uno al menos debe ser pasado. Si se pasa más de uno de estos argumentos, prevalecerá uno de ellos según este orden: /F, /E y /C.
F fichero_usuarios No
Ruta y nombre de un fichero que contiene los nombres de los usuarios a los que se quiere cambiar la del perfil de Terminal Services, un nombre por línea. Si no se pasa este argumento, ni el argumento /F, ni el argumento /C, se producirá un error, pues uno al menos debe ser pasado. Si se pasa más de uno de estos argumentos, prevalecerá uno de ellos según este orden: /F, /E y /C.
C contenedor No
Ruta LDAP del contenedor en el que están las cuentas de usuario a las que establece la ruta del perfil de Terminal Services. Puede tratarse del dominio completo (DC=dominio,DC=local), del contenedor users (CN=Users,DC=dominio,DC=local), una OU (OU=Hobbits,DC=dominio,DC=Local), etc. Si se pasa el argumento /R, se hará en todo el el subárbol cuya raíz es la ruta pasada, si no, sólo en el propio contenedor. Si no se pasa este argumento, ni el argumento /F, ni el argumento /C, se producirá un error, pues uno al menos debe ser pasado. Si se pasa más de uno de estos argumentos, prevalecerá uno de ellos según este orden: /F, /E y /C.
R recursivo No
Cuando es pasado el argumento /C (contenedor), si se pasa este argumento, se establecerá la ruta del perfil de Terminal Services a todos los usuarios que estén en el subárbol que tiene como raíz el contenedor; si no se pasa el argumento /C, este argumento es ignorado.
T fichero_salida No
Ruta y nombre de un fichero de valores separados por tabulador (ideal para ser abierto con Excel) al que se volcará la salida con los resultados de la ejecución del script.
E excluidos No
Lista de usuarios, valores separados por comas, a los que no se cambiará la ruta del perfil de Terminal Service. Este argumento sólo se tiene en cuenta cuando se está procesando un contenedor (argumento /C). Si no se pasa este argumento, ni el argumento /FE, se procesarán todos los usuarios del contenedor establecido en /C; si se pasan ambos, se tendrá en cuenta sólo el argumento /FE.
FE fichero_excluidos No
Ruta y nombre de un fichero que contiene los nombres de los usuarios a los que se quiere excluir del establecimiento del perfil de Terminal Services, un nombre por línea. Este argumento sólo se tiene en cuenta cuando se está procesando un contenedor (argumento /C). Si no se pasa este argumento, ni el argumento /FE, se procesarán todos los usuarios del contenedor establecido en /C; si se pasan ambos, se tendrá en cuenta sólo el argumento /FE.
?   No
Muestra la ayuda en línea.

Ejemplos:

– Establecemos \s1-valleperfilesTS$ como raíz de los perfiles a los usuarios durin,snaug,bardo:

cscript //nologo cambiar-perfil-TS.vbs /P:\s1-valleperfilesTS$ /U:durin,snaug,bardo

– Establecemos \s1-valleperfilesTS$ como raíz de los perfiles a los usuarios listados en el fichero c:mordorTSperfiles.lst:

cscript //nologo cambiar-perfil-TS.vbs /P:\s1-valleperfilesTS$ /F:c:mordorTSperfiles.lst

– Establecemos \s1-valleperfilesTS$ como raíz de los perfiles a los usuarios contenidos en la OU “OU=Montaña Solitaria,DC=tierramedia,DC=local”:

cscript //nologo cambiar-perfil-TS.vbs /P:\s1-valleperfilesTS$ /C:"OU=Montaña Solitaria,DC=tierramedia,DC=local"

– Establecemos \s1-valleperfilesTS$ como raíz de los perfiles a los usuarios contenidos en la OU “OU=Montaña Solitaria,DC=tierramedia,DC=local”, y a todos los usuarios contenidos en subsiguientes OUs:

cscript //nologo cambiar-perfil-TS.vbs /P:\s1-valleperfilesTS$ /C:"OU=Montaña Solitaria,DC=tierramedia,DC=local" /R

– Establecemos \s1-valleperfilesTS$ como raíz de los perfiles a los usuarios contenidos en la OU “OU=Montaña Solitaria,DC=tierramedia,DC=local”, y a todos los usuarios contenidos en subsiguientes OUs; excluimos de la asignación de ruta de perfil de TS a los usuarios bilbo,balin:

cscript //nologo cambiar-perfil-TS.vbs /P:\s1-valleperfilesTS$ /C:"OU=Montaña Solitaria,DC=tierramedia,DC=local" /R /E:bilbo,balin

– Establecemos \s1-valleperfilesTS$ como raíz de los perfiles a los usuarios contenidos en la OU “OU=Montaña Solitaria,DC=tierramedia,DC=local”, y a todos los usuarios contenidos en subsiguientes OUs; excluimos de la asignación de ruta de perfil de TS a los usuarios listados en el fichero c:mordorTSexcluidos.lst:

cscript //nologo cambiar-perfil-TS.vbs /P:\s1-valleperfilesTS$ /C:"OU=Montaña Solitaria,DC=tierramedia,DC=local" /R /FE:c:mordorTSexcluidos.lst

– Dejamos en blanco la ruta del perfil de Terminal services a los usuarios contenidos en la OU “OU=Montaña Solitaria,DC=tierramedia,DC=local”, y a todos los usuarios contenidos en subsiguientes OUs; excluimos del borrado de la ruta de perfil de TS a los usuarios listados en el fichero c:mordorTSexcluidos.lst. Los resultados de la ejecución serán guardados en el archivo c:mordorlistadoscambiots.tsv:

cscript //nologo cambiar-perfil-TS.vbs /C:"OU=Montaña Solitaria,DC=tierramedia,DC=local" /R /T:c:mordorlistadoscambiots.tsv /FE:c:mordorTSexcluidos.lst

Este es el código del script

'*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
'*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°*
'* cambiar-perfil-TS.vbs                                               *
'*                                                                     *
'* Este script permite establecer la ruta del perfil de Terminal       *
'* Services a uno o más usuarios de Active Directory. El script recibe *
'* una determinada ruta y establece el perfil en una subcarpeta de la  *
'* la ruta de nombre igual a atributo sAMAccoutName de cada usuario    *
'* (el mismo efecto que cuando se establece                            *
'* \servidorcarpeta%USERNAME%).                                     *
'*                                                                     *
'* Sintaxis                                                            *
'*                                                                     *
'* cscript [//nologo] cambiar-perfil-TS.vbs [/P:ruta_perfil]           *
'* [/U:lista_usuarios] [/F:fichero_usuarios] [/C:contenedor] [/R]      *
'* [/T:fichero_salida] [/E:excluidos] [/FE:fichero_excluidos] [/?]     *
'*                                                                     *
'* Siendo                                                              *
'*                                                                     *
'* - /P: ruta_perfil (Opcional):                                       *
'*         Ruta padre del perfil. El script establecerá como ruta del  *
'*         perfil una subcarpeta de esta ruta de nombre el atributo    *
'*         sAMAccoutName del usuario (el mismo reultado de establecer  *
'*         \servidorcarpeta%USERNAME%). Si se omite, se dejará en   *
'*         blanco la ruta del perfil de Terminal Services del usuario. *
'*                                                                     *
'* - /U: lista_usuarios (Opcional):                                    *
'*         Lista, valores separados por comas, de usuarios a los que   *
'*         se establecerá la ruta del perfil de Terminal Service. Si   *
'*         no se pasa este argumento, ni el argumento /F, ni el        *
'*         argumento /C, se producirá un error, pues uno al menos debe *
'*         ser pasado. Si se pasa más de uno de estos argumentos,      *
'*         prevalecerá uno de ellos según este orden: /F, /E y /C.     *
'*                                                                     *
'* - /F: fichero_usuarios (Opcional):                                  *
'*         Ruta y nombre de un fichero que contiene los nombres de los *
'*         usuarios a los que se quiere cambiar la del perfil de       *
'*         Terminal Services, un nombre por línea. Si no se pasa este  *
'*         argumento, ni el argumento /F, ni el argumento /C, se       *
'*         producirá un error, pues uno al menos debe ser pasado. Si   *
'*         se pasa más de uno de estos argumentos, prevalecerá uno de  *
'*         ellos según este orden: /F, /E y /C.                        *
'*                                                                     *
'* - /C: contenedor (Opcional):                                        *
'*         Ruta LDAP del contenedor en el que están las cuentas de     *
'*         usuario a las que establece la ruta del perfil de Terminal  *
'*         Services. Puede tratarse del dominio completo               *
'*         (DC=dominio,DC=local), del contenedor users                 *
'*         (CN=Users,DC=dominio,DC=local), una OU                      *
'*         (OU=Hobbits,DC=dominio,DC=Local), etc. Si se pasa el        *
'*         argumento /R, se hará en todo el el subárbol cuya raíz es   *
'*         la ruta pasada, si no, sólo en el propio contenedor. Si no  *
'*         se pasa este argumento, ni el argumento /F, ni el argumento *
'*         /C, se producirá un error, pues uno al menos debe ser       *
'*         pasado. Si se pasa más de uno de estos argumentos,          *
'*         prevalecerá uno de ellos según este orden: /F, /E y /C.     *
'*                                                                     *
'* - /R: recursivo (Opcional):                                         *
'*         Cuando es pasado el argumento /C (contenedor), si se pasa   *
'*         este argumento, se establecerá la ruta del perfil de        *
'*         Terminal Services a todos los usuarios que estén en el      *
'*         subárbol que tiene como raíz el contenedor; si no se pasa   *
'*         el argumento /C, este argumento es ignorado.                *
'*                                                                     *
'* - /T: fichero_salida (Opcional):                                    *
'*         Ruta y nombre de un fichero de valores separados por        *
'*         tabulador (ideal para ser abierto con Excel) al que se      *
'*         volcará la salida con los resultados de la ejecución del    *
'*         script.                                                     *
'*                                                                     *
'* - /E: excluidos (Opcional):                                         *
'*         Lista de usuarios, valores separados por comas, a los que   *
'*         no se cambiará la ruta del perfil de Terminal Service. Este *
'*         argumento sólo se tiene en cuenta cuando se está procesando *
'*         un contenedor (argumento /C). Si no se pasa este argumento, *
'*         ni el argumento /FE, se procesarán todos los usuarios del   *
'*         contenedor establecido en /C; si se pasan ambos, se tendrá  *
'*         en cuenta sólo el argumento /FE.                            *
'*                                                                     *
'* - /FE: fichero_excluidos (Opcional):                                *
'*         Ruta y nombre de un fichero que contiene los nombres de los *
'*         usuarios a los que se quiere excluir del establecimiento    *
'*         del perfil de Terminal Services, un nombre por línea. Este  *
'*         argumento sólo se tiene en cuenta cuando se está procesando *
'*         un contenedor (argumento /C). Si no se pasa este argumento, *
'*         ni el argumento /FE, se procesarán todos los usuarios del   *
'*         contenedor establecido en /C; si se pasan ambos, se tendrá  *
'*         en cuenta sólo el argumento /FE.                            *
'*                                                                     *
'*                                                                     *
'* Ejemplos:                                                           *
'*                                                                     *
'* - Establecemos \s1-valleperfilesTS$ como raíz de los perfiles a   *
'* los usuarios durin,snaug,bardo:                                     *
'*                                                                     *
'* cscript //nologo cambiar-perfil-TS.vbs /P:\s1-valleperfilesTS$    *
'* /U:durin,snaug,bardo                                                *
'*                                                                     *
'* - Establecemos \s1-valleperfilesTS$ como raíz de los perfiles a   *
'* los usuarios listados en el fichero c:mordorTSperfiles.lst:      *
'*                                                                     *
'* cscript //nologo cambiar-perfil-TS.vbs /P:\s1-valleperfilesTS$    *
'* /F:c:mordorTSperfiles.lst                                        *
'*                                                                     *
'* - Establecemos \s1-valleperfilesTS$ como raíz de los perfiles a   *
'* los usuarios contenidos en la OU "OU=Montaña                        *
'* Solitaria,DC=tierramedia,DC=local":                                 *
'*                                                                     *
'* cscript //nologo cambiar-perfil-TS.vbs /P:\s1-valleperfilesTS$    *
'* /C:"OU=Montaña Solitaria,DC=tierramedia,DC=local"                   *
'*                                                                     *
'* - Establecemos \s1-valleperfilesTS$ como raíz de los perfiles a   *
'* los usuarios contenidos en la OU "OU=Montaña                        *
'* Solitaria,DC=tierramedia,DC=local", y a todos los usuarios          *
'* contenidos en subsiguientes OUs:                                    *
'*                                                                     *
'* cscript //nologo cambiar-perfil-TS.vbs /P:\s1-valleperfilesTS$    *
'* /C:"OU=Montaña Solitaria,DC=tierramedia,DC=local" /R                *
'*                                                                     *
'* - Establecemos \s1-valleperfilesTS$ como raíz de los perfiles a   *
'* los usuarios contenidos en la OU "OU=Montaña                        *
'* Solitaria,DC=tierramedia,DC=local", y a todos los usuarios          *
'* contenidos en subsiguientes OUs; excluimos de la asignación de ruta *
'* de perfil de TS a los usuarios bilbo,balin:                         *
'*                                                                     *
'* cscript //nologo cambiar-perfil-TS.vbs /P:\s1-valleperfilesTS$    *
'* /C:"OU=Montaña Solitaria,DC=tierramedia,DC=local" /R /E:bilbo,balin *
'*                                                                     *
'* - Establecemos \s1-valleperfilesTS$ como raíz de los perfiles a   *
'* los usuarios contenidos en la OU "OU=Montaña                        *
'* Solitaria,DC=tierramedia,DC=local", y a todos los usuarios          *
'* contenidos en subsiguientes OUs; excluimos de la asignación de ruta *
'* de perfil de TS a los usuarios listados en el fichero               *
'* c:mordorTSexcluidos.lst:                                         *
'*                                                                     *
'* cscript //nologo cambiar-perfil-TS.vbs /P:\s1-valleperfilesTS$    *
'* /C:"OU=Montaña Solitaria,DC=tierramedia,DC=local" /R                *
'* /FE:c:mordorTSexcluidos.lst                                      *
'*                                                                     *
'* - Dejamos en blanco la ruta del perfil de Terminal services a los   *
'* usuarios contenidos en la OU "OU=Montaña                            *
'* Solitaria,DC=tierramedia,DC=local", y a todos los usuarios          *
'* contenidos en subsiguientes OUs; excluimos del borrado de la ruta   *
'* de perfil de TS a los usuarios listados en el fichero               *
'* c:mordorTSexcluidos.lst. Los resultados de la ejecución serán    *
'* guardados en el archivo c:mordorlistadoscambiots.tsv:            *
'*                                                                     *
'* cscript //nologo cambiar-perfil-TS.vbs /C:"OU=Montaña               *
'* Solitaria,DC=tierramedia,DC=local" /R                               *
'* /T:c:mordorlistadoscambiots.tsv /FE:c:mordorTSexcluidos.lst   *
'*                                                                     *
'*                                                                     *
'*                                                                     *
'*                                                                     *
'* © Fernando Reyes                                                    *
'* Noviembre De 2008                                                   *
'*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°*
'*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*

'Exigimos la declaración de variables
Option Explicit


Dim str_Error 'As String
Dim int_Error 'As String
Dim str_Ruta 'As String
Dim str_RutaPerfil 'As String
Dim arr_Usuarios 'As String
Dim arr_DN 'As String
Dim bol_Recursivo 'As Boolean
Dim str_FicheroSalida 'As String
Dim str_TSV 'As String
Dim arr_Excluidos 'As String
Dim int_Usuario 'As Integer
Dim obj_Usuario 'As Object
Dim obj_UsuarioLDAP 'As Object
Dim str_Mensaje 'As String
Dim int_Posicion 'As Integer

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

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

'Iniciamos la salida con los encabezados
str_Mensaje = "Usuario" & vbTab & _
              "distinghisedName" & vbTab & _
              "Ruta Perfil TS Antigua" & _
              "Ruta Perfil TS Nueva" & vbCrLf

'Almacenamos los encabezados en el texto de salida al fichero
str_TSV = str_Mensaje

'Subrayamos los encabezados en la salida por pantalla
str_Mensaje = str_Mensaje & _
              "=======" & vbTab & _
              "=====================" & vbTab & _
              "==================="
                            
'Mostramos los encabezados por pantalla
WScript.Echo str_Mensaje

'Vaciamos la variable de mensaje
str_Mensaje = ""
              
'En este bucle recorremos uno a uno los diferentes usuarios
For int_Usuario = LBound(arr_Usuarios) To UBound(arr_Usuarios)

    'Si se ha recibido una ruta...
    If Len(Trim(str_Ruta)) > 0 Then
    
        'Agregamos el nombre de usuario a la ruta
        'Debemos tener en cuenta si trae el nombre de dominio
        'consigo o no. Para ello buscamos el slash inverso
        'con InStr
        int_Posicion = InStr(1,arr_Usuarios(int_Usuario),"")
        
        'Si la devolucion de InStr es mayor que cero, significa
        'que int_Posicion tiene la posición del slash inverso
        'contando caracter a caracter desde la izquierda
        If int_Posicion > 0 Then
        
            'Para montar la ruta, unimos el nombre del usuario
            'quitando el dominio
            str_RutaPerfil = str_Ruta & Right( _
                                    arr_Usuarios(int_Usuario), _
                                    Len(arr_Usuarios(int_Usuario)) _
                                                - int_Posicion)
            
        'El slash inverso no estaba presente en el nombre de
        'usuario, con lo que lo agregamos a la ruta sin más
        Else
        
            str_RutaPerfil = str_Ruta & arr_Usuarios(int_Usuario)
            
        End If
        
    'Si no se ha recibido ruta...
    Else
    
        'Establecemos la ruta como cadena vacía
        str_RutaPerfil = ""
        
    End If
    
    'Si no existe el nombre distinguido del usuario, significa
    'que el usuario no existe en el directorio, por ello sólo
    'procesaremos usuarios que sí existan
    If Len(Trim(arr_DN(int_Usuario))) > 0 Then
        
        'Obtenemos el objeto IAdsUser con el proveedor LDAP
        Set obj_UsuarioLDAP = GetObject("LDAP://" & _
                                            arr_DN(int_Usuario))
        
        'Volcamos el nombre del usuario, su nombre distinguido
        'y la ruta al perfil de Terminal Services que tiene
        str_Mensaje = _
          arr_Usuarios(int_Usuario) & vbTab & _
          arr_DN(int_Usuario) & vbTab & _
          f_IIf(Len(Trim( _
                  obj_UsuarioLDAP.TerminalServicesProfilePath))=0, _
                "(Ninguna)", _
                obj_UsuarioLDAP.TerminalServicesProfilePath) & vbTab
        
        'Establecemos la nueva ruta
        obj_UsuarioLDAP.TerminalServicesProfilePath = str_RutaPerfil
        
        'Guardamos la información
        obj_UsuarioLDAP.SetInfo
                
        'Limpieza de popa :-)
        Set obj_UsuarioLDAP = Nothing
        
        'Almacenamos en el mensaje la nueva ruta
        str_Mensaje = str_Mensaje & f_IIf( _
                            Len(Trim(str_RutaPerfil))=0, _
                                "(Ninguna)", _
                                str_RutaPerfil)
    
        'Guardamos en la salida a fichero el mensaje
        str_TSV = str_TSV & str_Mensaje & vbCrLf
        
        'Mostramos el mensaje
        WScript.Echo str_Mensaje
        
        'Vaciamos el mensaje
        str_Mensaje = ""
    
    'El usuario no tiene nombre distinguido y por tanto no existe.
    'Agregamos el control de que sí haya pasado un nombre para evitar
    'líneas vacías   
    ElseIf Len(Trim(arr_Usuarios(int_Usuario))) > 0 Then
    
        'Lo ponemos en el mensaje
        str_Mensaje = arr_usuarios(int_Usuario) & vbTab & _
                      "No exite en el directorio" & vbTab & _
                      "(Ninguna)" & vbTab & _
                      "(Ninguna)"
    
        'Guardamos en la salida a fichero el mensaje
        str_TSV = str_TSV & str_Mensaje & vbCrLf
        
        'Mostramos el mensaje
        WScript.Echo str_Mensaje
        
        'Vaciamos el mensaje
        str_Mensaje = ""
        
    End If
    
Next 'int_Usuario


'Si hay que volcar información en el fichero
'de salida de ruta y nombre str_FicheroSalida
If Len(str_FicheroSalida) > 0 Then

    'Creamos un objeto FileSystemObject
    Set obj_FS = CreateObject("Scripting.FileSystemObject")

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

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

    'Cerramos el fichero de salida
    obj_TS.Close

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

End If

Function f_RevisarArgumentos( _
                             str_Error, _
                             int_Error _
                             ) 'As Boolean
'***********************************************************************
'* Procedimiento: f_RevisarArgumentos                                  *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : 02/08/2007 17:57:40                                  *
'* 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
    Dim bol_Excluidos '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
    '/P (ruta_perfil)
    If WScript.Arguments.Named.Exists("P") Then

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

    End If

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

        str_FicheroSalida =  _
               WScript.Arguments.Named("T")

    End If

    'Revisamos si ha sido pasado el argumento
    '/F (fichero_usuarios)
    If WScript.Arguments.Named.Exists("F") Then

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

        'Cargamos los usuarios en el array
        arr_Usuarios = Split( _
                obj_TS.ReadAll,vbCrLf)
                
        'Llamamos al procedimiento que carga el array
        'con los nombres distinguidos de los usuarios
        Call s_CargarDNs
                
    'Revisamos si ha sido pasado el argumento
    '/U (lista_usuarios)
    Elseif WScript.Arguments.Named.Exists("U") Then

        'Cargamos los usuarios en el array
        arr_Usuarios = _
                Split(WScript.Arguments.Named("U"),",")
                
        'Llamamos al procedimiento que carga el array
        'con los nombres distinguidos de los usuarios
        Call s_CargarDNs

    'Revisamos si ha sido pasado el argumento
    '/C (contenedor)
    Elseif WScript.Arguments.Named.Exists("C") Then

        'Revisamos que esté el argumento
        '/R (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)
                     
            obj_TS.Close
            
            Set obj_TS = Nothing
            Set obj_FS = Nothing
                     
            bol_Excluidos = True

        'Revisamos si ha sido pasado el argumento
        '/E (excluidos)
        Elseif WScript.Arguments.Named.Exists("E") Then

            arr_Excluidos = _
                     Split(WScript.Arguments.Named("E"),",")

            bol_Excluidos = True

        End If

        'Cargamos el array de usuarios
        Call s_CargarObjetosADEnArray(_
                        arr_Usuarios, _
                        WScript.Arguments.Named("C"), _
                        "(&(objectCategory=person)" & _
                                "(objectClass=user))", _
                        "sAMAccountName", _
                        bol_Excluidos)
                

    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""" & _
                    ", ""/U""" & _
                    " y ""/C""" & 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))
    '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 : 03/08/2007 18:48:18                                  *
'* 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 establecer la ruta del perfil" & _
                 " de Terminal Services a uno o"
    WScript.Echo "más usuarios de Active Directory. El script recib" & _
                 "e una determinada ruta y"
    WScript.Echo "establece el perfil en una subcarpeta de la la ru" & _
                 "ta de nombre igual a atributo"
    WScript.Echo "sAMAccoutName de cada usuario (el mismo efecto qu" & _
                 "e cuando se establece"
    WScript.Echo "\servidorcarpeta%USERNAME%)."
    WScript.Echo ""
    WScript.Echo "Sintaxis"
    WScript.Echo ""
    WScript.Echo "cscript [//nologo] cambiar-perfil-TS.vbs [/P:ruta" & _
                 "_perfil] [/U:lista_usuarios]"
    WScript.Echo "[/F:fichero_usuarios] [/C:contenedor] [/R] [/T:fi" & _
                 "chero_salida] [/E:excluidos]"
    WScript.Echo "[/FE:fichero_excluidos] [/?]"
    WScript.Echo ""
    WScript.Echo "Siendo"
    WScript.Echo ""
    WScript.Echo "- /P: ruta_perfil (Opcional):"
    WScript.Echo "Ruta padre del perfil. El script establecerá como" & _
                 " ruta del"
    WScript.Echo "perfil una subcarpeta de esta ruta de nombre el a" & _
                 "tributo"
    WScript.Echo "sAMAccoutName del usuario (el mismo reultado de e" & _
                 "stablecer"
    WScript.Echo "\servidorcarpeta%USERNAME%). Si se omite, se d" & _
                 "ejará en"
    WScript.Echo "blanco la ruta del perfil de Terminal Services de" & _
                 "l usuario."
    WScript.Echo ""
    WScript.Echo "- /U: lista_usuarios (Opcional):"
    WScript.Echo "Lista, valores separados por comas, de usuarios a" & _
                 " los que se"
    WScript.Echo "establecerá la ruta del perfil de Terminal Servic" & _
                 "e. Si no se"
    WScript.Echo "pasa este argumento, ni el argumento /F, ni el ar" & _
                 "gumento /C, se"
    WScript.Echo "producirá un error, pues uno al menos debe ser pa" & _
                 "sado. Si se"
    WScript.Echo "pasa más de uno de estos argumentos, prevalecerá " & _
                 "uno de ellos"
    WScript.Echo "según este orden: /F, /E y /C."
    WScript.Echo ""
    WScript.Echo "- /F: fichero_usuarios (Opcional):"
    WScript.Echo "Ruta y nombre de un fichero que contiene los nomb" & _
                 "res de los"
    WScript.Echo "usuarios a los que se quiere cambiar la del perfi" & _
                 "l de Terminal"
    WScript.Echo "Services, un nombre por línea. Si no se pasa este" & _
                 " argumento, ni"
    WScript.Echo "el argumento /F, ni el argumento /C, se producirá" & _
                 " un error,"
    WScript.Echo "pues uno al menos debe ser pasado. Si se pasa más" & _
                 " de uno de"
    WScript.Echo "estos argumentos, prevalecerá uno de ellos según " & _
                 "este orden:"
    WScript.Echo "/F, /E y /C."
    WScript.Echo ""
    WScript.Echo "- /C: contenedor (Opcional):"
    WScript.Echo "Ruta LDAP del contenedor en el que están las cuen" & _
                 "tas de usuario"
    WScript.Echo "a las que establece la ruta del perfil de Termina" & _
                 "l Services."
    WScript.Echo "Puede tratarse del dominio completo (DC=dominio,D" & _
                 "C=local), del"
    WScript.Echo "contenedor users (CN=Users,DC=dominio,DC=local), " & _
                 "una OU"
    WScript.Echo "(OU=Hobbits,DC=dominio,DC=Local), etc. Si se pasa" & _
                 " el argumento"
    WScript.Echo "/R, se hará en todo el el subárbol cuya raíz es l" & _
                 "a ruta pasada,"
    WScript.Echo "si no, sólo en el propio contenedor. Si no se pas" & _
                 "a este"
    WScript.Echo "argumento, ni el argumento /F, ni el argumento /C" & _
                 ", se producirá"
    WScript.Echo "un error, pues uno al menos debe ser pasado. Si s" & _
                 "e pasa más de"
    WScript.Echo "uno de estos argumentos, prevalecerá uno de ellos" & _
                 " según este"
    WScript.Echo "orden: /F, /E y /C."
    WScript.Echo ""
    WScript.Echo "- /R: recursivo (Opcional):"
    WScript.Echo "Cuando es pasado el argumento /C (contenedor), si" & _
                 " se pasa este"
    WScript.Echo "argumento, se establecerá la ruta del perfil de T" & _
                 "erminal"
    WScript.Echo "Services a todos los usuarios que estén en el sub" & _
                 "árbol que"
    WScript.Echo "tiene como raíz el contenedor; si no se pasa el a" & _
                 "rgumento /C,"
    WScript.Echo "este argumento es ignorado."
    WScript.Echo ""
    WScript.Echo "- /T: fichero_salida (Opcional):"
    WScript.Echo "Ruta y nombre de un fichero de valores separados " & _
                 "por tabulador"
    WScript.Echo "(ideal para ser abierto con Excel) al que se volc" & _
                 "ará la salida"
    WScript.Echo "con los resultados de la ejecución del script."
    WScript.Echo ""
    WScript.Echo "- /E: excluidos (Opcional):"
    WScript.Echo "Lista de usuarios, valores separados por comas, a" & _
                 " los que no se"
    WScript.Echo "cambiará la ruta del perfil de Terminal Service. " & _
                 "Este argumento"
    WScript.Echo "sólo se tiene en cuenta cuando se está procesando" & _
                 " un contenedor"
    WScript.Echo "(argumento /C). Si no se pasa este argumento, ni " & _
                 "el argumento"

    WScript.Echo "/FE, se procesarán todos los usuarios del contenedor"
    WScript.Echo "establecido en /C; si se pasan ambos, se tendrá e" & _
                 "n cuenta sólo"
    WScript.Echo "el argumento /FE."
    WScript.Echo ""
    WScript.Echo "- /FE: fichero_excluidos (Opcional):"
    WScript.Echo "Ruta y nombre de un fichero que contiene los nomb" & _
                 "res de los"
    WScript.Echo "usuarios a los que se quiere excluir del establec" & _
                 "imiento del"
    WScript.Echo "perfil de Terminal Services, un nombre por línea." & _
                 " Este"
    WScript.Echo "argumento sólo se tiene en cuenta cuando se está " & _
                 "procesando un"
    WScript.Echo "contenedor (argumento /C). Si no se pasa este arg" & _
                 "umento, ni el"
    WScript.Echo "argumento /FE, se procesarán todos los usuarios d" & _
                 "el contenedor"
    WScript.Echo "establecido en /C; si se pasan ambos, se tendrá e" & _
                 "n cuenta sólo"
    WScript.Echo "el argumento /FE."
    WScript.Echo ""
    WScript.Echo ""
    WScript.Echo "Ejemplos:"
    WScript.Echo ""
    WScript.Echo "- Establecemos \s1-valleperfilesTS$ como raíz d" & _
                 "e los perfiles a los usuarios"
    WScript.Echo "durin,snaug,bardo:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo cambiar-perfil-TS.vbs /P:\s1-va" & _
                 "lleperfilesTS$"
    WScript.Echo "/U:durin,snaug,bardo"
    WScript.Echo ""
    WScript.Echo "- Establecemos \s1-valleperfilesTS$ como raíz d" & _
                 "e los perfiles a los usuarios"
    WScript.Echo "listados en el fichero c:mordorTSperfiles.lst:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo cambiar-perfil-TS.vbs /P:\s1-va" & _
                 "lleperfilesTS$"
    WScript.Echo "/F:c:mordorTSperfiles.lst"
    WScript.Echo ""
    WScript.Echo "- Establecemos \s1-valleperfilesTS$ como raíz d" & _
                 "e los perfiles a los usuarios"
    WScript.Echo "contenidos en la OU ""OU=Montaña Solitaria,DC=tie" & _
                 "rramedia,DC=local"":"
    WScript.Echo ""
    WScript.Echo "cscript //nologo cambiar-perfil-TS.vbs /P:\s1-va" & _
                 "lleperfilesTS$ /C:""OU=Montaña"
    WScript.Echo "Solitaria,DC=tierramedia,DC=local"""
    WScript.Echo ""
    WScript.Echo "- Establecemos \s1-valleperfilesTS$ como raíz d" & _
                 "e los perfiles a los usuarios"
    WScript.Echo "contenidos en la OU ""OU=Montaña Solitaria,DC=tie" & _
                 "rramedia,DC=local"", y a todos"
    WScript.Echo "los usuarios contenidos en subsiguientes OUs:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo cambiar-perfil-TS.vbs /P:\s1-va" & _
                 "lleperfilesTS$ /C:""OU=Montaña"
    WScript.Echo "Solitaria,DC=tierramedia,DC=local"" /R"
    WScript.Echo ""
    WScript.Echo "- Establecemos \s1-valleperfilesTS$ como raíz d" & _
                 "e los perfiles a los usuarios"
    WScript.Echo "contenidos en la OU ""OU=Montaña Solitaria,DC=tie" & _
                 "rramedia,DC=local"", y a todos"
    WScript.Echo "los usuarios contenidos en subsiguientes OUs; exc" & _
                 "luimos de la asignación de"
    WScript.Echo "ruta de perfil de TS a los usuarios bilbo,balin:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo cambiar-perfil-TS.vbs /P:\s1-va" & _
                 "lleperfilesTS$ /C:""OU=Montaña"
    WScript.Echo "Solitaria,DC=tierramedia,DC=local"" /R /E:bilbo,balin"
    WScript.Echo ""
    WScript.Echo "- Establecemos \s1-valleperfilesTS$ como raíz d" & _
                 "e los perfiles a los usuarios"
    WScript.Echo "contenidos en la OU ""OU=Montaña Solitaria,DC=tie" & _
                 "rramedia,DC=local"", y a todos"
    WScript.Echo "los usuarios contenidos en subsiguientes OUs; exc" & _
                 "luimos de la asignación de"
    WScript.Echo "ruta de perfil de TS a los usuarios listados en e" & _
                 "l fichero"
    WScript.Echo "c:mordorTSexcluidos.lst:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo cambiar-perfil-TS.vbs /P:\s1-va" & _
                 "lleperfilesTS$ /C:""OU=Montaña"
    WScript.Echo "Solitaria,DC=tierramedia,DC=local"" /R /FE:c:mor" & _
                 "dorTSexcluidos.lst"
    WScript.Echo ""
    WScript.Echo "- Dejamos en blanco la ruta del perfil de Termina" & _
                 "l services a los usuarios"
    WScript.Echo "contenidos en la OU ""OU=Montaña Solitaria,DC=tie" & _
                 "rramedia,DC=local"", y a todos"
    WScript.Echo "los usuarios contenidos en subsiguientes OUs; exc" & _
                 "luimos del borrado de la ruta"
    WScript.Echo "de perfil de TS a los usuarios listados en el fichero"
    WScript.Echo "c:mordorTSexcluidos.lst. Los resultados de la " & _
                 "ejecución serán guardados en"
    WScript.Echo "el archivo c:mordorlistadoscambiots.tsv:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo cambiar-perfil-TS.vbs /C:""OU=Mo" & _
                 "ntaña"
    WScript.Echo "Solitaria,DC=tierramedia,DC=local"" /R /T:c:mord" & _
                 "orlistadoscambiots.tsv"
    WScript.Echo "/FE:c:mordorTSexcluidos.lst"
    WScript.Echo ""
    WScript.Echo ""
    WScript.Echo ""

End Sub 's_Ayuda

Function f_IIf(bol_Expresion, _
               var_Verdadero, _
               var_Falso)
'***********************************************************************
'* 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

Sub s_CargarObjetosADEnArray(arr_Destino, _
                             str_Contenedor, _
                             str_Filtro, _
                             str_Atributo, _
                             bol_Excluidos)
'***********************************************************************
'* Procedimiento: s_CargarObjetosADEnArray                             *
'* Tipo         : Metodo                                               *
'* Devolución   :                                                      *
'* Fecha y Hora : 03/08/2007 18:44:05                                  *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Este método recibe el nombre distinguido de un       *
'*                contenedor de Active Directory, un filtro de         *
'*                busqueda (por ejemplo                                *
'*                "(&(objectCategory=person)(objectClass=user))", que  *
'*                buscaría usuarios, un nombre de atributo AD (sólo    *
'*                uno) a obtener (por ejemplo "sAMAccountName" que     *
'*                nos devolvería el nombre de usuario Pre-Windows      *
'*                2000), una variable Variant en la que cargará los    *
'*                resultados de la consulta, convirtiéndola en array   *
'*                por medio de Split y una booleana que le indica si   *
'*                hay elementos en el array de objetos excluidos       *
'*                (variable a nivel de script). El método realiza la   *
'*                consulta ADSI del tipo de objetos en el contenedor,  *
'*                obteniendo los atributos y almacenando los           *
'*                resultados que no coincidan con algún elemento del   *
'*                array de excluidos.                                  *
'***********************************************************************

    Dim obj_Comando 'As ADO.Command
    Dim obj_Conexion 'As ADO.Connection
    Dim obj_Recordset 'As ADO.Recordset
    Dim str_Consulta 'As String
    Dim str_RutaLDAP 'As String
    Dim obj_ObjetoAD 'As IAds 
    dim str_Objetos 'As String
    Dim str_DN 'As String
    Dim str_Alcance 'As String
    Dim int_Indice 'As Integer
    Dim int_Excluido 'As Integer
    Dim bol_Encontrado 'As Boolean
    
    'Creamos un objeto Comando
    Set obj_Comando = CreateObject("ADODB.Command")
    
    'Creamos un objeto conexión
    Set obj_Conexion = CreateObject("ADODB.Connection")
    
    'Establecemos el proveedor ADSI
    obj_Conexion.Provider = "ADsDSOObject"
    
    'Abrimos la conexión a Active Directory
    obj_Conexion.Open "Active Directory Provider"
    
    'Establecemos la conexión como conexión del objeto
    'comando
    obj_Comando.ActiveConnection = obj_Conexion
    
    'Si la consulta debe ser recursiva...
    If bol_Recursivo Then
    
        'el alcance debe ser subtree
        str_Alcance = "subtree"
        
    'Si la consulta no es recursiva...
    Else
    
        'el alcance debe ser onelevel
        str_Alcance = "onelevel"
        
    End If

    'Montamos la ruta LDAP al contenedor
    str_RutaLDAP = "<LDAP://" & str_Contenedor & ">"
    
    'Montamos la consulta
    str_Consulta = str_RutaLDAP & ";" & _
                   str_Filtro & ";" & _
                   str_Atributo  & ",distinguishedName" & ";" & _
                   str_Alcance
    
    'Establecemos la consulta en el objeto comando
    obj_Comando.CommandText = str_Consulta
    
    'Establecemos propiedades de comportamiento del objeto comando
    obj_Comando.Properties("Page Size") = 100
    obj_Comando.Properties("Timeout") = 30
    obj_Comando.Properties("Cache Results") = False
    
    'Creamos el recordset
    Set obj_Recordset = obj_Comando.Execute
    
    'Recorremos el recordset hasta su final
    Do Until obj_Recordset.EOF
    
        'Marcamos como no encontrado entre los excluidos
        bol_Encontrado = False
      
        'Si hay elementos excluidos...
        If bol_Excluidos Then
                      
            'buscamos si el objeto actual está entre ellos
            For int_Excluido = LBound(arr_Excluidos) _
            To UBound(arr_Excluidos)
            
                'Si coincide el excluido con el objeto actual...
                If UCase(arr_Excluidos(int_Excluido)) = _
                   UCase(obj_Recordset.Fields( _
                                       str_Atributo).Value) Then
                
                    'Marcamos como encontrado entre los excluidos
                    bol_Encontrado = True
                    
                    'Salimos del bucle For
                    Exit For
                    
                End If
            
            Next 'int_Excluido
            
        End If
        
        'Si el objeto no ha sido encontrado entre los excluidos
        If Not bol_Encontrado Then 
        
            'Agregamos el objeto
            str_Objetos = str_Objetos & _
                  obj_Recordset.Fields(str_Atributo).Value & vbTab
                  
            'Agregamos su nombre distinguido
            str_DN = str_DN & obj_Recordset.Fields( _
                                "distinguishedName").Value & vbTab
            
        End If
        
        'Vamos al siguiente registro
        obj_Recordset.MoveNext
    
    Loop
    
    'Si se han encontrado objetos
    If Len(str_Objetos) > 0 Then
    
        'Quitamos el tabulador final de la lista
        str_Objetos = Left(str_Objetos,Len(str_Objetos)-1)
        
        'Cargamos el array de objetos
        arr_Destino = Split(str_Objetos,vbTab)
        
        'Quitamos el tabulador final
        str_DN = Left(str_DN,Len(str_DN)-1)
        
        'Cargamos el array de nombres distinguidos
        arr_DN = Split(str_DN,vbTab)
        
    End if
    
    'Cerramos el recordset
    obj_Recordset.Close
    
    'Cerramos la conexión
    obj_Conexion.Close
    
    'Limpieza de parte posterior saliente :-)
    Set obj_Recordset = Nothing
    Set obj_Comando = Nothing
    Set obj_Conexion = Nothing
    
End Sub 's_CargarObjetosADEnArray

Sub s_CargarDNs()
'***********************************************************************
'* Procedimiento: s_CargarDNs                                          *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : 03/08/2007 11:06:41                                  *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Este método se encarga de cargar el array de         *
'*                nombres distinguidos a partir del array de nombres   *
'*                NT.                                                  *
'***********************************************************************

    Dim int_Usuario     'As Integer
    Dim str_Usuario     'As String
    Dim str_Usuarios    'As String
    Dim str_Dominio     'As String
    Dim str_DominioLDAP 'As String
    Dim obj_SH          'As wshShell
    Dim str_UsuarioLDAP 'As String
    
    'Creamos un objeto wshShell
    Set obj_SH = CreateObject("WScript.Shell")
    
    'Obtenemos el nombre NT del dominio al que pertenece el equipo
    'desde el que se lanza el script
    str_Dominio = obj_SH.ExpandEnvironmentStrings("%USERDOMAIN%")
    
    'Obtenemos el nombre DNS del dominio al que pertenece el equipo
    'desde el que se lanza el script
    str_DominioLDAP = _
                obj_SH.ExpandEnvironmentStrings("%USERDNSDOMAIN%")
                
    'Montamos el nombre distinguido del dominio a partir de su nombre
    'DNS
    str_DominioLDAP = "DC=" & Replace(str_DominioLDAP,".",",DC=")
    
    'Limpieza de parte posterior saliente :-))
    Set obj_SH = Nothing
    
    'Recorremos ahora el array con los nombres NT de los usuarios
    For int_Usuario = LBound(arr_Usuarios) To UBound(arr_Usuarios)
    
        'Iniciamos la variable con el nombre distinguido del usuario
        str_UsuarioLDAP = ""
        
        'Si no aparece el slash inverso en el nombre del usuario,
        'el nombre no incluye el dominio, así que se lo agregamos
        'a partir del nombre de dominio NT que obtuvimos antes
        If InStr(arr_Usuarios(int_Usuario),"") = 0 Then
        
            str_Usuario = str_Dominio & _
                          "" & _
                          arr_Usuarios(int_Usuario)
            
        'Si el nombre del usuario sí tiene el dominio, lo asignamos
        'a la variable sin más
        Else
        
            str_Usuario = arr_Usuarios(int_Usuario)
        
        End If

        'Obtenemos el nombre distinguido del usuario
        str_UsuarioLDAP = f_NTaDN(str_Usuario,"")
        
        'Si el nombre distinguido es igual al nombre distinguido
        'del dominio, significa que el usuario no existe en ese
        'dominio; por ello, dejamos su nombre distinguido en 
        'blanco (de esa forma identificaremos usuarios no 
        'existentes)
        str_UsuarioLDAP = f_IIf( _
                            UCase(str_UsuarioLDAP) = _
                                    UCase(str_DominioLDAP), _
                            "", _
                            str_UsuarioLDAP)
                            
        'Agregamos el nombre distinguido en la cadena de nombres
        'distinguidos separados por tabulador (no usamos la coma
        'porque en los nombres distinguidos hay comas)
        str_Usuarios = str_Usuarios & str_UsuarioLDAP & vbTab
    
    Next 'int_Usuario
    
    If Len(str_Usuarios) > 0 Then
    
        str_Usuarios = Left(str_Usuarios,Len(str_Usuarios) - 1)
        arr_DN = Split(str_Usuarios,vbTab)
        
    End if

End Sub 's_CargarDNs

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              *
'*                ("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

 

 

Una respuesta to “Script VBScript Para Establecer El Perfil De Terminal Services A Uno O Varios Usuarios De Active Directory”

  1. […] VBScript Para Establecer El Perfil De Terminal Services A Uno O Varios Usuarios De Active Directory https://urpiano.wordpress.com/2008/11…ive-directory/ — Un saludo Fernando Reyes [MS MVP] MCSE Windows 2000 / 2003 MCSA Windows Server 2003 […]

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: