Share via


Windows PowerShell Planification à fond

Don Jones

Sommaire

En tout cas, vérifiez tout d'abord
Ou uniquement gérer avec IT
Amélioration de la version 2

Récemment, j'ai écrit une série de quatre dans cette colonne concentré sur écrire un script configuration utilisateur, l'utilisation de Windows PowerShell. Un lecteur, Jim, écrit pour poser une question très détaillée comment améliorer le script.

Fondamentalement, Jim a écrit des scripts semblables dans le passé et du mal à manières de traiter les erreurs qui se produisent lorsque vous essayez de créer un nom d'utilisateur existe déjà. Sa solution a été pour écrire une «boucle prétest»,où il vérifie si les objets d'annuaire existent déjà avant de continuer, mais il voulait savoir comment vous souhaitez traiter dans la fonction Provision() de mon script configuration.

C'est une question très — et vous allez répondre dans cette colonne. N'oubliez pas, cependant, que les techniques que j'aborderai sont assez universels ;Vous pouvez utiliser approches similaires pour traiter les autres situations où vous savez qu'une erreur peut se produire. J'appelle mon approche «planification interrompre»et c'est comment je écrire des scripts un peu plus normalement les conditions d'erreur potentielles.

En tout cas, vérifiez tout d'abord

J'accepte définitivement de Jim approche comme une méthode recommandée. Jim Ceci dit, "Je déteste écriture de gestion des erreurs"et j'ont tendance à accepter. Windows PowerShell v1 gestion des erreurs sont un peu primitive pour mon goûts, donc si vous pouvez éviter l'erreur entièrement, vous allez faire.

Laissez-moi vous dire tout d'abord qu'il sont probablement un nombre infini de variations sur mon approche, mais un nombre limité de pages pour moi travailler avec ici, vous allez prendre qu'une seule variation. Mon objectif base est afin de détecter les comptes utilisateur qui existent déjà et connecter les au lieu de tentative de créer une deuxième fois. Pour actualiser la mémoire, la fonction Provision() base peut se présenter comme suit :

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

La fonction de provision s'attend à saisir de pipeline à partir d'une deuxième fonction dont travail importer les données utilisateur someplace (such as un base de données ou un fichier .csv) et construire une table de hachage normalisé contenant des attributs du nouvel utilisateur. Ainsi, $ _ ['samaccountname'], par exemple, contiendrait nom ouverture de session de l'utilisateur. Étant donné ce nom d'utilisateur, ce qui concerne les uniquement garanties-informations uniques que je dispose d'un utilisateur, vous pouvez essayer de voir si le compte existe déjà. Le moyen le plus simple consiste à utiliser la cmdlet Get-QADUser (disponible dans le package cmdlet à quest.com/powershell), afin que vous allez modifier la fonction de provision comme dans de la figure 1.

La figure 1 modification de la fonction de provision

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 modification tente de récupérer l'utilisateur spécifié à partir de l'annuaire et puis mesurer le nombre d'objets récupérés. L'objet mesure placé dans la variable $ compte, qui offre une propriété Count (count.count $). Si le nombre est supérieur à zéro, puis l'utilisateur existe et que j'utilise Out-File pour passer le nom d'utilisateur à un fichier journal. Si l'utilisateur n'existe pas, cependant, puis $ nombre sera remplie avec rien, et sa propriété Count est ne pas être supérieure à zéro, donc je continuer avec la mise en service.

Cette approche, la vérification d'un utilisateur à la fois — est celui qui est uniquement possible donné la manière la fonction de provision est générée. C'est parce que son bloc de script PROCESS extrait uniquement un seul utilisateur à la fois ;Il n'existe aucun moyen de faire un «pre-loop"Pour vérifier tout d'abord tous les utilisateurs. Il est vraiment inutile, cependant, étant donné que la vérification à la fois ne modifie considérablement les performances.

Un avantage de cette approche par rapport à celle qui suit vous présenter est que la vérification des erreurs, voir si l'utilisateur existe déjà, opération préalable est effectuée. En fait, c'est l'approche seulement vraiment viable ici parce que la fonction de provision appelle sur les autres fonctions après une tentative de création de l'utilisateur. Si vous avez ajouté vérification des erreurs à uniquement le créer ­ utilisateurs fonctionnent, les trois autres — CreateHomeFolder, AddToGroups et UpdateAttributes — peut toujours essayer d'exécuter.

Ou uniquement gérer avec IT

Mais en général, une autre approche valide pour tenter d'intercepter l'erreur. Récupération d'erreur dans Windows PowerShell v1 est un peu compliquée, mais il fonctionne quelque chose comme ceci :

  • Vous devez indiquer la cmdlet peut s'exécuter dans une erreur pour générer une exception réelle, pas seulement imprimer un message d'erreur rouge
  • Vous devez définir une interruption, où vous allez traiter avec les conséquences de l'erreur

Je peut faire réellement ce suffisamment sophistiqué pour travailler avec la fonction de provision. Le travail démarre, cependant, dans la fonction CreateUser. Quelque part dans cet emplacement est une applet de commande tente de créer un nouvel utilisateur : nouveau-QADUser ou la cmdlet New-Mailbox si vous utilisez Exchange Server 2007 pour créer les utilisateurs et des boîtes aux lettres tout à la fois. Dans les deux cas, vous ajoutez le paramètre –ErrorAction (ou –EA) pour indiquer à l'applet de commande pour modifier son comportement d'erreur par défaut.

Vous devez également définir une interruption qui est le shell consulteront lorsqu'une exception se produit réellement. Les modifications de la fonction CreateUser peuvent ressembler à ceci :

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

J'ai omis le reste de la syntaxe de New-Mailbox rendre cette illustration plus claire. En fait, si New-Mailbox échoue, le paramètre –EA lui indique d'arrêter et lève une exception. Cela force le shell pour rechercher une interruption déjà définie et l'exécuter. Dans cette interruption, j'enregistrer le nom d'utilisateur dans un fichier et ensuite exécuter un saut, quitte la fonction en cours qui repasse l'erreur d'origine à ce qu'appelé cette fonction. En d'autres termes, la fonction de provision finirez avec l'erreur.

Pour empêcher l'exécution trois autres fonctions de provision, je dois modifier la façon dont il les exécute (voir de la figure 2).

La figure 2 modification de la méthode Provision exécute

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

Comme vous pouvez le voir, j'ai défini un autre interruption. Si CreateUser se termine par une erreur, l'interruption provision exécutera. Il définit simplement une variable, $ allez, à la valeur booléenne false et le shell pour continuer, ce qui signifie que poursuivre l'exécution de la ligne suivant celle qui a provoqué l'erreur. Cette ligne est une instruction "If"instruction, qui vérifie si $ passez contient $ True ou non. Si tel est le cas, les trois fonctions restantes exécuter ;Si $ contient $ False, ces trois fonctions n'exécutent pas. Je réinitialiser cette valeur de $ allez en haut de la scriptblock PROCESS afin que l'utilisateur suivant va être tentée.

La raison que j'ai utilisé cette approche particulier (et non de n'importe quel nombre d'autres personnes que vous avez peut-être choisi) est qu'il permet de m'avoir code supplémentaire qui s'exécute même si la création d'utilisateur a échoué (voir figure 3).

La figure 3 Ajout d'un appel à OutputToHTML

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

Dans la variante indiquée, j'ai ajouté un appel à une fonction nommée OutputToHTML. Il s'exécute même si l'utilisateur en cours existe déjà et CreateHomeFolder, AddToGroups et UpdateAttributes ne s'exécutent pas.

Amélioration de la version 2

Windows PowerShell v2, qui sera fourni pour la première fois dans Windows 7 (et qui seront éventuellement disponible pour des versions antérieures de Windows), ajoute les nouvelles fonctionnalités de gestion des erreurs qui sont un peu plus facile de travailler avec : Blocs try … catch. Complet est abordée dans cet article, afin que je vous dis juste que cette nouvelle fonctionnalité offre plus gestion des erreurs structurée qui vous donne davantage d'options pour un peu moins de complexité.

Don Jones est un des formateurs de Windows PowerShell plus expérimentés et des writers du pays. Il blogs semaine Windows PowerShell conseils à ConcentratedTech.com; Vous pouvez également contacter ou lui poser des questions il.