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 Cambiar La Configuración De Cuentas IMAP En Outlook

Posted by urpiano en Jueves 26 \26\UTC febrero \26\UTC 2009

Script VBScript que permite cambiar en Outlook el servidor de una cuenta IMAP y el dominio del usuario que conecta al servidor IMAP. El script busca todas aquellas cuentas IMAP que tengan configuradas el servidor que recibe como servidor viejo y establece el servidor que recibe como servidor nuevo. Permite también cambiar la parte del nombre de usuario correspondiente al dominio, de forma que apunte el mismo usuario a otro dominio (de DOMINIOVIEJO\usuario a DOMINIONUEVO\usuario). Es imprescindible que la contraseña del nuevo usuario sea igual a la del viejo, pues la contraseña está cifrada en el registro y para poder entrarla nueva sería necesario hacerlo de forma interactiva.

Sintaxis

cscript [//nologo] cambiar-imap.vbs /ImapV:imap_viejo /ImapN:imap_nuevo [/SmtpN:smtp_nuevo] [/CambiarUsuario] [/DominioN:dominio_nuevo] [/LimpiarDominio] [/?]

Siendo

Etiqueta Dato ¿Requerido? Descripción
ImapV imap_viejo
IP o nombre del servidor IMAP que se quiere sustituir
ImapN imap_nuevo
IP o nombre del servidor IMAP que se quiere establecer
SmtpN smtp_nuevo No
IP o nombre del servidor SMTP que se quiere establecer; si se omite se establecerá el mismo que establece el parámetro /ImapN
CambiarUsuario cambiar_usuario No
Si se pasa este modificador, se cambiará el dominio al que pertenece el usuario de conexión a IMAP; si no se recibe el parámetro /DominioN ni el modificador /LimpiarDominio, se establecerá el dominio al que pertenece el usuario que lanza el script
DominioN dominio_nuevo No
Nombre NetBios del dominio nuevo del usuario de conexión a IMAP. Sustituirá al dominio que tenga el usuario de la cuenta IMAP o se añadirá si no tiene dominio especificado este usuario. Si se omite este parámetro pueden pasar dos cosas: la primera es que no se haya recibido el modificador /LimpiarDominio, en cuyo caso se establece el dominio al que pertenezca el usuario que lanza el script; la segunda es que sí se haya establecido /LimpiarDominio, en cuyo caso se dejará únicamente el nombre de usuario, sin el prefijo de dominio. Si no se ha pasado el modificador /CambiarUsuario este parámetro es ignorado
LimpiarDominio limpiar_dominio No
Si se pasa este modificador, se cambiará el usuario de conexión a IMAP quitándole la parte de dominio; es decir, “TIA\mortadelo” pasará a ser “Mortadelo”. En el caso de pasarse este modificador y el parámetro /DominioN, este modificador será ignorado, y se establecerá en el usuario el dominio que establece el parámetro /DominioN. Si no se ha pasado el modificador /CambiarUsuario este modificador es ignorado
?   No
Muestra la ayuda en línea.

Ejemplos:

– Cambiamos el servidor IMAP y SMTP a imap.tia.org en las cuentas IMAP que tienen configurado el servidor imap.pruebas.tia.org:

cscript //nologo cambiar-imap.vbs /ImapV:imap.pruebas.tia.org /ImapN:imap.tia.org

– Cambiamos el servidor IMAP y SMTP a imap.tia.org en las cuentas IMAP que tienen configurado el servidor imap.pruebas.tia.org, sustituyendo el dominio del usuario de conexión a IMAP por el dominio del usuario que lanza el script:

cscript //nologo cambiar-imap.vbs /ImapV:imap.pruebas.tia.org /ImapN:imap.tia.org

– Cambiamos el servidor IMAP y SMTP a imap.tia.org en las cuentas IMAP que tienen configurado el servidor imap.pruebas.tia.org, sustituyendo el dominio del usuario de conexión a IMAP por el dominio TIA:

cscript //nologo cambiar-imap.vbs /ImapV:imap.pruebas.tia.org /ImapN:imap.tia.org /CambiarUsuario /DominioN:TIA

– Cambiamos el servidor IMAP y SMTP a imap.tia.org en las cuentas IMAP que tienen configurado el servidor imap.pruebas.tia.org, quitando el dominio del usuario de conexión a IMAP :

cscript //nologo cambiar-imap.vbs /ImapV:imap.pruebas.tia.org /ImapN:imap.tia.org /CambiarUsuario /LimpiarDominio

Este es el código del script

'*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
'*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°*
'* cambiar-imap.vbs                                                    *
'*                                                                     *
'* Script VBScript que permite cambiar en Outlook el servidor de una   *
'* cuenta IMAP y el dominio del usuario que conecta al servidor IMAP.  *
'* El script busca todas aquellas cuentas IMAP que tengan configuradas *
'* el servidor que recibe como servidor viejo y establece el servidor  *
'* que recibe como servidor nuevo. Permite también cambiar la parte    *
'* del nombre de usuario correspondiente al dominio, de forma que      *
'* apunte el mismo usuario a otro dominio (de DOMINIOVIEJO\usuario a   *
'* DOMINIONUEVO\usuario).                                              *
'*                                                                     *
'* Sintaxis                                                            *
'*                                                                     *
'* {wscript | cscript [//nologo]} cambiar-imap.vbs /ImapV:imap_viejo   *
'* /ImapN:imap_nuevo [/SmtpN:smtp_nuevo] [/CambiarUsuario]             *
'* [/DominioN:dominio_nuevo] [/LimpiarDominio] [/?]                    *
'*                                                                     *
'* Siendo                                                              *
'*                                                                     *
'* - /ImapV: imap_viejo (Requerido):                                   *
'*         IP o nombre del servidor IMAP que se quiere sustituir       *
'*                                                                     *
'* - /ImapN: imap_nuevo (Requerido):                                   *
'*         IP o nombre del servidor IMAP que se quiere establecer      *
'*                                                                     *
'* - /SmtpN: smtp_nuevo (Opcional):                                    *
'*         IP o nombre del servidor SMTP que se quiere establecer; si  *
'*         se omite se establecerá el mismo que establece el parámetro *
'*         /ImapN                                                      *
'*                                                                     *
'* - /CambiarUsuario: cambiar_usuario (Opcional):                      *
'*         Si se pasa este modificador, se cambiará el dominio al que  *
'*         pertenece el usuario de conexión a IMAP; si no se recibe el *
'*         parámetro /DominioN ni el modificador /LimpiarDominio, se   *
'*         establecerá el dominio al que pertenece el usuario que      *
'*         lanza el script                                             *
'*                                                                     *
'* - /DominioN: dominio_nuevo (Opcional):                              *
'*         Nombre NetBios del dominio nuevo del usuario de conexión a  *
'*         IMAP. Sustituirá al dominio que tenga el usuario de la      *
'*         cuenta IMAP o se añadirá si no tiene dominio especificado   *
'*         este usuario. Si se omite este parámetro pueden pasar dos   *
'*         cosas: la primera es que no se haya recibido el modificador *
'*         /LimpiarDominio, en cuyo caso se establece el dominio al    *
'*         que pertenezca el usuario que lanza el script; la segunda   *
'*         es que sí se haya establecido /LimpiarDominio, en cuyo caso *
'*         se dejará únicamente el nombre de usuario, sin el prefijo   *
'*         de dominio. Si no se ha pasado el modificador               *
'*         /CambiarUsuario este parámetro es ignorado                  *
'*                                                                     *
'* - /LimpiarDominio: limpiar_dominio (Opcional):                      *
'*         Si se pasa este modificador, se cambiará el usuario de      *
'*         conexión a IMAP quitándole la parte de dominio; es decir,   *
'*         "TIA\mortadelo" pasará a ser "Mortadelo". En el caso de     *
'*         pasarse este modificador y el parámetro /DominioN, este     *
'*         modificador será ignorado, y se establecerá en el usuario   *
'*         el dominio que establece el parámetro /DominioN. Si no se   *
'*         ha pasado el modificador /CambiarUsuario este modificador   *
'*         es ignorado                                                 *
'*                                                                     *
'*                                                                     *
'* Ejemplos:                                                           *
'*                                                                     *
'* - Cambiamos el servidor IMAP y SMTP a imap.tia.org en las cuentas   *
'* IMAP que tienen configurado el servidor imap.pruebas.tia.org:       *
'*                                                                     *
'* cscript //nologo cambiar-imap.vbs /ImapV:imap.pruebas.tia.org       *
'* /ImapN:imap.tia.org                                                 *
'*                                                                     *
'* - Cambiamos el servidor IMAP y SMTP a imap.tia.org en las cuentas   *
'* IMAP que tienen configurado el servidor imap.pruebas.tia.org,       *
'* sustituyendo el dominio del usuario de conexión a IMAP por el       *
'* dominio del usuario que lanza el script:                            *
'*                                                                     *
'* cscript //nologo cambiar-imap.vbs /ImapV:imap.pruebas.tia.org       *
'* /ImapN:imap.tia.org                                                 *
'*                                                                     *
'* - Cambiamos el servidor IMAP y SMTP a imap.tia.org en las cuentas   *
'* IMAP que tienen configurado el servidor imap.pruebas.tia.org,       *
'* sustituyendo el dominio del usuario de conexión a IMAP por el       *
'* dominio TIA:                                                        *
'*                                                                     *
'* cscript //nologo cambiar-imap.vbs /ImapV:imap.pruebas.tia.org       *
'* /ImapN:imap.tia.org /DominioN:TIA                                   *
'*                                                                     *
'* - Cambiamos el servidor IMAP y SMTP a imap.tia.org en las cuentas   *
'* IMAP que tienen configurado el servidor imap.pruebas.tia.org,       *
'* quitando el dominio del usuario de conexión a IMAP:                 *
'*                                                                     *
'* cscript //nologo cambiar-imap.vbs /ImapV:imap.pruebas.tia.org       *
'* /ImapN:imap.tia.org                                                 *
'*                                                                     *
'*                                                                     *
'*                                                                     *
'*                                                                     *
'* © Fernando Reyes                                                    *
'* Febrero De 2009                                                     *
'*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°*
'*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*

'Exigimos la declaración de variables
Option Explicit

'Constantes para las ramas del registro
Const HKLM = &H80000002
Const HKCU = &H80000001

'Definición de variables
Dim str_Error           'As String
Dim int_Error           'As Integer
Dim str_ImapViejo       'As String
Dim str_ImapNuevo       'As String
Dim str_SmtpNuevo       'As String
Dim str_PerfilesOutlook 'As String
Dim str_Equipo          'As String
Dim obj_Reg             'As Object
Dim int_ctrlEjecutado   'As Integer
Dim bol_CambiarUsuario  'As Boolean
Dim bol_LimpiarDominio  'As Boolean
Dim str_DominioNuevo    'As String
Dim str_UsuarioViejo    'As String
Dim str_UsuarioNuevo    'As String
Dim bol_CScript         'As Boolean

'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

'Establecemos el equipo local como equipo al que conectar
'con WMI
str_Equipo = "."

'Creamos el objeto proveedor de registro de WMI conectado al equipo
'local
Set obj_Reg=GetObject("winmgmts:{impersonationLevel=impersonate}!" & _
                      "\\" & str_Equipo & "\root\default:StdRegProv")
 
'Vamos a establecer si estamos ejecutando desde CScript o
'desde WScript
bol_CScript = (InStr(LCase(WScript.FullName),"cscript") > 0)

'Establecemos la raíz del registro de los perfiles de Outlook del
'usuario que lanza el script
str_PerfilesOutlook = "Software\Microsoft\Windows NT\CurrentVersi" & _
                      "on\Windows Messaging Subsystem\Profiles\"

'Llamamos al método que recorre todo el subárbol del registro con los
'perfiles de Outlook del usuario, estableciendo el nivel 0, es decir,
'que estamos en la raíz. A su vez este método llama al que se encarga
'de realizar los cambios, con lo que pasada esta línea se habrá
'terminado la tarea del script
Call s_Claves(str_PerfilesOutlook,0)

'Marcamos que se ejecutó con éxito el script
Call s_CerrarControl

'Limpieza de bullarenga :-)
Set obj_Reg = Nothing

'Fin del script sin errores
' WScript.Quit 0

Sub s_Claves(str_Clave, int_Nivel)
'***********************************************************************
'* Procedimiento: s_Claves                                             *
'* Tipo         : Método                                               *
'* Devolución   : Ninguna                                              *
'* Fecha y Hora : 26/02/2009 12:00:13                                  *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Este método recorre todas las claves del registro    *
'*                contenidas en el subarbol cuya raíz está en la       *
'*                clave recibida. Una vez en cada clave, llama al      *
'*                método que revisa si se trata de una cuenta IMAP,    *
'*                debe ser cambiada y la cambia en caso afirmativo.    *
'*                El parámetro int_Nivel le indica al método si se     *
'*                trata de la propia raíz del subárbol, ya que para    *
'*                recorrerlo hace una llamada recursiva en la que      *
'*                incrementa este int_Nivel                            *
'***********************************************************************

    Dim str_SubClave  'As String
    Dim arr_SubClaves 'As ByteArray
    Dim int_Lbound    'As Integer

    'Obtenemos la colección de subclaves contenidas en la clave
    'recibida como parámetro
    obj_Reg.EnumKey HKCU, str_Clave, arr_SubClaves

    'Si no hay subclaves salimos del método
    If Not f_EsArray(arr_SubClaves) Then Exit Sub
    
    'Recorremos las subclaves contenidas en la clave recibida como
    'parámetro
    For Each str_SubClave In arr_SubClaves
    
        'No nos interesan las claves encerradas en corchetes ni la raíz
        'de perfiles (sabemos que dentro no hay valores y sabemos que se
        'trata de la raíz de perfiles porque int_Nivel es 0). Para el
        'resto, llamamos al método que realiza el proceso de modificar
        'si se trata de una cuenta IMAP a modificar)
        If Not Left(str_SubClave,1) = "{" _
        And int_nivel > 0 Then _
            Call s_Valores(str_Clave & "\" & str_SubClave,int_nivel + 4)
            
        'Realizamos una llamada recursiva para así procesar cada una de
        'las subclaves, incrementando int_Nivel, para así indicar que no
        'se trata de la raíz
        Call s_Claves(str_Clave & "\" & str_SubClave,int_nivel + 1)

    Next
    
End Sub 's_Claves

Sub s_Valores(str_Clave, int_Nivel)
'***********************************************************************
'* Procedimiento: s_Valores                                            *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : 26/02/2009 12:14:54                                  *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Este método recibe la ruta a una clave del registro  *
'*                y recorre sus valores para revisar si se trata de    *
'*                la configuración de una cuenta IMAP a cambiar,       *
'*                cambiando lo que proceda                             *
'***********************************************************************

    Const REG_BINARY = 3
    
    Dim int_Valor        'As Integer
    Dim arr_Valores      'As ByteArray
    Dim arr_Tipos        'As ByteArray
    Dim int_Lbound       'As Integer
    Dim int_Ubound       'As Integer
    Dim arr_Contenido    'As ByteArray
    Dim str_Servidor     'As String
    Dim str_Usuario      'As String
    Dim str_Nombre       'As String
    Dim arr_ImapNuevo    'As ByteArray
    Dim arr_UsuarioNuevo 'As ByteArray
    Dim arr_SmtpNuevo    'As ByteArray

    'Obtenemos el array con los nombres de los valores, y el array con
    'sus tipos, de los valores contenidos en la clave recibida como
    'parámetro
    obj_Reg.EnumValues HKCU, str_Clave, arr_Valores, arr_Tipos

    'Si no hay valores, salimos del método
    If Not f_EsArray(arr_Valores) Then Exit Sub
    
    'Obtenemos el límite inferior y superior del array
    int_Lbound = LBound(arr_Valores)
    int_Ubound = UBound(arr_Valores)
    
    'Recorremos el array
    For int_Valor = int_Lbound To int_Ubound
    
        'Sólo nos interesa encontrar el valor de tipo binario
        '"IMAP Server"
        If arr_Tipos(int_Valor) = REG_BINARY _
        And LCase(arr_Valores(int_Valor)) = "imap server" Then
        
            'Obtenemos el contenido del valor
            obj_Reg.GetBinaryValue HKCU, _
                                   str_Clave, _
                                   arr_Valores(int_Valor), _
                                   arr_Contenido
            
            'Pasamos a cadena el valor, para así poder identificar el
            'servidor
            str_Servidor = f_ByteArrayACadena(arr_Contenido)
            
            'Si se trata del servidor a cambiar...
            If str_Servidor = str_ImapViejo Then
                        
                'Convertimos el servidor nuevo a su valor como
                'array de bytes
                arr_ImapNuevo = f_CadenaAByteArray(str_ImapNuevo)
                
                'Cambiamos el valor en el registro
                obj_Reg.SetBinaryValue HKCU, _
                                       str_Clave, _
                                       arr_Valores(int_Valor), _
                                       arr_ImapNuevo
                
                'Cambiaremos ahora el valor del servidor SMTP
                'Primero obtenemos si valor como aray
                arr_SmtpNuevo = f_CadenaAByteArray(str_SmtpNuevo)
                
                'Cambiamos el valor en el registro
                obj_Reg.SetBinaryValue HKCU, str_Clave, _
                                       "SMTP Server", _
                                       arr_SmtpNuevo
                
                If bol_CScript Then _
                            WScript.Echo "Cambiados servidores"
                
                'Si hay que modificar el usuario
                If bol_CambiarUsuario Then
                
                    'Obtenemos el usuario de conexión a IMAP
                    obj_Reg.GetBinaryValue HKCU, _
                                           str_Clave, _
                                           "IMAP User", _
                                           arr_Contenido
                    
                    'Lo cambiamos a cadena
                    str_Usuario = f_ByteArrayACadena(arr_Contenido)
                    
                    'Obtenemos el nuevo nombre
                    str_Usuario = f_UsuarioIMAP(str_Usuario)
                                                
                    'Obtenemos su valor como binario
                    arr_UsuarioNuevo = f_CadenaAByteArray(str_Usuario)

                    'Cambiamos el usuario en el registro
                    obj_Reg.SetBinaryValue HKCU, _
                                           str_Clave, _
                                           "IMAP User", _
                                           arr_UsuarioNuevo
                    
                    'Sólo mostraremos el mensaje en el caso de estar
                    'lanzado el script por CScript
                    If bol_CScript Then _
                                WScript.Echo "Cambiado usuario"
                
                End If
            
            End If
                    
        End If

    Next
    
End Sub 's_Valores

Function f_RevisarArgumentos( _
                             str_Error, _
                             int_Error _
                             ) 'As Boolean
'***********************************************************************
'* Procedimiento: f_RevisarArgumentos                                  *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : 26/02/2009 11:34:27                                  *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Esta función revisa los argumentos recibidos,        *
'*                recogiendo los posibles fallos por falta de          *
'*                argumentos requeridos y almacenando en las           *
'*                variables correspondientes los argumentos            *
'*                recibidos. recibe dos parámetros cuyo fin es ser de  *
'*                salida: una cadena que almacenará los errores        *
'*                detectados y un entero que almacenará el código de   *
'*                los errores detectados. Hay tres tipos de error;     *
'*                error 1 para los argumentos sin nombre requeridos y  *
'*                no encontrados, error 2 para los argumentos con      *
'*                nombre requeridos y no encontrados, por último,      *
'*                error 4 para los combos de argumentos opcionales     *
'*                (un combo de argumentos opcionales es aquel          *
'*                conjunto de argumentos opcionales que es requerido   *
'*                que se pase al menos uno de ellos y que si se pasa   *
'*                más de uno se ignorarán aquellos que estén detrás    *
'*                en la prioridad entre ellos; una característica      *
'*                clara de lo que es un combo de argumentos es cuando  *
'*                dos omás argumentos almacenan su valor en la misma   *
'*                variable). En el caso de producirse más de un tipo   *
'*                de error, el número de error será la suma de ambos   *
'*                de los errores recibidos, es decir 3, 5 o 6          *
'***********************************************************************

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

    'Iniciamos los indicadores
    bol_Devolucion = False
    bol_Error1 = False
    bol_Error2 = False
    bol_Error4 = False


    'Si hay que mostrar la ayuda, se muestra y
    'termina el script
    If WScript.Arguments.Named.Exists("?") Then

        Call s_Ayuda("******************" & vbCrLf & _
                     "*     AYUDA      *" & vbCrLf & _
                     "******************")

        WScript.Quit 0

    End If

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

        str_ImapViejo =  _
               WScript.Arguments.Named("ImapV")

    Else

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

    End If

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

        str_ImapNuevo =  _
               WScript.Arguments.Named("ImapN")

    Else

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

    End If

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

        str_SmtpNuevo =  _
               WScript.Arguments.Named("SmtpN")
               
    Else
    
        'Si no se ha psado se establece el mismo
        'servidor que el IMAP
        str_SmtpNuevo = str_ImapNuevo

    End If

    'Primero iniciamos las booleanas de cambio de usuario
    bol_CambiarUsuario = False
    bol_LimpiarDominio = False
    
    'Revisamos que esté el argumento
    '/CambiarUsuario (cambiar_usuario)
    If WScript.Arguments.Named.Exists("CambiarUsuario") Then

        bol_CambiarUsuario = True

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

            str_DominioNuevo =  _
                   WScript.Arguments.Named("DominioN")

        'Revisamos que esté el argumento
        '/LimpiarDominio (limpiar_dominio)
        ElseIf WScript.Arguments.Named.Exists("LimpiarDominio") Then

            bol_LimpiarDominio = True
            
        End If

    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 : 26/02/2009 11:34:28                                  *
'* 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 "Script VBScript que permite cambiar en Outlook el" & _
                 " servidor de una cuenta IMAP y"
    WScript.Echo "el dominio del usuario que conecta al servidor IM" & _
                 "AP. El script busca todas"
    WScript.Echo "aquellas cuentas IMAP que tengan configuradas el " & _
                 "servidor que recibe como"
    WScript.Echo "servidor viejo y establece el servidor que recibe" & _
                 " como servidor nuevo. Permite"
    WScript.Echo "también cambiar la parte del nombre de usuario co" & _
                 "rrespondiente al dominio, de"
    WScript.Echo "forma que apunte el mismo usuario a otro dominio " & _
                 "(de DOMINIOVIEJO\usuario a"
    WScript.Echo "DOMINIONUEVO\usuario)."
    WScript.Echo ""
    WScript.Echo "Sintaxis"
    WScript.Echo ""
    WScript.Echo "{wscript | cscript [//nologo]} cambiar-imap.vbs /" & _
                 "ImapV:imap_viejo"
    WScript.Echo "/ImapN:imap_nuevo [/SmtpN:smtp_nuevo] [/CambiarUs" & _
                 "uario]"
    WScript.Echo "[/DominioN:dominio_nuevo] [/LimpiarDominio] [/?]"
    WScript.Echo ""
    WScript.Echo "Siendo"
    WScript.Echo ""
    WScript.Echo "- /ImapV: imap_viejo (Requerido):"
    WScript.Echo "IP o nombre del servidor IMAP que se quiere sustituir"
    WScript.Echo ""
    WScript.Echo "- /ImapN: imap_nuevo (Requerido):"
    WScript.Echo "IP o nombre del servidor IMAP que se quiere estab" & _
                 "lecer"
    WScript.Echo ""
    WScript.Echo "- /SmtpN: smtp_nuevo (Opcional):"
    WScript.Echo "IP o nombre del servidor SMTP que se quiere estab" & _
                 "lecer; si se"
    WScript.Echo "omite se establecerá el mismo que establece el pa" & _
                 "rámetro /ImapN"
    WScript.Echo ""
    WScript.Echo "- /CambiarUsuario: cambiar_usuario (Opcional):"
    WScript.Echo "Si se pasa este modificador, se cambiará el domin" & _
                 "io al que"
    WScript.Echo "pertenece el usuario de conexión a IMAP; si no se" & _
                 " recibe el"
    WScript.Echo "parámetro /DominioN ni el modificador /LimpiarDom" & _
                 "inio, se"
    WScript.Echo "establecerá el dominio al que pertenece el usuari" & _
                 "o que lanza el"
    WScript.Echo "script"
    WScript.Echo ""
    WScript.Echo "- /DominioN: dominio_nuevo (Opcional):"
    WScript.Echo "Nombre NetBios del dominio nuevo del usuario de c" & _
                 "onexión a"
    WScript.Echo "IMAP. Sustituirá al dominio que tenga el usuario " & _
                 "de la cuenta"
    WScript.Echo "IMAP o se añadirá si no tiene dominio especificad" & _
                 "o este"
    WScript.Echo "usuario. Si se omite este parámetro pueden pasar " & _
                 "dos cosas: la"
    WScript.Echo "primera es que no se haya recibido el modificador"
    WScript.Echo "/LimpiarDominio, en cuyo caso se establece el dom" & _
                 "inio al que"
    WScript.Echo "pertenezca el usuario que lanza el script; la seg" & _
                 "unda es que sí"
    WScript.Echo "se haya establecido /LimpiarDominio, en cuyo caso" & _
                 " se dejará"
    WScript.Echo "únicamente el nombre de usuario, sin el prefijo d" & _
                 "e dominio. Si"
    WScript.Echo "no se ha pasado el modificador /CambiarUsuario es" & _
                 "te parámetro"
    WScript.Echo "es ignorado"
    WScript.Echo ""
    WScript.Echo "- /LimpiarDominio: limpiar_dominio (Opcional):"
    WScript.Echo "Si se pasa este modificador, se cambiará el usuar" & _
                 "io de conexión"
    WScript.Echo "a IMAP quitándole la parte de dominio; es decir,"
    WScript.Echo """TIA\mortadelo"" pasará a ser ""Mortadelo"". En " & _
                 "el caso de pasarse"
    WScript.Echo "este modificador y el parámetro /DominioN, este m" & _
                 "odificador"
    WScript.Echo "será ignorado, y se establecerá en el usuario el " & _
                 "dominio que"
    WScript.Echo "establece el parámetro /DominioN. Si no se ha pas" & _
                 "ado el"
    WScript.Echo "modificador /CambiarUsuario este modificador es i" & _
                 "gnorado"
    WScript.Echo ""
    WScript.Echo ""
    WScript.Echo "Ejemplos:"
    WScript.Echo ""
    WScript.Echo "- Cambiamos el servidor IMAP y SMTP a imap.tia.or" & _
                 "g en las cuentas IMAP que"
    WScript.Echo "tienen configurado el servidor imap.pruebas.tia.org:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo cambiar-imap.vbs /ImapV:imap.pru" & _
                 "ebas.tia.org"
    WScript.Echo "/ImapN:imap.tia.org"
    WScript.Echo ""
    WScript.Echo "- Cambiamos el servidor IMAP y SMTP a imap.tia.or" & _
                 "g en las cuentas IMAP que"
    WScript.Echo "tienen configurado el servidor imap.pruebas.tia.o" & _
                 "rg, sustituyendo el dominio"
    WScript.Echo "del usuario de conexión a IMAP por el dominio del" & _
                 " usuario que lanza el script:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo cambiar-imap.vbs /ImapV:imap.pru" & _
                 "ebas.tia.org"
    WScript.Echo "/ImapN:imap.tia.org"
    WScript.Echo ""
    WScript.Echo "- Cambiamos el servidor IMAP y SMTP a imap.tia.or" & _
                 "g en las cuentas IMAP que"
    WScript.Echo "tienen configurado el servidor imap.pruebas.tia.o" & _
                 "rg, sustituyendo el dominio"
    WScript.Echo "del usuario de conexión a IMAP por el dominio TIA:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo cambiar-imap.vbs /ImapV:imap.pru" & _
                 "ebas.tia.org"
    WScript.Echo "/ImapN:imap.tia.org /CambiarUsuario /DominioN:TIA"
    WScript.Echo ""
    WScript.Echo "- Cambiamos el servidor IMAP y SMTP a imap.tia.or" & _
                 "g en las cuentas IMAP que"
    WScript.Echo "tienen configurado el servidor imap.pruebas.tia.o" & _
                 "rg, quitando el dominio del"
    WScript.Echo "usuario de conexión a IMAP :"
    WScript.Echo ""
    WScript.Echo "cscript //nologo cambiar-imap.vbs /ImapV:imap.pru" & _
                 "ebas.tia.org"
    WScript.Echo "/ImapN:imap.tia.org /CambiarUsuario /LimpiarDominio"
    WScript.Echo ""
    WScript.Echo ""
    WScript.Echo ""

End Sub 's_Ayuda

Function f_UsuarioIMAP(str_Usuario)
'***********************************************************************
'* Procedimiento: f_UsuarioIMAP                                        *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : 26/02/2009 11:39:47                                  *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Esta función devuelve el nombre NetBios del usuario  *
'*                que conecta a IMAP. Recibe el nombre de usuario, el  *
'*                nombre del dominio viejo y devuelve el mismo         *
'*                usuario pero en el dominio nuevo; si dominio nuevo   *
'*                se recibe vacío, pondrá como nombre de dominio el    *
'*                del dominio al que pertenece el usuario que lanza    *
'*                el script                                            *
'***********************************************************************

    Dim obj_NW         'As WshNetwork
    Dim str_Devolucion 'As String
    Dim obj_FS         'As FileSystemObject
    
    'Quitamos la parte del dominio viejo al usuario. Para ello creamos
    'un objeto FileSystemObject
    Set obj_FS = CreateObject("Scripting.FileSystemObject")
    
    'Obtenemos el nombre de usuario sin la parte de dominio
    str_Devolucion = obj_FS.GetFileName(str_Usuario)
    
    'Destruimos el objeto FileSystemObject
    Set obj_FS = Nothing

    'Si se ha recibido dominio nuevo
    If Len(str_DominioNuevo) > 0 Then
    
       'Ponemos el dominio nuevo al usuario
       str_Devolucion = UCase(str_DominioNuevo) & "\" & str_Devolucion
    
    'Si no se ha recibido dominio nuevo
    ElseIf Not bol_LimpiarDominio then
    
       'Creamos un objeto wshNetwork
       Set obj_NW = CreateObject("WScript.Network")
       
       'Ponemos el dominio del usuario que lanza el script al usuario
       'de conexión a IMAP
       str_Devolucion = UCase(obj_NW.UserDomain) & "\" & str_Devolucion
       
       'Limpieza de popa :-)
       Set obj_NW = Nothing
       
    End If
    
    'Se devuelve el usuario montado
    f_UsuarioIMAP = str_Devolucion

End Function 'f_UsuarioIMAP

Function f_EsArray(arr_Pasado) 'As Boolean
'***********************************************************************
'* Procedimiento: f_EsArray                                            *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : 26/02/2009 12:05:30                                  *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Esta función recibe una variable y determina si es   *
'*                un array o no. En caso de ser array devuelve True,   *
'*                si no lo es False                                    *
'***********************************************************************
    
    Dim int_LBound 'As Integer
    
    'Establecemos control de errores
    On Error Resume Next

    'Obtenemos el límite inferior del array. Esto nos vale para saber
    'si la variable es un array o no, pues si no es un array se produce
    'un error
    int_LBound = LBound(arr_Pasado)

    'Si se ha producido un error
    If Err.Number <> 0 Then
    
        'Vaciamos el objecto de error
        Err.Clear
        
        'Devolvemos False
        f_EsArray = False
        
    'No hay error
    Else
        
        'Devolvemos True
        f_EsArray = True
        
    End If
    
    'Devolvemos el control de errores a VbScript
    On Error Goto 0
    
End Function 'f_EsArray

Function f_CadenaAByteArray(str_Valor) 'As String
'***********************************************************************
'* Procedimiento: f_CadenaAByteArray                                   *
'* Tipo         : Función                                              *
'* Devolución   : cadena                                               *
'* Fecha y Hora : 26/02/2009 12:34:44                                  *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Esta función recibe una cadena y devuelve un array   *
'*                de bytes correspondiente al contenido que se         *
'*                almacen en un valor binario del registro             *
'***********************************************************************

    Dim int_Len          'As Integer
    Dim int_Caracter     'As Integer
    Dim arr_Devolucion() 'As ByteArray
    
    'Obtenemos la longitud de la cadena recibida 
    int_Len = Len(str_Valor)
    
    'Dimensionamos el array de devolución al doble de la longitud + 1
    ReDim arr_Devolucion((int_Len * 2))
    
    'En este bucle recorreremos la cadena
    For int_Caracter = 1 To int_Len
    
        'Guardamos al código ASCII del caracter en el primer byte y
        'cero en el segundo
        arr_Devolucion((int_Caracter * 2) - 2) = _
                                     Asc(Mid(str_Valor,int_Caracter,1))
        arr_Devolucion((int_Caracter * 2) - 1) = 0
        
    Next
    
    'Establecemos el último byte como cero, lo cual indica el final
    'del valor
    arr_Devolucion(int_Len * 2) = 0
    
    'La función devuelve el array obtenido
    f_CadenaAByteArray = arr_Devolucion

End Function 'f_CadenaAByteArray

Function f_ByteArrayACadena(arr_Byte)
'***********************************************************************
'* Procedimiento: f_ByteArrayACadena                                   *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : 26/02/2009 12:57:16                                  *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Esta función recibe un array de bytes y devuelve     *
'*                una cadena correspondiente al los caracteres         *
'*                representados por los códigos ASCII que tienen los   *
'*                Bytes impares (los pares son siempre cero)           *
'***********************************************************************

    Dim str_Devolucion, int_Byte
    
    'Iniciamos la devolución como cadena vacía
    str_Devolucion = ""
    
    'Recorremos el array
    For int_Byte = 0 to UBound(arr_Byte)
        
        'Sólo nos interesan los bytes que no tienen cero por valor
        If Not arr_Byte(int_Byte) = 0 Then _
          str_Devolucion = str_Devolucion & Chr(arr_Byte(int_Byte))
    Next
    
    'Devolvemos la cadena obtenida
    f_ByteArrayACadena = str_Devolucion

End Function 'f_ByteArrayACadena

 

 

4 comentarios to “Script VbScript Para Cambiar La Configuración De Cuentas IMAP En Outlook”

  1. Paulo said

    Hola Fernando, primero que todo agradezco los articulos que publicas, son de mucha ayuda. Adicionalmente quisiera consultar si es posible a traves de políticas de grupo limitar que sólo usuarios autorizados puedan ejecutar consultas LDAP contra el controlador de dominio.

    Saludos cordiales.

  2. Paulo said

    Gracias Fernando, efectivamente entiendo lo que planteas. Mi duda surgía porque hay scripts en la red que permiten desbloquear cuentas, crear cuentas, etc.

    He salido de la duda y comprobado que para que estos se realicen efectivamente debo contar con privilegios de administrador en el Active directory, con esto se acota el riesgo de que sólo los usuarios autorizados puedar realizar ciertas tareas.

    Saludos

  3. Alejandro Avalos said

    Buen día.

    Tengo necesidad de desarrollar un script o programa que me configure una cuenta de correo para ser utilizada en Outlook 2007, 2010 o 2013 (tomando en cuenta que son las de uso actual).

    Este script debe de recibir por parámetro o solicitar los datos de la cuenta como son: Nombre del Remitente, Dirección de Correo y la Contraseña de la cuenta para la creación de la misma.

    Una vez creada la cuenta de correo, también se debe definir una regla en Outlook en la cual se envié automáticamente una copia de cada correo enviado a través de esta cuenta.

    Lo que se pretende es que los representantes de la empresa en cuestión utilicen el script para configurar sus cuentas de correo institucionales y que los dueños de la empresa, tengan copia de cada correo enviado y recibido de los representantes.

    Sinceramente yo estoy MUY OXIDADO en esto de la programación y aunque invirtiendo tiempo y a prueba y error podría llevarlo a cabo, la necesidad me obliga a buscar algo ya hecho o solicitar el apoyo (con su debido costo) de alguien más.

    Si te interesa, te dejo mis datos para estar en contacto.

    Muchas gracias.

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: