¡ Hola, chicos del scripting! Examinar Active Directory

The Microsoft Scripting Guys

Descarga de código disponible en: HeyScriptingGuy2009_02.exe(151 KB)

Contenido

Lo que ayuda
El Nitty-Gritty
Funciones auxiliares

Como quizá sepa, se convierten el Editor de secuencias de comandos y se han sólo recientemente en los chicos nuevo a tiempo completo del scripting de Microsoft y gran parte de nuestro tiempo últimamente reúne a través de los miles de mensajes de correo electrónico que se ha empleado la scripter@microsoft.comcuenta de correo electrónico. Adentra territorio sin tener realmente encargado un estudio, nos gustaría desconocido estimar que la pregunta de correo electrónico número uno que hemos visto es "Dónde puedo obtener el explorador de Active Directory." Pero, ¿adivine qué? Hemos no visto nunca lo. Hemos observado y visto pero no se pudo encontrar.

Por último, después de colocar un número de mensajes secretos en un tablero de mensajes de Internet, se obtuvo una respuesta codificada que, cuando descifrarse, indica que nos que el Scriptomatic para ADSIes en realidad el explorador de Active Directory. Bien, no se utiliza el explorador de Active Directory y su finalidad no es realmente exploración Active Directory (es ayudarle crear secuencias de comandos ADSI), por lo que Decidí escribir una secuencia de comandos Power­Shell de Windows que le permitiría, busque el esquema de Active Directory. Se denomina, oddly suficiente, la BrowseActiveDirectory­Schema.ps1, y se muestra en la figura 1 .

La figura 1 BrowseActiveDirectorySchema.ps1

Param($action,$class, [switch]$help)

Function GetHelp()
{
  $helpText= '
@"
 DESCRIPTION:
 NAME: BrowseActiveDirectorySchema.ps1
 Browse Active Directory Schema. Lists Classes, and properties. 

 PARAMETERS: 
 -Action <L(ist all classes), M(andatory), O(ptional), F(ind)>
 -Class class to search: user, computer, person, contact etc
 -Help displays this help topic

 SYNTAX:
 BrowseActiveDirectorySchema.ps1 -A L
 Lists the name of each class defined in the AD schema

 BrowseActiveDirectorySchema.ps1 -A M -c user
 Lists the mandatory properties of the user class

 BrowseActiveDirectorySchema.ps1 -A O -c computer
 Lists the optional properties of the computer class

 BrowseActiveDirectorySchema.ps1 -A F -c user
 Lists all Active Directory Classes that contain the word user 
 in the actual class name

 BrowseActiveDirectorySchema.ps1 -Action Find -c user
 Lists all Active Directory Classes that contain the word user 
 in the actual class name

 BrowseActiveDirectorySchema.ps1 -help
 Prints the help topic for the script
"@ #end helpText
  $helpText
} #end GetHelp
Function GetADSchema($Action, $class)
{
 $schema = [DirectoryServices.ActiveDirectory.ActiveDirectorySchema]::GetCurrentSchema()
 Switch ($Action)
  {
   "classes" { 
              $schema.FindAllClasses() | 
              Select-Object -Property Name 
             }
   "Mandatory" 
             {
              "Mandatory Properties of $class object"
              ($schema.FindClass("$class")).MandatoryProperties | 
               Format-Table -Property Name, Syntax, IsSingleValued -AutoSize 
             }
   "Optional" 
             {
              "Optional Properties of $class object"


              "This might take a few seconds ..."
              ($schema.FindClass("$class")).OptionalProperties | 
              Format-Table -Property Name, Syntax, IsSingleValued -AutoSize 
             }
   "Find" 
             {
              $schema.FindAllClasses() | 
              Where-Object { $_.name -match "$class" } |
              Select-Object -property name
             }
   DEFAULT {"$action is not a valid action." ; GetHelp ; Exit}
  }
} #end GetADSchema

Function GetAllClasses()
{
 GetAdSchema("classes")
} #end GetAllClasses

Function GetMandatory($class)
{
 GetAdSchema -action "Mandatory"  -class $class 
} #end GetMandatory

Function GetOptional($class)
{
 GetAdSchema -action "Optional"  -class $class 
} #end GetOptional

Function FindClasses($class)
{
 GetAdSchema -action "Find" -class $class
} #end FindClasses
# *** Entry Point to Script ***
if($help) { GetHelp ; Exit }

Switch ($action)
{
 "L" {GetAllClasses ; Exit}
 "M" {GetMandatory($class) ; Exit}
 "O" {GetOptional($class) ; Exit}
 "F" {FindClasses($class) ; Exit}
 DEFAULT { "$action is not a valid action." ; GetHelp ; Exit} 
}

Como puede ver, la secuencia de comandos comienza con la instrucción de parámetro. Esto se utiliza para crear tres parámetros de línea de comandos que permiten modificar la secuencia de comandos al ejecutarse, en lugar de tener que modificar la secuencia de comandos para ver el diferente comportamiento, que es muy útil:

Param($action,$class, [switch]$help)

Si, por ejemplo, desea ver las propiedades obligatorias de la clase de usuario en servicios de dominio de Active Directory (AD DS) y se especifican el –action CARACTERÍSTICAS el usuario –class, del modo que se muestra en La figura 2 .

fig02.gif

La Figura 2 ver las propiedades obligatorias de la clase de usuario

Puede elegir sólo tan fácilmente las propiedades opcionales de la clase de grupo. Esto es la ventaja de utilizar los parámetros de la línea de comandos: se puede modificar el comportamiento de una secuencia de comandos en tiempo de ejecución, en lugar de tener que volver a empezar. Esto es una práctica recomendada al escribir secuencias de comandos que va a utilizar como utilidades, en lugar de que se utiliza sólo una vez.

Lo que ayuda

La sección siguiente de la secuencia de comandos en la figura 1 muestra la función GetHelp. Cuando se escribe una secuencia de comandos que expone los parámetros de la línea de comandos, es mejor práctica para incluir una función que se mostrará ayuda para utilizar la secuencia de comandos. No desea que los usuarios de la secuencia de comandos a tener que abrir y leer todo el texto para averiguar lo que hace. Es True, un principio Guía de diseño de la secuencia de comandos es que una secuencia de comandos debe ser legible, pero si se incluye una función de ayuda, facilitar vida para los usuarios.

La función GetHelp muestra información en la misma manera que el cmdlet Get-Help. Se muestran tres secciones del texto: descripción, parámetros y sintaxis. GetHelp hace dos cosas. Crea un aquí, la cadena que contiene el texto que se va a mostrar, y, a continuación, la muestra el contenido de la variable que contiene la cadena de aquí (en este caso, es $ helpText).

Una cadena, aquí es una construcción de Windows PowerShell que permite escribir información y dar formato a la salida sin preocuparse por citar las reglas. Todo lo que escribe en la cadena, aquí se trata como texto. Se llama a GetHelp cuando la secuencia de comandos está ejecución con el modificador –help o si alguien escribe un parámetro incorrecto. la figura 3 muestra el resultado de llamar a la secuencia de comandos con el modificador –help.

fig03.gif

La figura 3 llamar A la secuencia de comandos con the–help cambiar

El Nitty-Gritty

Ahora que hemos llegado a la función GetAD­Schema, que realiza la mayor parte del trabajo real de la secuencia de comandos en la figura 1 . La clave aquí es utilizar la clase DirectoryServices.ActiveDir­ectory.ActiveDirectorySchema Microsoft .NET Framework. Al poner entre corchetes y después de la clase con dos puntos dobles, puede obtener acceso a los métodos estáticos de la clase (en este caso, GetSchema Y y Get­CurrentSchema).

El método estático GetCurrent­Schema devuelve una instancia de una clase Active­DirectorySchema que representa el esquema al que está conectado actualmente. la figura 4 muestra los miembros de la clase ActiveDirectorySchema.

fig04.gif

Después de crear una instancia de la clase DirectoryServices.ActiveDirectory.ac­tive­Schema .NET Framework y el almacén del objeto de esquema resultante en la variable $ esquema, debe decidir qué acción para llevar a cabo. Para ello, una instrucción switch evalúa el valor que se pasa a ella desde la variable de acción $.

Basándose en la condición que se cumple, la función se buscar todas las clases en AD DS, mostrar propiedades obligatorias u opcionales de una clase concreta o buscar una clase que cumple un dados criterios. Cuando se utiliza el modificador, es mejor práctica para incluir siempre una condición predeterminada.

Funciones auxiliares

Para dividir parte del código y facilitar expandir la secuencia de comandos, he incluido un número de Ayudante funciones que se denominan basándose en los parámetros pasa a la secuencia de comandos cuando se ejecuta. Cada una de las funciones auxiliares llama GetADSchema y pasa un conjunto diferente de parámetros, según el valor proporcionado para el parámetro –action desde la línea de comandos.

La primera función de auxiliar es GetAllClasses, que llama GetADSchema y le pasa la palabra "clases". Cuando la instrucción de cambiar de la función GetAD­Schema coincide con la cadena "clases", llama al método FindAllClasses de la clase ActiveDirectorySchema. Aquí es el código llama a la instrucción switch:

"classes" { 
              $schema.FindAllClasses() | 
              Select-Object -Property Name'

Y aquí es la función GetAllClasses:

Function GetAllClasses()
{
GetADSchema("classes")
} #end GetAllClasses

La siguiente función de Ayudante es GetMandatory, cuyo propósito es para devolver propiedades obligatorias del objeto especificado en el parámetro –class cuando se ejecuta la secuencia de comandos. La función GetMandatory recibe el valor de $ clase desde la línea de comandos mediante el parámetro –class. Cuando GetMandatory llama a la función GetADSchema, pasa dos parámetros. Porque se se pasan dos parámetros, considere especifica el nombre de parámetro completa para ambos, una práctica recomendada hacer el código más fáciles de leer y comprender. En cambio, en la función GetAllClasses, se no utilizar el –action parámetro nombre cuando se llama a la función GetADSchema. En ese caso, el valor "clases" se pasa de una forma de posición.

Cuando se llama a la función GetADSchema, utiliza el método FindClass de la clase ActiveDirectorySchema para recuperar la clase que se especifica en la variable de clase $. Devuelve una instancia de una clase ActiveDirectorySchemaClass. Los miembros de esta clase se muestran en la figura 5 .

fig05.gif

La función de GetADSchema siguiente consulta la propiedad MandatoryProperties del objeto y los resultados para el cmdlet Format-Table, donde elige las propiedades Name, la sintaxis y IsSingleValued de canalizaciones. El parámetro –autosize cambiado del cmdlet Format-Table cambia automáticamente el tamaño de las columnas para evitar cortar desactivar valores de propiedad, si es posible. El código que ejecuta cuando la cadena "obligatorio" está asociado se muestra aquí:

"Mandatory" 
       {
       "Mandatory Properties of $class object"
       ($schema.FindClass("$class")).MandatoryProperties | 
       Format-Table -Property Name, Syntax, IsSingleValued -AutoSize 
       }

Y aquí es la función GetMandatory:

Function GetMandatory($class)
{
 GetAdSchema -action "Mandatory" -class $class 
} #end GetMandatory

Ahora veamos cómo la función Get­Optional puede presentar las propiedades opcionales de una clase de AD DS. GetOptional acepta el valor de clase de $ que se recibió desde la línea de comandos mediante el parámetro –class, a continuación, pasa el valor de clase $ a la función GetADSchema along with la acción denominada "opcional".

Cuando está asociada la cadena "opcional" en la instrucción switch, se imprime un mensaje en la pantalla para explicar que muestra las propiedades opcionales puede tardar unos segundos. A continuación, se llama al método FindClass de la clase ActiveDirectorySchema. El método FindClass devuelve una instancia de una clase ActiveDirectory­SchemaClass. Si se consulta la propiedad Optional­Properties de la clase ActiveDirectorySchema­Class, desea devolver las propiedades opcionales definidas para la clase elegida en AD DS.

Los resultados son canalizados al cmdlet Format-Table, que muestra la la información en la misma manera como lo haría para las propiedades obligatorias. Éste es esa sección del código:

"Optional" 
      {
      "Optional Properties of $class object"
      "This might take a few seconds ..."
      ($schema.FindClass("$class")).OptionalProperties | 
      Format-Table -Property Name, Syntax, IsSingleValued -AutoSize 
      }

El código siguiente es la función de GetOptional completa:

Function GetOptional($class)
{
 GetAdSchema -action "Optional"  -class $class 
} #end GetOptional

La función auxiliar final es FindClasses, que llama a la función GetADSchema y le pasa dos valores. El primero es la acción de buscar y el segundo es la clase que se va a buscar. El propósito de esta función es ayudar al usuario identificar clases en el esquema de AD DS que podría merit más exploración.

Supongamos que estaba interesado en trabajando con el correo electrónico. En ese caso, que desee ver que las clases relacionadas con correo electrónico, qué propiedades existen para una clase correspondiente. Como se muestra la figura 6 , en primer lugar se ejecute la secuencia de comandos con la f –action y –class correo parámetros. Esto devuelve todas las clases que tienen la cadena "mail" contenido en algún lugar en el nombre. Después de encontrar una clase que le interesa, explore las propiedades de la clase seleccionando la acción m (para obligatorio) y especificar el parámetro –c (de clase), seguido del nombre exacto de la clase.

fig06.gif

Figura 6 la búsqueda de una clase en el esquema de AD DS

Cuando la función FindClasses llama a la GetADSchema, se llama al método FindAllClasses y la colección de clases de ActiveDirectorySchemaClass resultante se envía a través de la canalización. La WHERE-Object utiliza una coincidencia de modelo de expresión regular para buscar las clases que coincide con el valor almacenado en la variable de clase $. Este es el código:

"Find" 
    {
    $schema.FindAllClasses() | 
    Where-Object { $_.name -match "$class" } |
    Select-Object -property name

Y esto es la función FindClasses:

Function FindClasses($class)
{
 GetAdSchema -action "Find" -class $class
} #end FindClasses

Después de definen todas las funciones auxiliares, llega el punto de entrada a la secuencia de comandos. El punto de entrada sólo una cosa: examina la línea de comandos y determina qué función para llamar a. Lo primero que es activado es la presencia del parámetro –help. Si la secuencia de comandos se ejecuta con –h o –help, la secuencia de comandos llamar a la función de GetHelp para mostrar la Ayuda y, a continuación, salir, los siguientes:

if($help) { GetHelp ; Exit }

Porque el parámetro –help se buscó primero, su presencia en la línea de comandos trumps todo lo demás. Si no se ha utilizado el parámetro –help, la secuencia de comandos debe evaluar el valor proporcionado para el parámetro –action, que es el parámetro predeterminado. Todo lo escrito en la línea de comandos se interpretará como un valor de –action si se utiliza nada más. Esto proporciona la ventaja de permitir la captura de fantasma entrada a la secuencia de comandos.

La instrucción switch es una herramienta natural para evaluar los valores proporcionados para –action. Cuatro acciones se definen, cada uno de los cuales llamar a la función apropiada. La condición quinta que está definida es la acción predeterminada, y se muestra un mensaje que no se permite la acción, whereupon llama a la función GetHelp.

Una cosa que tener en cuenta acerca de la instrucción switch es que encontró varias coincidencias. Por este motivo, la instrucción Exit se utiliza después de cada llamada a las funciones. Continuación se muestra el código de instrucción de cambio:

Switch ($action)
{
 "L" {GetAllClasses ; Exit}
 "M" {GetMandatory($class) ; Exit}
 "O" {GetOptional($class) ; Exit}
 "F" {FindClasses($class) ; Exit}
 DEFAULT { "$action is not a valid action." ; GetHelp ; Exit} 
}

Bueno, eso acerca del mismo equipo. No hay ningún explorador de Active Directory, distinto el Scriptomatic para ADSI. Pero la secuencia de comandos BrowseActive­DirectorySchema.ps1 debe usan, bien por el momento. Para obtener más divertido de secuencias de comandos Active Directory, visite la Concentrador de secuencias de comandos de Active Directory. Y sabe que estamos abrir cada momento del año en el Centro de secuencias de comandos.

Ed Wilson es un consultor sénior de Microsoft y un experto de secuencias de comandos conocido. Es un Microsoft Certified Trainer que ofrece un taller de Windows PowerShell popular a los clientes de Microsoft Premier en todo el mundo. Ha escrito libros ocho incluidas varias de las secuencias de comandos de Windows, y ha contribuido a prácticamente una docena otros libros. Ed contiene más de 20 certificaciones del sector.

Craig Liebendorfer es wordsmith y longtime editor Web de Microsoft. Craig aún can’t creer ’s hay un trabajo que se paga a trabajar con las palabras cada día. Uno de sus cosas favoritas es irreverent humor, para que debe ajustarse derecha en aquí. Considera que su accomplishment mayor en la vida que su hija magnificent.