Script VbScript Para Cambiar La Configuración De Cuentas IMAP En Outlook
Publicado por urpiano en Jueves 26 de Febrero de 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 | Sí |
IP o nombre del servidor IMAP que se quiere sustituir
|
| ImapN | imap_nuevo | Sí |
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
Paulo escribió
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.
urpiano escribió
Paulo,
Eso sería tanto como impedir que los usuarios pudieran funcionar en Active Directory, pues necesitan consultar por LDAP para poder funcionar.
Paulo escribió
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