Por Daniel Seveso

 

 

Luego del artículo de Introducción publicado anteriormente, veamos lo que para mi es la principal diferencias entre PowerShell y los shells disponibles hasta ahora.

 

Objetos en PowerShell

Los shells en general, poseen la funcionalidad de redirigir la salida de un comando a otro utilizando cadena de caracteres (proceso conocido como pipelining). Por ejemplo, el siguiente es el resultado de hacer pipelining de la salida del comando ipconfig en el shell de Windows, enviándola como entrada del comando “find”:

 

C:\>ipconfig /all | find "IP Address"

        IP Address. . . . . . . . . . . . : 192.168.0.7

 

La desventaja principal de este método es que debemos conocer exactamente cual será la salida del primer comando para no tener resultados inesperados.

 

En Exchange Management Shell (EMS) el pasaje de resultados de un comando a otro se realiza en el contexto de objetos. EMS usa información estructurada para representar los distintos ítems en la jerarquía de Exchange y a los que llamamos objetos. Cada objeto en EMS contiene información relacionada al ítem que representa y su estructura de datos. El objeto funciona como un una entidad que representa el ítem, por ejemplo, si modificamos un buzón desde EMS, estaremos trabajando con el objeto que representa ese buzón, no con el buzón en sí.

Al utilizar objetos para el pasaje de información entre comandos, evitamos los problemas de interpretación de la información, ya que todos los cmdlets conocerán el modelo de objetos a utilizar.

 

Un objeto está compuesto por tres tipos de información: el tipo de objeto, sus métodos y sus propiedades.

 

Tipo: El tipo de objeto identifica que clase de objeto es. Por ejemplo, en EMS, un objeto que representa un buzón es un objeto Mailbox, un objeto que representa un archivo es un objeto FileInfo.

 

Propiedades: Una propiedad es información asociada al objeto que especifica algo en particular del mismo. Por ejemplo, en un objeto Mailbox, tiene una propiedad Name que representa el atributo DisplayName en el directorio activo para usuario con buzón. También tiene una propiedad ServerLegacyDN que representa el valor del atributo msExchangeHomeServerName del usuario con buzón en el directorio activo. Este usuario con buzón, es el ítem representado por el objeto Mailbox en ESM.

Como se habrán dado cuenta, las propiedades de los objetos de EMS no tienen el mismo nombre que las propiedades de los objetos en el directorio activo, aunque representen el mismo valor.

El nombre y el tipo de datos de cada propiedad (entero, binario, cadena, etc.) es también información que está incluida en el objeto.

Para ver las propiedades del objeto Mailbox, pueden ejecutar el comando:

 

[MSH] C:\>get-mailbox <nombre> | List

 

Métodos: Un método es un conjunto de instrucciones que definen una acción en particular para un objeto. Por ejemplo, un objeto Mailbox incluye un método set_emailAddresses que se usa para configurar la dirección de correo (atributo proxyAddresses del directorio activo) para ese usuario con buzón. El nombre del método no es relevante para configurar la dirección de correo, dado que el cmdlet set-mailbox expone un parámetro –emailaddresses que utiliza este método en forma transparente.

 

[MSH] C:\>set-mailbox <nombre> -emailaddresses smtp:nombre@dominio.com

 

 

Si quieres ver todos los métodos asociados a un objeto mailbox, puedes usar el cmdlet get-member. Get-member trabaja con un objeto en particular, así que podríamos obtenerlos mediante el siguiente comando:

 

[MSH] C:\>get-mailbox <nombre> |get-member –membertype method

 

 

Pipelining – Pasando información entre comandos

Pipelining es el término en inglés utilizado para la redirección de la salida de un proceso hacia la entrada de otro. El símbolo “|” es usado para indicar esta redirección en EMS. Cuando encontremos este símbolo en una línea de comandos, significa que el resultado del comando que está a la izquierda del signo se usará como entrada para el comando que está a la derecha del signo. Este resultado tendrá la forma de uno o más objetos.

 

Ejemplo

Si quieres mostrar las propiedades del usuario Susana Oliveira, el comando sería:

 

[MSH] C:\>get-mailbox "Susana Oliveira"

 

Name                      Alias                Server           ProhibitSendQuo

                                                                ta

----                      -----                ------           ---------------

Susana Oliveira           susoli               fc-mbc           400MB

 

Solamente algunos atributos del objeto mailbox son mostrados en la consola pero en realidad la salida del comando es el objeto completo que representa el mailbox “Susana Oliveira”

Luego, por ejemplo, puedes usar el cmdlet format-list, que toma la salida del pipeline y despliega en pantalla una lista de propiedades de cada objeto. Si enviamos la salida del get-mailbox anterior al cmdlet format-list pidiendo las propiedades name y legacyexchangedn, obtendremos este resultado:

 

[MSH] C:\>get-mailbox "Susana Oliveira" |format-list -Property name,legacyexchangedn

 

 

Name             : Susana Oliveira

LegacyExchangeDN : /o=Fourth Coffee/ou=Exchange Administrative Group (FYDIBOHF2

                   3SPDLT)/cn=Recipients/cn=susoli

 

Si por ejemplo usamos el comando get-mailbox sin parámetros (devuelve la lista de todos los mailbox del forest), format-list tomará cada objeto y desplegará las propiedades indicadas:

 

[MSH] C:\>get-mailbox |format-list -Property name,legacyexchangedn

 

 

Name             : Administrator

LegacyExchangeDN : /o=Fourth Coffee/ou=Exchange Administrative Group (FYDIBOHF2

                   3SPDLT)/cn=Recipients/cn=Administrator

 

Name             : Aaron Con

LegacyExchangeDN : /o=Fourth Coffee/ou=Exchange Administrative Group (FYDIBOHF2

                   3SPDLT)/cn=Recipients/cn=aarcon

 

Name             : Anton Kirilov

LegacyExchangeDN : /o=Fourth Coffee/ou=Exchange Administrative Group (FYDIBOHF2

                   3SPDLT)/cn=Recipients/cn=antkir

 

Name             : Aaron Lee

LegacyExchangeDN : /o=Fourth Coffee/ou=Exchange Administrative Group (FYDIBOHF2

                   3SPDLT)/cn=Recipients/cn=aarlee

 

... continuando con todos los usuarios de la organización

 

Otro ejemplo práctico: digamos que necesitas establecer límites de tamaño de envío a todos los usuarios de la base de datos “managers”:

 

[MSH] C:\>get-mailbox -database managers

 

 

Name                      Alias                Server           ProhibitSendQuo

                                                                ta

----                      -----                ------           ---------------

Wilson Pais               wilpai               fc-mbc           unlimited

Susana Oliveira           susoli               fc-mbc           300MB

 

**devuelve los usuarios en la base de datos “managers”

 

[MSH] C:\>get-mailbox -database managers | set-mailbox -ProhibitSendQuota 400mb

                                                   

** Utilizando el mismo commando, usamos pipelining para enviar los objetos al cmdlet set-mailbox y configurar el límite  de tamaño requerido a 400Mb

 

[MSH] C:\>get-mailbox -database managers

 

 

Name                      Alias                Server           ProhibitSendQuo

                                                                ta

----                      -----                ------           ---------------

Wilson Pais               wilpai               fc-mbc           400MB

Susana Oliveira           susoli               fc-mbc           400MB

 

**listamos nuevamente los usuarios de la base “managers” para confirmar los cambios

 

Llevemos este concepto a un nivel más interesante. Primero necesito introducir el concepto de variables. Como mencioné anteriormente podemos usar variables en EMS. Una variable especial es “$_” que representa cada objeto que se está pasando por el pipeline. Mediante esta variable y el cmdlet where-object podemos filtrar lo que obtenemos del pipeline y entregar una salida parcial al cmdlet que recibe esta salida.

Supongamos que queremos configurar el límite de tamaño de envío de todos los usuarios de la organización a 300Mb, pero sólo a los usuarios cuyo límite actual sea “unlimited”. En otras palabras, los usuarios que ya tienen un límite establecido, quedarán como están. (alguien recuerda como hacer esto en Exchange 2000/2003? J)

 

[MSH] C:\>get-mailbox |where-object {$_.ProhibitSendQuota -eq "unlimited"} |set-mailbox

–ProhibitSendQuota 300mb

 

**Get-mailbox pasa al pipeline todos los objetos mailbox de la organización

**Where-object los toma y pasa al pipeline sólo los objetos donde la propiedad ProhibitSendQuota sea igual a “unlimited”

**Set-mailbox toma los objetos devueltos por Where-object y les configura el límite deseado.

 

Estos ejemplos son simplemente parte de la diversión de EMS. Hasta ahora trabajamos con el objeto mailbox, pero hay muchos más objetos representados en EMS, incluyendo objetos que no pertenecientes a la jerarquía de Exchange como procesos, servicios, archivos, etc.

Podemos utilizar get-proces, get-service o get-childitem para obtener la lista de estos objetos. Filtrarlos con where-object y ordenarlas con sort-object y tomar acciones como start-service, stop-process (kill) o remove-item por ejemplo.

 

Algunos ejemplos:

 

[MSH] C:\>Get-Service | Where-Object {$_.name -like "msexchange*"}

                  

Status   Name               DisplayName

------   ----               -----------

Running  MSExchangeIS       Microsoft Exchange Information Store

Running  MSExchangeMA       Microsoft Exchange Mailbox Assistants

Running  MSExchangeMGMT     Microsoft Exchange Management

Running  MSExchangeRepl     Microsoft Exchange Replication Service

Running  MSExchangeSA       Microsoft Exchange System Attendant

Running  MSExchangeSearch   Microsoft Exchange Search

** Listado de servicios cuyo nombre continene msexchange

 

 

 

[MSH] C:\>Get-Process

 

Handles  NPM(K)    PM(K)      WS(K) VS(M)   CPU(s)     Id ProcessName

-------  ------    -----      ----- -----   ------     -- -----------

    388     132     6164       2820   284     4.20   1084 ADTopologyService

    631       6     1764       1376    25    72.62    352 csrss

    260     129     8288       1592   308     0.69   1528 exmgmt

    303      11     8848       5684    55     6.49   3508 explorer

      0       0        0         16     0               0 Idle

    196       5     3624       3584    47     4.77   1192 inetinfo

    573      16     7636       3880    44    13.65    432 lsass

    834     264    26156      16136   327    18.42   1660 mad

    331      12    25004       9096   199    15.48   1716 MailSubmissionSvc

    245       9    19544       7696   111    50.60   1616 Microsoft.Exchange...

    481      21    30792      11756   223    32.25   1440 Microsoft.Exchange...

    362      16    28600       6504   197    11.23   2584 Microsoft.Exchange...

    203       6     7144       2500    58    10.90    344 mmc

 

** Listado de procesos corriendo en el server

 

 

[MSH] C:\>Get-Process | Sort-Object -property Id

 

Handles  NPM(K)    PM(K)      WS(K) VS(M)   CPU(s)     Id ProcessName

-------  ------    -----      ----- -----   ------     -- -----------

      0       0        0         16     0               0 Idle

   1848       0        0         40     2   106.18      4 System

     18       1      140        200     4     0.08    304 smss

    681      23   102824      80804   237    49.20    340 Msh

    203       6     7144       2500    58    10.90    344 mmc

    631       6     1764       1388    25    72.75    352 csrss

    588      64     7712       2980    53     8.97    376 winlogon

    359      10     3852       2504    27     6.80    420 services

    573      16     7636       3880    44    13.65    432 lsass

     76       2      732        836    17     0.24    636 svchost

    116       4     2984       1220    25     1.72    972 spoolsv

    145       6     1428        620    23     0.16    996 msdtc

     47       2      544        588    22     1.79   1072 vmsrvc

   ......

 

** Listado de procesos ordenados por ID

 

 

[MSH] C:\>get-childitem "c:\program files"

 

 

    Directory: Microsoft.Msh.Core\FileSystem::C:\program files

 

 

Mode                LastWriteTime     Length Name

----                -------------     ------ ----

d----         3/28/2006   4:10 PM            bginfo

d----          5/8/2005  10:30 AM            Common Files

d----          5/8/2005  10:27 AM            ComPlus Applications

d----          5/8/2005  10:33 AM            Internet Explorer

d----         5/19/2006   1:26 PM            Microsoft

d----         5/19/2006   1:17 PM            Microsoft Command Shell

d----          5/8/2005  10:30 AM            NetMeeting

d----          5/8/2005  10:30 AM            Outlook Express

d----         6/28/2006   8:10 AM            Support Tools

d----         3/28/2006   5:52 PM            Virtual Machine Additions

d----          5/8/2005  10:44 AM            Windows Media Player

d----          5/8/2005  10:23 AM            Windows NT

 

** Listado de elementos bajo el directorio Program Files

 

 

 

[MSH] C:\>get-service |group-object -property status

 

Count Name                      Group

----- ----                      -----

   55 Running                   {1-vmsrvc, AeLookupSvc, Browser, CryptSvc...}

   53 Stopped                   {Alerter, ALG, AppMgmt, aspnet_state...}

 

** Cuantos servicios corriendo y cuantos detenidos?

 

 

[MSH] C:\>set-location "hklm:\system\currentcontrolset\services\msexchange transport"

[MSH] HKLM:\system\currentcontrolset\services\msexchange transport>get-itemprope

rty diagnostics

 

 

MshPath             : Microsoft.Msh.Core\Registry::HKEY_LOCAL_MACHINE\system\cu

                      rrentcontrolset\services\msexchange transport\diagnostics

MshParentPath       : Microsoft.Msh.Core\Registry::HKEY_LOCAL_MACHINE\system\cu

                      rrentcontrolset\services\msexchange transport

MshChildName        : diagnostics

MshDrive            : HKLM

MshProvider         : Microsoft.Msh.Core\Registry

1 SmtpReceive       : 0

2 SmtpSend          : 0

3 DSN               : 0

4 Routing           : 0

5 Logging           : 0

6 Components        : 0

7 RemoteDelivery    : 0

8 Pickup            : 0

9 Categorizer       : 0

10 PoisonMessage    : 0

11 MessageSecurity  : 0

12 TransportService : 0

13 Exch50           : 0

14 Process          : 0

15 ResourceManager  : 0

16 Configuration    : 0

17 Storage          : 0

 

** Consulta en el registry cual es el nivel de diagnóstico (diagnostic logging)para el motor de transporte

 

 

Funciones y Scripts

En cuanto el tiempo permita, escribiré una nota referida a automatización usando funciones y scripts en EMS.

 

Mientras tanto usa tu imaginación y prueba Exchange Management Shell en los laboratorios virtuales de Technet.

                               

Nos vemos!