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 Copiar Membresías De Grupo

Posted by urpiano en Lunes 16 \16\UTC abril \16\UTC 2007

Este script nace como respuesta a una pregunta que he visto en el grupo de noticias de Windows 2000 (microsoft.public.es.win2000). Permite agregar los miembros que tiene un grupo a la lista de miembros de otro.

En ese mensaje (asunto “copiados de usuarios de un grupo a otro grupo nuevo”), se exponía la necesidad de copiar los miembros de determinados grupos a otros grupos nuevos que se habían creado. Pensé que sería una tarea fácil para VBScript, usando ADSI; me puse manos a la obra y en unos 30 minutos nació la criaturita. -(|:o))

Este es el código del script

'copia-membresias.vbs

'Script VBScript que permite agregar los miembros de un grupo a la lista
'de miembros de otro. La forma de invocarlo es:

'cscript [//nologo] copia-membresias.vbs <grupo de origen> <grupo de destino>

'Siendo:

'  - <grupo de origen>:  nombre NT del grupo que tiene los miembros a copiar
'  - <grupo de destino>: nombre NT del grupo al que hay que copiar los miembros

'Ejemplo:

'  cscript copia-membresias.vbs moriatrolls "moriabestias enormes"

'© Fernando Reyes - Abril de 2007

'Requerimos la definición de variables
Option Explicit

'Constante para agregar elementos con PutEx
Const ADS_PROPERTY_APPEND = 3 

If WScript.Arguments.Unnamed.Count < 2 Then

    Call s_Ayuda("Error 1: número de argumentos incorrecto. Se debe sumi" & _
                 "strar el nombre del grupo de origen y el de destino (e" & _
                 "n ese orden).")
    WScript.Quit 1
    
End If

Dim obj_GrupoOrigen, obj_GrupoDestino, arr_Miembros
 
On Error Resume Next

'Creamos el objeto grupo de origen, llamando a la función
'f_ObjetoLDAP, que recibe el nombre de un objeto en formato
'WinNT y devuelve el objeto suministrado por el proveedor
'LDAP; esto se hace así dado que es más fácil escribir el
'nombre NT que el nombre distinguido, pero sin embargo
'necesitamos el objeto suministrado por el proceedor LDAP
'para obtener los miembros que tiene el grupo
Set obj_GrupoOrigen = f_ObjetoLDAP _
  (WScript.Arguments.Unnamed(0))
  
'Obtenemos la información del grupo de origen
obj_GrupoOrigen.GetInfo
 
'Obtenemos un array con los miembros del grupo de origen
arr_Miembros = obj_GrupoOrigen.GetEx("member")

'Creamos el grupo de destino de la misma manera que hicimos
'con el de origen
Set obj_GrupoDestino = f_ObjetoLDAP _
   (WScript.Arguments.Unnamed(1))
   
'Copiamos los miembros del grupo de origen en el de destino
obj_GrupoDestino.PutEx ADS_PROPERTY_APPEND, "member", _
                       arr_Miembros
                       
'Validamos la información
obj_GrupoDestino.SetInfo

'Limpieza de bullarenga :-))
Set obj_GrupoOrigen = Nothing
Set obj_Destino = Nothing

Function f_ObjetoLDAP(str_RutaWinNT)
'Esta función recibe el nombre NT de un objeto de dominio y devuelve
'ese objeto suministrado por el proveedor LDAP

'Basada en el código (prácticamente sólo traducir) de Richard Mueller,
'MVP de Scripting y ADSI (http://www.rmueller.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, str_DN

    'Creamos el objeto NameTranslate.
    Set obj_TraductorDeNombres = CreateObject("NameTranslate")

    'Lo iniciamos localizando el catálogo global
    obj_TraductorDeNombres.Init ADS_NAME_INITTYPE_GC, ""
    
    'Establecemos el parámetro de nombre WinNT recibido como nombre
    'WinNT en el traductor de nombres
    obj_TraductorDeNombres.Set ADS_NAME_TYPE_NT4, str_RutaWinNT

    'Usamos el método Get del traductor de nombres para obtener el
    'nombre LDAP (RFC 1779) del objeto (nombre distinguido)
    str_DN = obj_TraductorDeNombres.Get(ADS_NAME_TYPE_1779)

    'La función devolverá el objeto obtenido con el provedor LDAP
    Set f_ObjetoLDAP = GetObject("LDAP://" & str_DN)

End Function

Sub s_Ayuda(str_Mensaje)
'Muestra la ayuda en línea del script. Lo que contenga str_Mensaje se
'añadirá al principio del mensaje, para poder especificar un error, por
'ejemplo
    
    If Len(str_Mensaje) > 0 Then _
                    WScript.Echo vbCrLf  & vbCrLf & str_Mensaje
    
    WScript.Echo vbCrLf & vbCrLf & "copia-membresias.vbs"
    WScript.Echo ""
    WScript.Echo "Script VBScript que permite agregar los mi" & _ 
                 "embros de un grupo a la lista"
    WScript.Echo "de miembros de otro. La forma de invocarlo" & _ 
                 " es:"
    WScript.Echo ""
    WScript.Echo "cscript [//nologo] copia-membresias.vbs <g" & _ 
                 "rupo de origen> <grupo de destino>"
    WScript.Echo ""
    WScript.Echo "Siendo:"
    WScript.Echo ""
    WScript.Echo "  - <grupo de origen>:  nombre NT del grup" & _ 
                 "o que tiene los miembros a copiar"
    WScript.Echo "  - <grupo de destino>: nombre NT del grup" & _ 
                 "o al que hay que copiar los miembros"
    WScript.Echo ""
    WScript.Echo "Ejemplo:"
    WScript.Echo ""
    WScript.Echo "  cscript copia-membresias.vbs moriatrolls" & _ 
                 "s ""moriabestias enormes"""

End Sub

9 comentarios to “Script VBScript Para Copiar Membresías De Grupo”

  1. Livette said

    Nice blog!

  2. Ignacio said

    Hola, queria saber si hiciste algun script que se ejecute un dia especifico de la semana.
    Tengo que hacer un Script que corra los dias viernes capturando la pst del usuario logueado y copiandola en el servidor.
    Tienes idea de como podria hacer esto.
    Desde ya muchas gracias.

    Ignacio.

  3. urpiano said

    Ignacio,

    El tema de que un script se ejecute determinado día de la semana no es cosa del script en sí, si no de crear una tarea en el programador de tareas para que así lo haga. Puedes hacer que la tarea lance un simple bat o un script VBScript, según tus necesidades y/o apetencias. Quizás lo más difícil sea saber dónde está ubicado el pst, pero si eso lo sabes basta con un bat que lace una instrucción copy.

  4. HAns Diaz said

    Buenas noches, amigo he intentado usar este script pero no logro copial los miembros de un grupo a otro donde deberia colocarlos en que linea, he intentado de todo y nada por favor podrias ayudarme

    de antemano gracias ya tienes mi mail, si puedes escribeme alli.

  5. HAns Diaz said

    Otra pregunta en tu ejemplo moria que representa, es el nombre del dominio???

    disculpa lo neofito pero en esto del scripting no tengo mucha idea

    gracias

  6. urpiano said

    HAns,

    No tienes que modificar el script; copia el script, pégalo en el bloc de notas y guarda el fichero con extensión .vbs. Una vez hecho esto, llamas desde línea de comandos al script, pasando como primer parámetro el nombre del grupo origen a copiar y el del grupo destino en el que se hará la copia, tal y como pone el ejemplo.

    Respecto a la segunda pregunta, moria es el nombre del dominio, pues el nombre de lo grupos se pasa como nombres NT, que se crean según la estructura:

    <nombre NT de dominio>\<nombre NT de grupo>

    Así pues, en el ejemplo se copia las membresías del grupo “trolls”, del dominio “moria”, en el grupo “bestias enormes” del dominio “moria”.

  7. Javidoo2009 said

    Pues no jala, lo probé en XP y en Windows 2000 server:

    D:\>cscript copia-membresias.vbs test1 test2
    Microsoft (R) Windows Script Host versión 5.6
    Copyright (C) Microsoft Corporation 1996-2001. Reservados todos los derechos.
    D:\>

    …y no hace nada…

    El script está en raíz de D:, y los grupos test1 y test2 existen. test1 tiene 2 usuarios.

    Este script me urge para agregar 300 cuentas del grupo USERS a un nuevo grupo.

  8. Alex said

    En que lugar debo ejecutar el scrip, probe en la consola dentro del face y me genera un error, por favor si me puedes ayudar

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: