Windows PowerShell Planear una interrupción

Don Jones

Contenido

En todo caso, comprobar primero
O tratar sólo con IT
Mejor en la versión 2

Recientemente, escribí una serie de cuatro en esta columna se centró en escribir un script aprovisionamiento de usuario mediante Windows PowerShell. Un lector, Juan, ha escrito formular una pregunta bastante detallada acerca de cómo mejorar la secuencia de comandos.

Básicamente, Juan tiene escrito secuencias de comandos similares en el pasado y complicados formas de controlar los errores se producen cuando se intenta crear un nombre de usuario que ya existe. Su solución ha sido escribir "bucle pre-test",donde comprueba si ya existen los objetos de directorio antes de continuar, pero quería saber cómo debería tratar con él en función de Provision() mi aprovisionamiento la secuencia de comandos.

Es una buena pregunta y otro que va a responder en esta columna. Tenga en cuenta, sin embargo, que son las técnicas que abordaré bastante universal;Puede utilizar métodos similares para tratar otras situaciones donde se sabe que puede producirse un error. Llamar a mi método "diseño dividir"y cómo escribir secuencias de comandos que controlan un poco más correctamente posibles condiciones de error.

En todo caso, comprobar primero

Definitivamente Acepto con enfoque Juan como una técnica preferida. Juan dice, "odia escribir tratamiento de errores"y Tiendo a Aceptar. Windows PowerShell v1 tratamiento de errores es un poco primitivo para Mis gustos, por lo que si puede evitar el error completamente, todo lo lo.

Voy a decir primero que probablemente hay un número infinito de variaciones de mi método, pero un número finito de páginas para mí trabajar con aquí, por lo que va llevar simplemente una variación. Mi objetivo básico es para detectar las cuentas de usuario que ya existen e iniciar ellos en lugar de intentar crear una segunda vez. Para actualizar la memoria, la función Provision() básica podría este aspecto:

Function Provision {
  PROCESS {
    CreateUser $_
    CreateHomeFolder $_
    AddToGroups $_
    UpdateAttributes $_
  }
}

La función de provisión está esperando la canalización de entrada desde una segunda función cuyo trabajo es importar datos de usuario desde en (such as una base de datos o archivo .csv) y construir una tabla hash estándar que contiene atributos del nuevo usuario. Por lo que $ _ ['samaccountname'], por ejemplo, contendría el nombre del usuario inicio de sesión. Dado que nombre de usuario, que es la información garantiza-único que tengo para un usuario, puede tratar de ver si la cuenta ya existe. La forma más sencilla consiste en utilizar el cmdlet Get-QADUser (disponible en el paquete de cmdlet en quest.com/powershell de), por lo que se va a modificar la función de provisión, como se muestra en de figura 1.

Figura 1 modificar la función de provisión

Function Provision {
  PROCESS {
    $count = Get-QADUser –samAccountName $_['samaccountname'] | Measure-Object
    if ($count.count –gt 0) {
      $_['samaccountname'] | Out-File c:\not-created.txt -append
    } else {

      CreateUser $_
      CreateHomeFolder $_
      AddToGroups $_
      UpdateAttributes $_
  }
  }
}

La modificación intenta recuperar el usuario especificado del directorio y, a continuación, medir el número de objetos recuperados. El objeto de medida entra en la variable de recuento $, que ofrece una propiedad Count (count.count $). Si el recuento es mayor que cero, a continuación, el usuario existe y utilizar Out-File para pasar el nombre de usuario a un archivo de registro. Si el usuario no existe, sin embargo, a continuación, $ count se rellenará con nada y su propiedad Count no será mayor que cero, por lo que continúe con el aprovisionamiento.

Este enfoque, comprobar un usuario en un tiempo, es que sólo es factible dada la forma se genera la función de provisión. Eso es porque su bloque de secuencia de comandos de proceso sólo obtiene un único usuario a la vez;no de ninguna manera que "pre-loop"Para comprobar primero todos los usuarios. No es realmente es necesario, sin embargo, porque la comprobación de uno en uno no modifica significativamente el rendimiento.

Una ventaja de este enfoque sobre la siguiente que presentaré es que la comprobación de errores, ver si el usuario ya existe, se realiza inicial. De hecho, eso es el enfoque sólo realmente viable aquí porque la función de provisión llama a en otras funciones después de intentar crear el usuario. Si se agregaron comprobación de errores a sólo el crear ­ usuario funcione, los otros tres; CreateHomeFolder, AddToGroups y UpdateAttributes, todavía podría intentar ejecutar.

O tratar sólo con IT

Pero, en general, es otro enfoque válido intentar interceptar el error. Interceptación de errores en Windows PowerShell v1 es un poco complicado, pero funciona algo así:

  • Debe indicar el cmdlet que podría ejecutarse en un error para generar una excepción real, no sólo imprimir un mensaje de error rojo
  • Debe definir un reventado, donde podrá enfrentarse las consecuencias del error

Puede hacer realmente que este lo suficientemente sofisticado para trabajar con la función de provisión. Inicia el trabajo, sin embargo, en la función CreateUser. En algún lugar en allí es un cmdlet que intenta crear un nuevo usuario: nuevo-QADUser o el cmdlet New-Mailbox si está utilizando Exchange Server 2007 para crear usuarios y buzones de todos a la vez. En ambos casos, agregar el parámetro –ErrorAction (o –EA) para indicar el cmdlet para cambiar su comportamiento de error predeterminado.

También debe definir una captura, que es donde irá el shell cuando realmente se produce una excepción. Los cambios en la función CreateUser podrían este aspecto:

Function CreateUser {
  Param ($userinfo)
  Trap {
    $userinfo['samaccountname'] | Out-File c:\errors.txt -append
    break
  }
  New-Mailbox . . . -EA Stop
}

He omitido el resto de la sintaxis para New-Mailbox que esta ilustración más clara. Básicamente, si falla en la New-Mailbox, el parámetro –EA le indica que detener y produce una excepción. Esto obliga el shell para buscar una captura ya definido y ejecutarlo. En el que captura registrar el nombre de usuario en un archivo y, a continuación, ejecuta un salto que sale de la función actual y pasa el error original vuelve a lo que ha llamado a esta función. En otras palabras, la función de provisión terminará con el error.

Para evitar que la ejecución de las tres funciones provisión, es necesario modificar la forma ejecuta (consulte de figura 2).

Figura 2 modificación la provisión de forma ejecuta

Function Provision {
  PROCESS {
    $go = $true
    trap {
      $go = $false
      continue
    }
    CreateUser $_
    If ($go) {
      CreateHomeFolder $_
      AddToGroups $_
      UpdateAttributes $_
    }
  }
}

Como puede ver, he definido otra captura. Si CreateUser termina con un error, se ejecutará la captura de provisión. Simplemente establece una variable, $ vaya, en el valor booleano false e indica el shell para continuar, lo que significa que continuar la ejecución en la línea siguiente que causó el error. Esa línea es "If"instrucción, que comprueba si $ vaya contiene $ True o no. Si lo hace, las tres funciones restantes ejecutarse;Si $ contiene $ False, no necesita ejecutar esas tres funciones. Restablecer ese valor de $ ir del principio del bloque de script PROCESS para que se intentará el siguiente usuario.

El motivo que se ha utilizado este enfoque determinado (frente a cualquier número de otros usuarios que haya elegido) es que permite me código adicional que se ejecuta incluso si el error en la creación del usuario (vea figura 3).

Figura 3 agregar una llamada a OutputToHTML

Function Provision {
  PROCESS {
    $go = $true
    trap {
      $go = $false
      continue
    }
    CreateUser $_
    If ($go) {
      CreateHomeFolder $_
      AddToGroups $_
      UpdateAttributes $_
    }
    OutputToHTML $_
  }
}

En la variante que se muestra, he agregado una llamada a una función denominada OutputToHTML. Se ejecutará incluso si ya existía el usuario actual y no se ejecutó CreateHomeFolder AddToGroups y UpdateAttributes.

Mejor en la versión 2

Windows PowerShell v2, que incluirá por primera vez en Windows 7 (y, finalmente, que estará disponible para versiones anteriores de Windows), agrega nueva funcionalidad de tratamiento de errores que es un poco más fácil trabajar con: Bloques try … catch. Una explicación completa queda fuera del ámbito de este artículo, por lo que sólo le digo que esta nueva característica ofrece más control de errores estructurado que proporciona más opciones para un poco menos complejidad.

Don Jones es uno de la nación formadores más experimentados de Windows PowerShell y escritores. Blogs semanal Windows PowerShell sugerencias en de ConcentratedTech.com;También puede ponerse en contacto con él o preguntas le existe.