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 Para Mostrar Los GUIDs De Todos Los Usuarios De Un Dominio

Posted by urpiano en Lunes 4 \04\UTC diciembre \04\UTC 2006

Este Script de VBScript nos permite mostrar los GUIDs de todos los usuarios de un dominio. La sintaxis de llamada es:

cscript //nologo lista-guids-usuarios-dominio.vbs [-o:[ruta]nombre fichero CSV] [-d:FQDN del dominio]

Parámetros:

  • o (opcional): Fichero de salida de los datos. Si no se especifica, la salida se realiza por pantalla, si se especifica se realiza en el fichero pasado como parámetro en formato de fichero de valores separado por comas (CSV).
  • d (opcional): Nombre FQDN del dominio que se quiere consultar (ej: foldeeste.rohan.local). En caso de omitirse se consulta en el dominio al cual pertenezca el usuario que ha lanzado el script. Obviamente, el usuario que lance el script debe tener permisos de lectura en el dominio consultado.

Ejemplos:

  1. cscript //nologo lista-guids-usuarios-dominio.vbs >> Muestra por pantalla los GUIDs de los usuarios del dominio en el que está validado el usuario que lanza el script.
  2. cscript //nologo lista-guids-usuarios-dominio.vbs -o:c:RohanFoldeEste.csv >> Vuelca al fichero csv c:RohanFoldeEste.csv los GUIDs de los usuarios del dominio en el que está logado el usuario que lanza el script.
  3. cscript //nologo lista-guids-usuarios-dominio.vbs -d:foldeoeste.rohan.com >> Muestra por pantalla los GUIDs de los usuarios del dominio foldeoeste.rohan.com.
  4. cscript //nologo lista-guids-usuarios-dominio.vbs -d:cuadernasur.comarca.hob -o:c:ComarcaCuadernaSur.csv >> Vuelca en el fichero c:ComarcaCuadernaSur.csv los GUIDs de los usuarios del dominio cuadernasur.comarca.hob

Éste es el código del Script:

'******************************************************
'* Script que devuelve el objectGUID de rodos los     *
'* usuarios del dominio                               *
'*                                                    *
'* ©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 str_DistinguishedName
Dim str_DisplayName
Dim str_objectGUID

'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 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)
    
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
    ' y su objectGUID. Como objectGUID se trata de un array
    'de bytes, lo debemos concatenar, para ello llamamos al
    'procedimiento que realiza esta tarea. Copntrolamos 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_DistinguishedName = obj_Usuario.distinguishedName
    str_DisplayName = obj_Usuario.displayName
    str_objectGUID = obj_Usuario.Get("objectGUID")
    
    str_Linea = """" & Replace(obj_Usuario.distinguishedName, _
                               """","'") & ""","
    
    If Len(obj_Usuario.displayName) > 0 Then
    	
        str_Linea = str_Linea & """" & _
                    Replace(obj_Usuario.displayName, _
                            """","'") & """"
                            
    End If
    
    str_Linea = str_Linea & ","

    str_Linea = str_Linea & f_ArrayBACadena( _
                                   obj_Usuario.Get("objectGUID"))
    
    If str_Fichero = "" Then
    	
        WScript.Echo  str_Linea
        
    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


Public Function f_ArrayBACadena(arr_Array)
'Esta función recibe un array de Bytes y devuelve una cadena con la
'concatenación de los caracteres representados por los valores 
'ASCII de esos bytes.
    
    Dim lng_Byte
    Dim str_Devolucion
    
    str_Devolucion = ""
    
'    If IsArray(arr_Array) Then
        
        For lng_Byte = 1 To LenB(arr_Array)
        
            'Vamos concatenando en la devolución el valor del
            'del byte en formato Hexadecimal, recorriendo las
            'posiciones del array. Concatenamos 0 a la izquierda
            'y nos aseguramos que concatenamos los dos primeros
            'caracteres de la derecha, de esa manera hacemos que
            'tanto los valores inferiores como los superiores a 16
            'tengan dos dígitos
            str_Devolucion = str_Devolucion & Right("0" & _
                        Hex(AscB(MidB(arr_Array,lng_Byte,1))),2)
        
        Next
        
'    End If
    
    f_ArrayBACadena = str_Devolucion

End Function


Por cierto, que se puede hacer también con CSVDE:


csvde -d “DC=dominio,DC=local” -p Subtree -r “(&(objectClass=User)(objectCategory=Person))” -l “dn,displayName,objectGUID” -f c:ListadoUsuarios.csv


Pero no me gusta por lo siguiente:

  1. A lo mejor existe, pero no consigo encontrar el filtro -r capaz de mostrar tan solo los usuarios, éste que pongo muestra usuarios y contactos.
  2. El campo displayName se mostrará como una sucesión de bytes (y no como texto) en el caso de que el usuario contenga caracteres no ingleses (acentos, eñes, etc.), lo cual no es deseable.
  3. objectGUID se presenta como X’411253452342323423452345234′ en lugar de como 411253452342323423452345234, lo que provoca trabajo posterior en Excel a la hora de importar los datos.
  4. La exportación suele dar problemas con los nombres distinguidos o rutas LDAP en general (CN=Usuario,OU=Unidad,DC=dominio,DC=local), pues al tener comas y no siempre estar delimitadas por comillas, al importar cada parte de la ruta se irá a una columna distinta en algunas de las líneas.


Con el script VBScript, ninguno de estos tres comportamientos se producen:

  1. 1.- Sólo se obtienen los usuarios.
  2. El campo displayName se muestra correcto, con sus acentos, eñes, etc.
  3. El campo objectGUID se presenta sin la X inicial y sin estar encerrado entre comillas simples.
  4. La exportación está perfectamente hecha para ser importada sin problemas por Excel.


Si quieres saber más de CSVDE, este enlace es muy bueno:


CSVDE – Examples Import Export of user accounts Active Directory
http://www.computerperformance.co.uk/Logon/Logon_CSVDE.htm

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: