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 Listar Las Membresías De Los Usuarios De Un Dominio

Posted by urpiano en Miércoles 20 \20\UTC diciembre \20\UTC 2006

Este script nos permite listar todos los usuarios de un dominio, obteniendo en el listado su nombre distinguido, su nombre para mostrar, el contenedor donde está y los grupos de los que es miembro.

La sintaxis para su uso es:

cscript //nologo listado-de-membresias.vbs [/S:[ruta]fichero] [D:dominioFQDN]

Donde:

  • /S es un fichero donde se volcará la salida. Si se omite, la salida se volcará en pantalla
  • /D es el nombre FQDN del dominio que se listará. Si se omite se listará el dominio en el cual está logado el usuario que lanza el script

Ejemplos:

  • cscript //nologo listado-de-membresias.vbs /s:c:Listadosusuarios-y-membresias.txt
  • cscript //nologo listado-de-membresias.vbs /s:c:Listadosusuarios-y-membresias-de-moria.txt /d:moria.mordor.org

Cabe destacar que se debe utilizar el modificador //nologo para así evitar que se "ensucie" el fichero de salida con el encabezado que situa cscript si no se pone ese modificador, lo cual entorpecería al abrirlo con Excel, por ejemplo.

Este es el código del script:

'******************************************************
'Script que devuelve las membresías y la OU a la
'que pertenecen todos los usuarios del dominio 
'
'recibe dos parámetros opcionales: 
'
'            /S: con la ruta y nombre de un fichero.
'                En este fichero se vuelca la
'                información en formato de valores
'                separados por tabuladores. Si se
'                omitie se vuelca la información
'                por pantalla
'            /d: nombre de dominio en formato FQDN
'                (ej: dominio.local) al que se
'                conectará para obtener el listado.
'                Si se omite se conectará al dominio
'                al que está conectado el usuario 
'            /?: muestra la ayuda en liínea
'
'La salida a pantalla o fichero se produce en
'formato de valores separados por tabuladores, lo
'que hace que al abrir el fichero en Excel tengamos
'los datos perféctamente separados por columnas
'
'©Fernando Reyes[MS MVP] 12/2006 
'******************************************************

Option Explicit

Dim obj_Conexion
Dim obj_Comando
Dim obj_RaizDSE
Dim obj_Usuario
Dim obj_FSO
Dim obj_TS
Dim str_Dominio
Dim str_Filtro
Dim str_Consulta
Dim obj_Recordset
Dim str_DN
Dim str_Fichero
Dim str_Linea
Dim obj_Grupo
Dim int_ContadorGrupos

'Conectamos con ODBC al Proveedor de Active Directory
Set obj_Conexion = CreateObject("ADODB.Connection")
Set obj_Comando = CreateObject("ADODB.Command")
obj_Conexion.Provider = "ADsDSOObject"
obj_Conexion.Open = "Active Directory Provider"
Set obj_Comando.ActiveConnection = obj_Conexion

'Si se ha pedido la ayuda en pantalla la mostramos y
'finalizamos la ejecución
If WScript.Arguments.Named.Exists("?") Then

    'Invocamos la ayuda
    Call s_Ayuda
    
    'Finalizamos la ejecución
    WScript.Quit 0
    
End If

'Si se ha recibido el parámetro con el nombre de fichero
'donde escribir la salida, lo recogemos en la variable
'str_Fichero
If WScript.Arguments.Named.Exists("S") Then

    'Recogemos el nombre del fichero
    str_Fichero = WScript.Arguments.Named.Item("S")

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

    'Creamos un objeto TextStream que maneja el fichero
    'creado. El fichero estará creado como Unicode
    Set obj_TS = obj_FSO.CreateTextFile(str_Fichero,,True)
    
    'Ponemos los nombres de columna
    obj_TS.WriteLine "Nombre Distinguido" & vbTab & _
                     "Nombre Para Mostrar" & vbTab & _
                     "Contenedor" & vbTab & _
                     "Miembro de"

End If

'Si se ha recibido el parámetro con el nombre DNS del
'dominio lo recogemos en la variable str_Dominio
If WScript.Arguments.Named.Exists("D") Then

    'Como el nombre de dominio está en formato DNS
    '(dominio.com), lo pasamos a formato LDAP
    '(DC=dominio,DC=com)
    str_Dominio = "DC=" & _
                  Replace( _
                     WScript.Arguments.Named.Item("D"), _
                     ".", _
                     ",DC=")

'Si no recibimos el nombre del dominio usaremos el
'del usuario que lanza el script
Else

    'Obtenemos el nombre del dominio con la propiedad
    'defaultNamingContext del objeto RootDSE
    Set obj_RaizDSE = GetObject("LDAP://RootDSE")
    str_Dominio = obj_RaizDSE.Get("defaultNamingContext")

End If

'Creamos la cadena de consulta
str_Filtro = "(&(objectCategory=person)(objectClass=user))"
str_Consulta = "<LDAP://" & str_Dominio & ">;" & str_Filtro _
               & ";distinguishedName;subtree"

'Establecemos la consulta y las propiedades de la misma
obj_Comando.CommandText = str_Consulta
obj_Comando.Properties("Page Size") = 100
obj_Comando.Properties("Timeout") = 30
obj_Comando.Properties("Cache Results") = False

'Ejecutamos la consulta
Set obj_Recordset = obj_Comando.Execute

'Recorremos todos los usuarios del dominio
Do Until obj_Recordset.EOF

    'Obtenemos el nombre distinguido del usuario
    str_DN = obj_Recordset.Fields("distinguishedName")

    'Creamos un objeto usuario con su nombre distinguido
    Set obj_Usuario = GetObject("LDAP://" & str_DN)

    'Mostramos su nombre distinguido, su nombre para mostrar
    'sus membresías y la OU a la que pertenece. Controlamos
    'si hemos recibido fichero donde volcar la información:
    'en caso afirmativo lo volcamos en el fichero, en caso 
    'negativo lo mostramos en pantalla

    str_Linea = """" & Replace(obj_Usuario.distinguishedName, _
                               """","'") & """" & vbTab

    If Len(obj_Usuario.displayName) > 0 Then

        str_Linea = str_Linea & """" & _
                    Replace(obj_Usuario.displayName, _
                            """","'") & """"

    End If

    str_Linea = str_Linea & vbTab & """" & _
                f_Contenedor(obj_Usuario.Parent,str_Dominio) & _
                """" & vbTab

    'Ponemos a cero el contador de grupos
    int_ContadorGrupos = 0
    
    'Recorremos ahora el array de grupos a los que pertenece
    'el usuario
    For Each obj_Grupo In obj_Usuario.Groups
    	
    	  'Incrementamos el contador de grupos
    	  int_ContadorGrupos = int_ContadorGrupos + 1
    	  
    	  'En el momento en que el contador de grupos sea mayor que 1
    	  'necesitamos un salto de línea y un tabulador por cada uno
    	  'de los campos anteriores al de grupos.
    	  If int_ContadorGrupos > 1 Then str_Linea = str_Linea & _
    	                                             vbCrLf & vbTab & _
    	                                             vbTab & vbTab

    	  'Ponemos el nombre del grupo eliminando el "CN="
    	  str_Linea = str_Linea & Replace(obj_Grupo.Name,"CN=","")
    	      	
    Next                              


    'Si no se ha recibido el parámetro de fichero, volcamos la línea
    'en pantalla
    If str_Fichero = "" Then

        WScript.Echo  str_Linea

    'en caso contrario la volcamos en el fichero
    Else

        obj_TS.WriteLine str_Linea	

    End If

    'Saltamos al siguiente registro
    obj_Recordset.MoveNext

Loop

'Si se ha creado un fichero de salida, lo cerramos
If Len(str_Fichero) > 0 Then obj_TS.Close

'Salimos del script limpiándonos el culito :o)
obj_Conexion.Close
Set obj_Conexion = Nothing
Set obj_RaizDSE = Nothing
Set obj_Recordset = Nothing
Set obj_Comando = Nothing
Set obj_FSO = Nothing
Set obj_TS = Nothing

'******************************************************************
'******************************************************************

Function f_Contenedor(str_Contenedor, str_Dominio)
'Esta función recibe el nombre distnguido de un contendor de AD, el
'nombre distinguido del dominio y devuelve el nombre del contenedor
'en formato dominioFQDNrutacontenedor. Por ejemplo:

' Contendor "OU=OU2,OU=OU1,DC=dominio,DC=local"
' Dominio "DC=dominio,DC=local"
' Devuelve "dominio.localOU1OU2

    Dim str_Temporal
    Dim int_Elemento
    Dim arr_Contenedor
    Dim arr_Dominio
    Dim int_Dominio
    
    'Cargamos en un array el nombre del dominio suprimiendo 
    'los "DC=" y considerando como separador la coma.
    'Es decir que primero convertimos "DC=dominio,DC=local" en
    '"dominio,local" y esto lo cargamos en el array, con la coma
    'como separador, lo que nos da los elementos "dominio" y "local"
    arr_Dominio = Split(Replace(str_Dominio,"DC=",""),",")
    
    'Guardamos en la variable el límite superior del array (el 
    'dominio podría haber sido subdominio.dominio.local, por ejemplo
    int_Dominio = UBound(arr_Dominio)
    
    'Cargamos ahora el nombre distinguido del usuario en la variable
    'temporal. Usamos repetidas llamadas a la función replace para
    'conseguir que algo como "CN=Gimli,OU=Montaña Solitaria,DC=enanos,DC=org"
    'se convierta en "Gimli,Montaña Solitaria,enanos,org" y así poder
    'cargar un array usando como separador la coma
    str_Temporal = Replace( _
                           Replace( _
                                   Replace( _
                                           Replace( _
                                                   Replace( _
                                                           obj_Usuario.Parent, _
                                                           """", _
                                                           "'"), _
                                                   "LDAP://", _
                                                   ""), _
                                           "DC=", _
                                           ""), _
                                   ",OU=", _
                                   ","), _
                           "OU=", _
                           "") 
    
    'Cargamos el array
    arr_Contenedor = Split(str_Temporal,",")
    
    'Vaciamos la variable temporal
    str_Temporal = ""
    
    'Ahora recorreremos el array del último al primer elemento
    For int_Elemento = UBound(arr_Contenedor) To LBound(arr_Contenedor) Step -1
    	
        'Si el límite superior menos el elemento actual es menor o igual que
        'el límite superior del array de dominio, significa que estamos en la
        'parte del nombre correspondiente al dominio. Como queremos que esta
        'parte quede con el nombre FQDN del dominio, debemos encadenar los
        'elementos por delante de lo anterior y separado por un punto (estamos
        'recibiendo antes el "local" que el "dominio")
    	  If (UBound(arr_Contenedor) - int_Elemento) <= int_Dominio Then
    	  	
    	      str_Temporal = arr_Contenedor(int_Elemento) & "." & str_Temporal
    	      
    	  Else
    	  	
    	  	  'Ya no estamos en la parte de dominio, a partir de ahora queremos
    	  	  'que se encadenen los elementos detrás de lo anterior. Antes debemos 
    	  	  'comprobar si estamos en el primer elemento después de los de 
    	  	  'dominio, en cuyo caso hay que borrar el punto que hay siempre al
    	  	  'final después de haber montado el nombre del dominio. Necesitamos
    	  	  'además que ese punto final sea un slash inverso ("")
    	  	  '
    	      If (UBound(arr_Contenedor) - int_Elemento) = (int_Dominio + 1) Then
    	          
    	          'Quitamos el punto final y pegamos un slash inverso
    	          str_Temporal = Left(str_Temporal,Len(str_Temporal)-1) & ""
    	          
    	      End If
    	      
    	      'En cualquier caso, concatenamos el elemento y un slash inverso
    	      'detrás
    	      str_Temporal = str_Temporal & arr_Contenedor(int_Elemento) & ""
    	      
    	  End If
    	
    Next

    'Nos sobra un slsh inverso al final, lo quitamos
    str_Temporal = Left(str_Temporal,Len(str_Temporal) - 1)
    
    'Devolvemos la cadena que hemos montado
    f_Contenedor = str_Temporal

End Function

Sub s_Ayuda()

    WScript.Echo "listado-de-usuarios-con-membresias.vbs"
    WScript.Echo ""
    WScript.Echo "Script que devuelve las membresías y la OU a la"
    WScript.Echo "que pertenecen todos los usuarios del dominio."
    WScript.Echo ""
    WScript.Echo "Sintaxis"
    WScript.Echo ""
    WScript.Echo "cscript [//nologo] listado-de-usuarios-con-membres" & _
                 "ias.vbs [/s:fichero] [d:dominio] [/?]"
    WScript.Echo "            /S: con la ruta y nombre de un fichero."
    WScript.Echo "                En este fichero se vuelca la"
    WScript.Echo "                información en formato de valores"
    WScript.Echo "                separados por tabuladores. Si se"
    WScript.Echo "                omitie se vuelca la información"
    WScript.Echo "                por pantalla"
    WScript.Echo "            /d: nombre de dominio en formato FQDN"
    WScript.Echo "                (ej: dominio.local) al que se"
    WScript.Echo "                conectará para obtener el listado."
    WScript.Echo "                Si se omite se conectará al dominio"
    WScript.Echo "                al que está conectado el usuario"
    WScript.Echo "            /?: muestra la ayuda en línea"
    WScript.Echo ""
    WScript.Echo "La salida a pantalla o fichero se produce en"
    WScript.Echo "formato de valores separados por tabuladores, lo"
    WScript.Echo "que hace que al abrir el fichero en Excel tengamos"
    WScript.Echo "los datos perféctamente separados por columnas"
    WScript.Echo ""
    WScript.Echo "Ejemplos"
    WScript.Echo ""
    WScript.Echo "- Muestra por pantalla los usuarios y sus memebresías"
    WScript.Echo "  del dominio en el cual está logado el usuario que"
    WScript.Echo "  lanza el script:"
    WScript.Echo ""
    WScript.Echo "cscript listado-de-usuarios-con-membresias.vbs"
    WScript.Echo ""
    WScript.Echo "- Muestra por pantalla los usuario y sus memebresías"
    WScript.Echo "  del dominio cuyo nombre FQDN es moria.mordor.org"
    WScript.Echo ""
    WScript.Echo "cscript listado-de-usuarios-con-membresias.vbs /d:m" & _
                 "oria.mordor.org"
    WScript.Echo ""
    WScript.Echo "- Vuelca al fichero c:ListadosComarca.txt los usuarios"
    WScript.Echo "  del dominio cuyo FQDN es comarca.tierramedia.info"
    WScript.Echo ""
    WScript.Echo "cscript listado-de-usuarios-con-membresias.vbs /s:" & _
                 "c:ListadosComarca.txt /d:comarca.tierramedia.info"

End Sub

16 comentarios to “Script VBScript Para Listar Las Membresías De Los Usuarios De Un Dominio”

  1. victor said

    Con este script podria sacar una lista pero omitiendo a los usuarios deshabilitados??

    Muchas gracias.

  2. There’s definately a lot to find out about this subject. I love all of the points you made.

  3. Hi, Neat post. There’s a problem along with your web site in web explorer, might check this? IE still is the market chief and a good component to folks will omit your magnificent writing because of this problem.

  4. Hey there. I was contemplating adding a hyperlink back to your website since both
    of our web sites are based mostly around the same topic.
    Would you prefer I link to you using your site address: http://urpiano.
    wordpress.com/2006/12/20/script-vbscript-para-listar-las-membresias-de-los-usuarios-de-un-dominio/ or web
    site title: Script VBScript Para Listar Las Membresías De Los Usuarios De Un Dominio El
    Blog de Gualtrysoft. Be sure to let me know at your earliest convenience.
    Thanks alot :)

  5. I’m curious to find out what blog system you’re working with?
    I’m having some minor security issues with my latest site and I would like to find something more risk-free. Do you have any recommendations?

  6. Shelli said

    When I originally commented I clicked the “Notify me when new comments are added” checkbox and now each time a comment is added
    I get several e-mails with the same comment.
    Is there any way you can remove my fathers son from that service?

    Thanks a lot!

  7. Hi there. I noticed your website title, “Script VBScript Para Listar Las Membresías De Los Usuarios De Un Dominio El Blog de Gualtrysoft” does not really reflect the content of
    your web page. When creating your blog title, do you believe
    it’s best to write it for SEO or for your viewers? This is one thing I’ve been battling with simply because I want
    good rankings but at the same time I want the best quality for my website visitors.

  8. Woah! I’m really loving the template/theme of this blog. It’s simple, yet effective.
    A lot of times it’s tough to get that “perfect balance” between user friendliness and visual appearance. I must say that you’ve done a great job with this.
    In addition, the blog loads extremely quick for me on Opera.
    Exceptional Blog!

  9. I’ve loaded your blog in Three different web browsers and I must say this website loads a lot quicker then most. Would you mind e-mailing me the company name of your hosting company? My personal email is: carmonhinton@inbox.com. I will even sign up through your affiliate link if you would like. Thanks

  10. Dwain said

    I own a new tai-chi studio in the Midwest.

    Believe it or not, I don’t possess a site still. The issue is I am not sure whether to go with Blogger or Live journal. I discover that I would like much more of a blog feel than a site feel, if that tends to make any sense. I want to be able to update my web-site with blog posts. Would you be capable of give a couple of benefits and drawbacks for going with either Blogger or Live journal? I actually want to come to a selection relatively swiftly on this , cause doesn’t make sense for me to own this facility with out a website.
    It would be kind if you could give me some tips. Please write to: dwaintrotter@hailmail.

    net if you have some spare time. Thx, and by the way wonderful site,
    i need my blog to be like the one you have one day!

  11. Hello there! It seems as though we both have a
    interest for the same thing. Your blog, “Script VBScript Para Listar Las Membresías De Los Usuarios De Un Dominio El Blog de Gualtrysoft” and mine are very similar.

    Have you ever thought about authoring a guest post for a related website?
    It will certainly help gain publicity to your blog
    (my website recieves a lot of traffic). If you might be
    interested, contact me at: jerriboston@aol.com. Thank you so much

  12. Hi there great website! Does running a blog such as this require a great deal of work?
    I’ve very little knowledge of programming but I was hoping to start my own blog in the near future. Anyways, should you have any recommendations or tips for new blog owners please share. I know this is off subject but I just needed to ask. Kudos!

  13. Hi there, I am blogger like you, and wanted to ask, since Googles Panda Update, my site gets nowhere found any more :( However
    when i looked for Script VBScript Para Listar Las Membresías
    De Los Usuarios De Un Dominio El Blog de Gualtrysoft your internet site was around the 1st page.
    Care to reveal any suggestions with me? I privately use only DuckDuckGo as internet search engine given that Google screwed virtually all up.
    DuckDuckGo is a lot like Google prior to they decided to favor only the massive monster sites!

  14. Howdy are using WordPress for your site platform?
    I’m new to the blog world but I’m trying to get started and create my own.
    Do you require any html coding expertise to make your own blog?
    Any help would be greatly appreciated!

  15. Lisette said

    I am starting a new internet blog directory and was wanting to know if I
    can submit your blog? I’m hoping to increase my directory slowly by hand so that it retains good quality. I’ll make sure and put
    your blog in the appropriate category and I’ll additionally use, “Script VBScript Para Listar Las Membresías De Los Usuarios De Un Dominio El Blog de Gualtrysoft” as your anchor text. Please make sure to let me know if this is alright with you by contacting me at: lisette_wiles@googlemail.com. Cheers

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: