Compartilhar via


Windows PowerShell Planejamento para panes

Don Jones

Conteúdo

All forma, verifique primeiro
Ou apenas lidar com ele
Melhor na versão 2

Recentemente, escrevi uma série de quatro partes desta coluna voltadas para escrever um script de configuração do usuário usando o Windows PowerShell. Um leitor, Jim, escreveu fazer uma pergunta muito detalhada sobre como melhorar o script.

Essencialmente, Jim tiver escrito scripts semelhantes no passado e sofrem com maneiras para manipular erros que ocorrem quando você está tentando criar um nome de usuário que já existe. Sua solução foi gravar "loop pre-test",onde ele verifica se os objetos de diretório já existem antes de continuar, mas ele quis saber como eu poderia lidar com ele na função de Provision() do meu script de configuração.

É uma boa pergunta — e outra irá responder nesta coluna. Tenha em mente, porém, que as técnicas que discutirei são bastante universais;Você pode usar abordagens semelhantes para lidar com outras situações em que você sabe que pode ocorrer um erro. Chamo minha abordagem "Planejando quebrar"e é como eu escrever scripts que lidar com possíveis condições de erro normalmente um pouco mais.

All forma, verifique primeiro

Definitivamente, concordo com abordagem do Jim como uma técnica preferida. Jim disse, "Detesto escrever tratamento de erros"e eu tendem a concordar. Windows PowerShell v1 tratamento de erros é um pouco primitivo para minhas preferências, portanto, se o erro pode evitar inteiramente, farei isso.

Deixe-me primeiro dizer que provavelmente há um número infinito de variações na minha abordagem, mas um número finito de páginas para mim trabalhar com aqui, portanto, que terá apenas uma variação. Meu objetivo básico é para detectar quaisquer contas de usuário que já existem e fazê-los em vez de tentar criá-los em uma segunda vez. Para atualizar sua memória, a função Provision() básica pode parecer com isso:

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

A função de criar está esperando a entrada de pipeline de uma segunda função cuja função é para importar dados de usuário de lugar (como um banco de dados ou arquivo .csv) e construir uma tabela de hash padronizado contendo atributos do novo usuário. Portanto, $ _ ['samaccountname'], por exemplo, conteria o nome do usuário log-on. Dado esse nome de usuário — que é sobre as informações somente garantidas-exclusivas que tenho para um usuário — pode tentar se a conta já existe. A maneira mais fácil é utilizar o cmdlet Get-QADUser (disponível no pacote do cmdlet no de quest.com/powershell), para que modificará a função criar conforme do Figura 1.

A Figura 1 modificando a função de provisão

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 $_
  }
  }
}

A modificação tenta recuperar o usuário especificado do diretório e, em seguida, medir o número de objetos recuperados. O objeto de medida vai para a variável de contagem $, que oferece uma propriedade Count ($ count.count). Se a contagem é maior que zero, então o usuário existe e uso-File para passar o nome de usuário para um arquivo de log. Se o usuário não existe, no entanto, e $ contagem será preenchida com nada, e sua propriedade Count não será maior que zero — portanto, eu continuar com o provisionamento.

Essa abordagem — verificação de um usuário em um tempo — é que apenas viável fornecido a maneira como a função criar é criada. Isso ocorre porque seu bloco de script PROCESS somente obtém um único usuário por vez;Não há nenhuma maneira para fazer um "pre-loop"Para verificar todos os usuários primeiro. Há realmente não precisa, porém, porque a verificação de um de cada vez não altera significativamente o desempenho.

Uma vantagem dessa abordagem sobre seguinte apresentarei é que a verificação de erro — veja se o usuário já existe — é feito prévio. Na verdade, que é a abordagem viável somente realmente aqui porque a função criar chama em outras funções depois de tentar criar o usuário. Se adicionados verificação de erros a somente a criar ­ usuário funcionar, as outras três — CreateHomeFolder, AddToGroups e UpdateAttributes — ainda pode tentar executar.

Ou apenas lidar com ele

Mas, em geral, outra abordagem válida é tentar interceptar o erro. Interceptação de erro no Windows PowerShell v1 é um pouco complicado, mas funciona algo assim:

  • Você deve informar o cmdlet que pode ser executado em um erro para gerar uma exceção real, não apenas imprimir uma mensagem de erro vermelha
  • Você deve definir uma interceptação, onde você lida com as conseqüências do erro

Eu realmente pode fazer isso sofisticados para trabalhar com a função de criar. No entanto, o trabalho é iniciado na função CreateUser. Em algum lugar no local é um cmdlet que tenta criar um novo usuário — o New-QADUser ou o cmdlet New-Mailbox, se você estiver usando o Exchange Server 2007 para criar usuários e caixas de correio todos de uma vez. Em ambos os casos, você adicione o parâmetro – ErrorAction (ou – EA) para informar o cmdlet para alterar seu comportamento de erro padrão.

Você também deve definir uma interceptação, que é onde o shell irão quando, na verdade, ocorre uma exceção. As alterações para a função CreateUser podem ter esta aparência:

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

Eu omiti o restante da sintaxe de New-Mailbox apenas fazer essa ilustração mais clara. Essencialmente, se New-Mailbox falhar, o parâmetro – EA informa-o para parar e lança uma exceção. Isso força o shell para procurar uma interceptação já definido e executá-lo. Ajuste de registro, eu registrar o nome de usuário em um arquivo e, em seguida, executar uma quebra, que sai a função atual e passa o erro original de volta para qualquer chamado essa função. Em outras palavras, a função criar acabará com o erro.

Para evitar criar executar outras três funções, preciso modificar a maneira como ele executa-los (consulte do Figura 2).

Figura 2 modificando criar método executa

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

Como você pode ver, defini outra interceptação. Se CreateUser termina com um erro, a interceptação de criar será executado. Ele simplesmente define uma variável, $ vá, para o valor Booleano False e instrui o shell para continuar — ou seja continuar a execução na linha que causou o erro a seguir. Essa linha é um "if"instrução, que verifica para ver se $ vá contém $ True ou não. Se afirmativo, as três funções restantes executar;Se $ contém $ False, esses três funções não executar. Eu redefinir esse valor de $ vá na parte superior da scriptblock PROCESS para que o próximo usuário será tentado.

O motivo que usei essa abordagem específica (versus qualquer número de outras pessoas, talvez tenha escolhido) é que ele permite-me para que o código adicional que executa o mesmo que a criação de usuário falhou (consulte Figura 3).

Figura 3 Adicionando uma chamada para OutputToHTML

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

A variação mostrada, adicionei uma chamada para uma função chamada OutputToHTML. Isso será executado mesmo se o usuário atual já existia e CreateHomeFolder AddToGroups e UpdateAttributes não foi executada.

Melhor na versão 2

Windows PowerShell v2, que será lançado pela primeira vez no Windows 7 (e que eventualmente estará disponível para versões mais antigas do Windows), adiciona nova funcionalidade de tratamento de erros é um pouco mais fácil trabalhar com: Blocos Try … Catch. Uma discussão completa está além do escopo deste artigo, para que apenas Vou dizer que esse novo recurso oferece mais tratamento de erros estruturada que oferece mais opções para um pouco menos complexidade.

Don Jones é um da nação treinadores mais experientes do Windows PowerShell e gravadores. Blogs de he semanal Windows PowerShell dicas em de ConcentratedTech.com;Você também pode entre em contato com ele ou perguntas ele existe.