Windows PowerShellAutomatización de la administración de directorios

Don Jones

Uno de los aspectos menos afortunados de la primera versión de Windows PowerShell es el control del tiempo. El equipo de Windows PowerShell estaba presionado para lanzar al mercado el producto (había que lanzar un pequeño producto llamado Exchange Server 2007, que dependía de Windows PowerShell) y el equipo de Active

Directory estaba muy ocupado en ese momento (trabajaban en otro pequeño producto llamado Windows Server® 2008). Así que Windows PowerShell se lanzó al mercado con escasas capacidades de administración de Active Directory®.

Para ser claro, Windows PowerShell® no carece completamente de las características de Active Directory. De hecho, el equipo de Windows PowerShell hizo heroicos esfuerzos de última hora para ofrecer un soporte decente para las Interfaces del servicio de Active Directory (ADSI, Active Directory Services Interface), una tecnología óptima para scripts ya muy conocida entre los usuarios de VBScript.

El método de ADSI

El funcionamiento de ADSI es semejante al del Instrumental de administración de Windows® (WMI, Windows Management Instrumentation). El usuario publica una consulta, que se escribe con una sintaxis especial. La consulta se transmite a un equipo remoto (como un controlador de dominio) y, a continuación, se ejecuta. El resultado de la consulta es un objeto o una colección de objetos de Active Directory (como un usuario o un grupo) y una referencia a dicho objeto con la que puede trabajar. Puede modificar las propiedades del objeto o ejecutar métodos para guardar los cambios, crear objetos nuevos, eliminar objetos, etc. Por ejemplo, para crear un usuario, debe consultar a la unidad organizativa (OU) o el contenedor donde desea que resida el usuario. El objeto que recibirá tiene un método Create que se puede usar para crear el usuario.

En un nivel muy básico, el uso de ADSI en Windows PowerShell parece sencillo y simple. Por ejemplo, este comando recuperará un usuario y mostrará su atributo Company:

$user = [ADSI]"LDAP://cn=Ringo,ou=Singers,dc=company,dc=pri"
$user.Get("Company")

Puede canalizar el usuario a Get-Member para ver sus propiedades y métodos. Lamentablemente, Windows PowerShell 1.0 no implementa demasiado bien estos objetos de directorio. Tal como se muestra en la Figura 1, el shell no enumera los atributos de directorio del objeto ni muestra los métodos del objeto, como el método Get que usé.

Figura 1 Canalización del usuario a Get-Member para ver sus propiedades

Figura 1** Canalización del usuario a Get-Member para ver sus propiedades **(Hacer clic en la imagen para ampliarla)

Esta compatibilidad está algo mejorada en Community Technology Preview (CTP) de Windows PowerShell 2.0, pero sólo hasta cierto punto. La consideración fundamental es que Microsoft® .NET Framework no permite a los administradores ver fácilmente todo lo que quieren (después de todo, se diseño originalmente para desarrolladores). El otro problema es que el equipo de Windows PowerShell no puede hacer más, y se necesita mucho soporte técnico para Active Directory por parte de los especialistas. Es decir, el equipo de Active Directory. Estoy seguro de que llegará en su momento, a fin de cuentas, Windows PowerShell todavía es reciente. Pero ¿qué debe hacer mientras tanto?

Igual recuerda que hablé sobre el uso de las tecnologías de ADSI incluidas en Windows PowerShell en la entrega de junio de 2007 de esta columna (technetmagazine.com/issues/2007/06/PowerShell). Le sugiero que lea esa columna si desea más detalles sobre esta técnica "nativa". En esta entrega, quisiera mostrarles otros enfoques.

Un ecosistema rico

El arquitecto de Windows PowerShell, Jeffrey Snover, se refiere a menudo al rico ecosistema que rodea a Windows PowerShell. Esto significa, simplemente, que el equipo hizo un gran trabajo para asegurarse de que cualquiera, no sólo los programadores de Microsoft, pueden ampliar las capacidades de Windows PowerShell. Son varias las compañías que ya lo están haciendo mediante la creación de cmdlets nativos de Windows PowerShell que le permiten administrar sus productos desde la línea de comandos. VMWare, IBM, Citrix y Foundry son tan sólo algunas de las principales compañías que lo están haciendo.

Uno de mis ejemplos favoritos de este ecosistema rico es el de Quest Software. La compañía ofrece un conjunto de cmdlets gratuitos y no comerciales diseñado para la administración de Active Directory. Puede descargarlos de quest.com/powershell. Además, ofrecen PowerGUI (powergui.org), una interfaz de usuario gráfica, no comercial y gratuita que se aplica sobre Windows PowerShell para la gente que todavía no está lista para la verdadera experiencia de línea de comandos. PowerGUI le ayuda a usar más fácilmente los cmdlets de administración de Active Directory. Y créame, querrá usarlos. Estos cmdlets le proporcionan una comodidad y potencia de administración de Active Directory inauditas. (Si desea más información acerca de PowerGUI, consulte la entrega de enero de 2008 de la columna Cuadro de herramientas, que puede encontrar en technetmagazine.com/issues/2008/01/Toolbox).

El método de Windows PowerShell

Todo lo que implique cmdlets es el verdadero método Windows PowerShell. No tiene que trabajar con los tradicionales scripts ni con sofisticados objetos de programación. Esta es mi línea favorita de todas. Es una sola línea de comandos que importa un archivo CSV y usa la información que contiene para crear docenas o incluso cientos de nuevos usuarios de Active Directory:

Import-CSV 'C:\provision1.csv' |
ForEach-Object {New-QADUser -organizationalUnit 'company.pri/Singers' -name ($_.'First Name' + '.' + $_.'Last Name') 
-samAccountName $_.'Logon name' -city $_.city -title $_.'Job title' -department $_.department} 

Es, desde luego, un comando largo, pero asombrosamente eficaz. Empieza por Import-CSV, un cmdlet nativo de shell que simplemente lee un archivo CSV y devuelve objetos. Cada línea del archivo CSV es un solo objeto y las columnas del archivo CSV pasan a ser las propiedades del objeto. En mi archivo Provision1.csv, los nombres de columna son del tipo "Nombre de inicio de sesión" y "Nombre", lo cual resulta interesante porque los nombres de columna no están relacionados directamente con atributos de usuario de Active Directory. Es frecuente que los archivos de este tipo usen nombres de columna más familiares, en vez de los nombres específicos de Active Directory. A fin de cuentas, puede que reciba este archivo de alguien del departamento de personal de su compañía y es poco probable que esta persona sepa que el Apellido es realmente el atributo sn de Active Directory.

Una vez que se han importado todos los datos del archivo CSV y se han convertido en objetos, esos objetos se canalizan al cmdlet ForEach-Object, que ejecuta un bloque de código (entre llaves en mi línea) para cada objeto. Es decir, este script se ejecutará una vez por cada línea del archivo CSV. Dentro del script, la variable especial $_ es una referencia al objeto actual, o la línea actual del archivo CSV.

Puede ver que estoy ejecutando el cmdlet New-QADUser. Éste es uno de la docena aproximadamente de cmdlets incluidos en el complemento de Quest. Cabe destacar el nombre QADUser. La Q, como quizás haya adivinado, es de Quest. Esta convención de nomenclatura está diseñada para evitar conflictos con el cmdlet New-ADUser que probablemente cree el equipo de Microsoft Active Directory en un futuro. Así, si se cargan ambos cmdlets en el shell al mismo tiempo, usted y el shell podrán distinguirlos más fácilmente.

El resto de la línea está compuesto por parámetros para el cmdlet New-QADUser. El primero especifica la unidad organizativa, que es donde desea crear todos los usuarios nuevos. El siguiente atributo es el del nombre, que he configurado para que coincida con el contenido de la columna Nombre, un punto y, después, el contenido de la columna Apellido.

Otro dato interesante: El parámetro de ciudad cambiará realmente el atributo l (o Locality-Name) de Active Directory. El cmdlet también acepta un parámetro llamado l, que hace lo mismo. En su mayoría, los parámetros que hacen referencia a atributos de Active Directory pueden usar el nombre del atributo o la etiqueta de texto de la herramienta Usuarios y equipos de Active Directory.

El otro método de Windows PowerShell

Active Directory es un almacén jerárquico, y uno de los puntos fuertes de Windows PowerShell es su capacidad de exponer cualquier almacén jerárquico como una unidad de disco, permitiéndole usar un familiar conjunto de comandos como, por ejemplo, Dir, Del, Ren o Copy para administrar varios almacenes. Lamentablemente, Windows PowerShell 1.0 no incluía un proveedor PSDrive para Active Directory, de modo que el shell no puede exponer Active Directory como una unidad.

Por suerte, ese ecosistema rico regresa al terreno de juego con las extensiones de la comunidad de PowerShell. Se trata de un complemento de código abierto gratuito que está disponible en codeplex.com/powershellcx. Una vez instaladas, las extensiones de la comunidad de PowerShell le permiten dirigir el shell a su nombre de dominio para empezar a administrar el directorio como si fuera una unidad:

CD COMPANY:
CD SINGERS
DIR

Estos comandos cambiarán al dominio COMPAÑÍA, a la unidad organizativa Cantantes y, a continuación, mostrarán una lista de objetos, tal como se muestra en la Figura 2. Desde allí, se pueden usar comandos como Del para eliminar un usuario, Md para crear una unidad organizativa nueva, etc. El proveedor PSDrive de extensiones de la comunidad tiene unos cuantos inconvenientes, principalmente relacionados con la funcionalidad que espera ver implementada, pero que no está disponible porque los elementos no se adaptan al funcionamiento de Active Directory. Debe tener especial cuidado: si va a la raíz de su dominio y ejecuta del * -recurse, se eliminarán todos los objetos del dominio, siempre que tenga permiso. Ni siquiera le preguntará si "está seguro" de forma predeterminada. Sí, la línea de comandos es eficaz, pero esta eficacia supone un riesgo para los poco experimentados o cuidadosos.

Figura 2 Uso de las extensiones de la comunidad de PowerShell para dirigir el shell y administrar el directorio

Figura 2** Uso de las extensiones de la comunidad de PowerShell para dirigir el shell y administrar el directorio **(Hacer clic en la imagen para ampliarla)

Empiece a usar el shell hoy

Mis alumnos siempre preguntan qué se puede hacer con Windows PowerShell hoy en día. A fin de cuentas, no se han rediseñado todos los productos de Microsoft para usar Windows PowerShell, y de primeras podría pensar que Windows PowerShell sigue esperando a que las cosas se pongan interesantes.

Pero, de hecho, las cosas ya se han puesto interesantes. Aunque Microsoft todavía no ha instrumentado Active Directory para la administración de la línea de comandos, otros lo han probado y les ha ido bastante bien. Puede usar Windows PowerShell para realizar muchas tareas administrativas, o incluso para automatizar algunas de las tareas más engorrosas y pesadas, como crear lotes de usuarios nuevos. El truco consiste en averiguar los avances de la comunidad para que Windows PowerShell sea más útil. Visite PowerShellCommunity.org, un sitio copatrocinado por Microsoft en cuya administración colaboro. Si tiene las herramientas apropiadas cargadas en Windows PowerShell, puede empezar a crear scripts para las tareas administrativas más engorrosas que no desea hacer y, así, convertirse en un administrador más eficaz y eficiente.

Don Jones es coautor de Windows PowerShell: TFM, segunda edición, autor de VBScript, WMI, and ADSI Unleashed y director de PowerShellCommunity.org.

© 2008 Microsoft Corporation and CMP Media, LLC. Reservados todos los derechos; queda prohibida la reproducción parcial o total sin previa autorización.