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…

PowerShell Tip: Cómo Enumerar Todas las Propiedades de una Clase de Active Directory

Posted by urpiano en Martes 13 \13\UTC marzo \13\UTC 2012

¿Tenemos curiosidad por saber qué atributos tiene una clase de Active Directory en concreto? ¿Queremos además saber de qué tipo son esos atributos? Con PowerShell esto se puede averiguar.

Saber las propiedades de una clase de Active Directory es tan simple como esto:

# Obtenemos un objeto DirectoryEntry con la definición de la clase en el esquema
$ClaseUsuario = [ADSI] "LDAP://Schema/User"
# Hay dos tipos de propiedades, requeridas y opcionales. El objeto
# DirectoryEntry que hemos obtenido tiene las propiedades MandatoryProperties y
# OptionalProperties, que son una array de cadenas con el nombre de cada una de
# dichas propiedades. Vamos a enumerarlas. Para poder hacer un listado numerado
# utilizaremos la variable $Propiedades, a la que iniciaremos a cero. Una vez
# iniciadas, recorreremos las propiedades requeridas y después las opcionales,
# poniendo el número de propiedad, si es o no requerida (R requerida, O
# opcional)
$Propiedades = 0
# Obtenemos la longitud de la cadena que representa el número total de
# propiedades en formato numérico con separador de miles y sin decimales, para
# así poder saber cuántos espacios añadir a la izquierda del número de porpiedad
# que se esté mostrando y que por tanto éste quede alineado a la derecha
$TotalPropiedades = $ClaseUsuario.MandatoryProperties.Count + `
                    $ClaseUsuario.OptionalProperties.Count
$Longitud = "$("{0:N0}" -f $TotalPropiedades)".Length
# Recorremos las propiedades requeridas
$ClaseUsuario.MandatoryProperties | ForEach{ `
    # Incrementamos el contador de propiedades
    $Propiedades++
    # Obtenemos el númeo actual de propiedad en formato numérico con separador
    # de miles y sin decimales
    $Numero = "{0:N0}" -f $Propiedades
    # Agregamos los espacios a la izquierda necesarios para que el número quede
    # alineado a la derecha 
    $Numero = "$(" " * ($Longitud - $Numero.Length))$Numero"
    # Mostramos la información de la propiedad actual
    "$Numero`: (R) $_ "
}
# Recorremos ahora las propiedades opcionales
$ClaseUsuario.OptionalProperties | ForEach{ `
    # Incrementamos el contador de propiedades
    $Propiedades++
    # Obtenemos el númeo actual de propiedad en formato numérico con separador
    # de miles y sin decimales
    $Numero = "{0:N0}" -f $Propiedades
    # Agregamos los espacios a la izquierda necesarios para que el número quede
    # alineado a la derecha 
    $Numero = "$(" " * ($Longitud - $Numero.Length))$Numero"
    # Mostramos la información de la propiedad actual
    "$Numero`: (O) $_ "
}
# Terminados los bucles de listado de las propiedades, procedemos ahora a
# mostrar los recuentos
""
"Propiedades requeridas: $("{0:N0}" -f $ClaseUsuario.MandatoryProperties.Count)"
"Propiedades opcionales: $("{0:N0}" -f $ClaseUsuario.OptionalProperties.Count)"
"Total propiedades     : $("{0:N0}" -f $Propiedades)"

No obstante, como podemos ver, tan sólo hemos obtenido los nombres de las propiedades, pero de qué tipo son, etc. Aunque parezca mentira, es más fácil obtener estos datos que la simple lista de nombres de propiedades que obteníamos consultados al esquema vía LDAP; basta con saber qué clase del Framework de .NET usar para obtener estos datos. Para ello utilizaremos la clase System.DirectoryServices.ActiveDirectory.ActiveDirectorySchema, que nos permite acceder, gracias a su método FindClass a la definición de la clase, y también a las colecciones de propiedades requeridas y opcionales, pero en esta ocasión no como sendos arrays de cadenas en los que cada elemento es el nombre de una propiedad, como pasaba cuando se obtenía la definición vía LDAP, si no como sendas colecciones de objetos System.DirectoryServices.ActiveDirectory.ActiveDirectorySchemaProperty, lo que permite obtener los atributos de las propiedades, como el nombre, la sintaxis que usa, etc. Veamos cómo hacer ésto

# Obtenemos acceso al Esquema
$Esquema = [System.DirectoryServices.ActiveDirectory.ActiveDirectorySchema]::GetCurrentSchema()
# Obtenemos la definición de la clase usuario
$Clase = $Esquema.FindClass("User")
# Mostramos las propiedades de la definición de la clase
"CommonName        `: $($Clase.CommonName)"
"Description       `: $($Clase.Description)"
"IsDefunct         `: $($Clase.IsDefunct)"
"Name              `: $($Clase.Name)"
"Oid               `: $($Clase.Oid)"
"PossibleInferiors `: $($Clase.PossibleInferiors)"
"PossibleSuperiors `: $($Clase.PossibleSuperiors)"
"SchemaGuid        `: $($Clase.SchemaGuid)"
"SubClassOf        `: $($Clase.SubClassOf)"
"Type              `: $($Clase.Type)"
""
# Vamos a mostrar las propiedades de la clase, y las mostraremos en forma
# de tabla con los campos que se ven a continuación
$Propiedades = "Syntax","IsSingleValued","IsIndexed","IsInGlobalCatalog","Name"
# Primero mosraremos las propiedades requeridas
"Propiedades Requeridas"
"======================"
$Clase.MandatoryProperties | Format-Table $Propiedades -AutoSize -Wrap
""
# Ahora mostraremos las propiedades opcionales
"Propiedades Opcionales"
"======================"
$Clase.OptionalProperties | Format-Table $Propiedades -AutoSize -Wrap
""
# Por último, mostraremos las clases auxiliares en formato tabla con los campos
# definidos a continuación
$Propiedades = "Name","IsDeFunct","Type","SchemaGuid"
"Clases Auxiliares"
"======================"
$Clase.AuxiliaryClasses | Format-Table $Propiedades -AutoSize -Wrap

# Vamos a mostrar un recuento
"Clases auxiliares      `: $("{0:N0}" -f $Clase.AuxiliaryClasses.Count)"
"Propiedades Requeridas `: $("{0:N0}" -f $Clase.MandatoryProperties.Count)"
"Propiedades opcionales `: $("{0:N0}" -f $Clase.OptionalProperties.Count)"
"Total Propiedades      `: $("{0:N0}" -f ($Clase.MandatoryProperties.Count + $Clase.OptionalProperties.Count))"

¿Mucho más completo ¿verdad?

¿Te estás preguntando como se pueden listar todas las clases o las propiedades del esquema? Se puede hacer usando los métodos FindAllClasses y FindAllProperties del objeto ActiveDirectorySchema:

$Esquema.FindAllClasses()
$Esquema.FindAllProperties()

¿Cómo se pueden listar todas las clases y propiedades del esquema que están desactivadas? Se puede, usando los métodos FindAllDefunctClasses y FindAllDefunctProperties del objeto ActiveDirectorySchema:

$Esquema.FindAllDefunctClasses()
$Esquema.FindAllDefunctProperties()

Por encaminamiento, se podría sacar toda esta documentación a un fichero si ponemos este código en un script y lo lanzamos redireccionando la salida (¡OJO! este código va a tardar lo suyo, pues una por una destripa todas las clases del esquema):

# Obtenemos acceso al Esquema
$Esquema = [System.DirectoryServices.ActiveDirectory.ActiveDirectorySchema]::GetCurrentSchema()
# Iniciamos el contador de clases
$NClases = 0
# Recorremos una a una todas las clases definidas en el esquema
$Esquema.FindAllClasses() | ForEach{
    # Incrementamos el contador de clases
    $NClases++
    # Mostramos las propiedades de la definición de la clase
    "CommonName        `: $($_.CommonName)"
    "Description       `: $($_.Description)"
    "IsDefunct         `: $($_.IsDefunct)"
    "Name              `: $($_.Name)"
    "Oid               `: $($_.Oid)"
    "PossibleInferiors `: $($_.PossibleInferiors)"
    "PossibleSuperiors `: $($_.PossibleSuperiors)"
    "SchemaGuid        `: $($_.SchemaGuid)"
    "SubClassOf        `: $($_.SubClassOf)"
    "Type              `: $($_.Type)"
    ""
    # Vamos a mostrar las propiedades de la clase, y las mostraremos en forma
    # de tabla con los campos que se ven a continuación
    $Propiedades = "Syntax","IsSingleValued","IsIndexed","IsInGlobalCatalog","Name"
    # Primero mosraremos las propiedades requeridas
    "Propiedades Requeridas"
    "======================"
    $_.MandatoryProperties | Format-Table $Propiedades -AutoSize -Wrap
    ""
    # Ahora mostraremos las propiedades opcionales
    "Propiedades Opcionales"
    "======================"
    $_.OptionalProperties | Format-Table $Propiedades -AutoSize -Wrap
    ""
    # Por último, mostraremos las clases auxiliares en formato tabla con los campos
    # definidos a continuación
    $Propiedades = "Name","IsDeFunct","Type","SchemaGuid"
    "Clases Auxiliares"
    "======================"
    $_.AuxiliaryClasses | Format-Table $Propiedades -AutoSize -Wrap

    # Vamos a mostrar un recuento
    "Clases auxiliares de $($_.Name)      `: $("{0:N0}" -f $_.AuxiliaryClasses.Count)"
    "Propiedades Requeridas de $($_.Name) `: $("{0:N0}" -f $_.MandatoryProperties.Count)"
    "Propiedades opcionales de $($_.Name) `: $("{0:N0}" -f $_.OptionalProperties.Count)"
    "Total Propiedades de $($_.Name)      `: $("{0:N0}" -f ($_.MandatoryProperties.Count + $_.OptionalProperties.Count))"
}
# Mostramos el total de clases encontradas
"Total Clases `: $NClases"

Una respuesta to “PowerShell Tip: Cómo Enumerar Todas las Propiedades de una Clase de Active Directory”

  1. […] PowerShell Tip: Cómo Enumerar Todas las Propiedades de una Clase de Active Directory […]

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: