Hé, le scripteur ! Parcourir Active Directory

The Microsoft Scripting Guys

Téléchargement de code disponible à: HeyScriptingGuy2009_02.exe(151 KO)

Contenu

En donnant à l'aide
Le Nitty-Gritty
Fonctions d'assistance

Comme vous le savez peut-être, L'éditeur de script et j'ont uniquement récemment deviennent les nouvelles à plein temps Microsoft Scripting Guys, et nous avons passé grande partie de notre temps dernièrement sifting via des milliers de messages électroniques à la scripter@microsoft.com en plaçant ce qui suit dans le champcompte de messagerie. Sans avoir commission en fait une étude, nous avez venture à deviner que la question numéro un courrier électronique nous avons vu est « où puis-je obtenir l'Explorateur d'Active Directory. » Mais devinez quoi ? Nous avons jamais vu la chose. Nous avons examiné et était mais n'a pas trouvé.

Enfin, après la suppression d'un nombre de messages secret sur une carte de message Internet, nous avons une réponse codée que, lorsque deciphered, indiqué nous que le ADSI Scriptomaticest en fait l'Explorateur d'Active Directory. Eh bien, il s'agit pas de l'Explorateur d'Active Directory et de son objectif est navigation pas réellement Active Directory (il de vous aider à créer des scripts ADSI), donc J'AI décidé d'écrire un script Windows Power­Shell qui vous permet de parcourir le schéma Active Directory. Il est appelé, étrange suffisamment BrowseActiveDirectory­Schema.ps1, et il est affiché dans la figure 1 .

La figure 1 BrowseActiveDirectorySchema.ps1

Param($action,$class, [switch]$help)

Function GetHelp()
{
  $helpText= '
@"
 DESCRIPTION:
 NAME: BrowseActiveDirectorySchema.ps1
 Browse Active Directory Schema. Lists Classes, and properties. 

 PARAMETERS: 
 -Action <L(ist all classes), M(andatory), O(ptional), F(ind)>
 -Class class to search: user, computer, person, contact etc
 -Help displays this help topic

 SYNTAX:
 BrowseActiveDirectorySchema.ps1 -A L
 Lists the name of each class defined in the AD schema

 BrowseActiveDirectorySchema.ps1 -A M -c user
 Lists the mandatory properties of the user class

 BrowseActiveDirectorySchema.ps1 -A O -c computer
 Lists the optional properties of the computer class

 BrowseActiveDirectorySchema.ps1 -A F -c user
 Lists all Active Directory Classes that contain the word user 
 in the actual class name

 BrowseActiveDirectorySchema.ps1 -Action Find -c user
 Lists all Active Directory Classes that contain the word user 
 in the actual class name

 BrowseActiveDirectorySchema.ps1 -help
 Prints the help topic for the script
"@ #end helpText
  $helpText
} #end GetHelp
Function GetADSchema($Action, $class)
{
 $schema = [DirectoryServices.ActiveDirectory.ActiveDirectorySchema]::GetCurrentSchema()
 Switch ($Action)
  {
   "classes" { 
              $schema.FindAllClasses() | 
              Select-Object -Property Name 
             }
   "Mandatory" 
             {
              "Mandatory Properties of $class object"
              ($schema.FindClass("$class")).MandatoryProperties | 
               Format-Table -Property Name, Syntax, IsSingleValued -AutoSize 
             }
   "Optional" 
             {
              "Optional Properties of $class object"


              "This might take a few seconds ..."
              ($schema.FindClass("$class")).OptionalProperties | 
              Format-Table -Property Name, Syntax, IsSingleValued -AutoSize 
             }
   "Find" 
             {
              $schema.FindAllClasses() | 
              Where-Object { $_.name -match "$class" } |
              Select-Object -property name
             }
   DEFAULT {"$action is not a valid action." ; GetHelp ; Exit}
  }
} #end GetADSchema

Function GetAllClasses()
{
 GetAdSchema("classes")
} #end GetAllClasses

Function GetMandatory($class)
{
 GetAdSchema -action "Mandatory"  -class $class 
} #end GetMandatory

Function GetOptional($class)
{
 GetAdSchema -action "Optional"  -class $class 
} #end GetOptional

Function FindClasses($class)
{
 GetAdSchema -action "Find" -class $class
} #end FindClasses
# *** Entry Point to Script ***
if($help) { GetHelp ; Exit }

Switch ($action)
{
 "L" {GetAllClasses ; Exit}
 "M" {GetMandatory($class) ; Exit}
 "O" {GetOptional($class) ; Exit}
 "F" {FindClasses($class) ; Exit}
 DEFAULT { "$action is not a valid action." ; GetHelp ; Exit} 
}

Comme vous le constatez, le script commence par l'instruction de paramètre. Cela permet de créer trois paramètres de ligne de commande qui vous permettent de modifier le script en exécutant, au lieu de devoir modifier le script pour voir différent comportement, qui est très utile :

Param($action,$class, [switch]$help)

Si, par exemple, vous souhaitez voir les propriétés obligatoires de la classe d'utilisateurs dans les services de domaine Active Directory (AD DS), vous spécifiez le –action mesure et l'utilisateur –class, qu'illustré La figure 2 .

fig02.gif

La figure 2 Affichage les propriétés obligatoires de la classe d'utilisateurs

Vous pouvez tout aussi facilement choisir les propriétés facultatives de la classe de groupe. C'est l'avantage d'utiliser les paramètres de ligne de commande : vous pouvez modifier le comportement d'un script à exécution au lieu de devoir revenir à la grille de dessin. Il est recommandé lorsque vous écrivez les scripts que vous souhaitez utiliser comme utilitaires, au lieu des que vous utiliserez une seule fois.

En donnant à l'aide

La section suivante du script dans la figure 1 affiche la fonction GetHelp. Lorsque vous écrivez un script qui expose les paramètres de ligne de commande, il est recommandé d'inclure une fonction qui affiche l'aide pour l'aide du script. Vous souhaitez l'interdire de votre script à ouvrir et lire tout le texte afin de déterminer ce qu'elle fait. Cette propriété a la valeur True, un principe de conception de script généraux est qu'un script doit être lisible, mais si vous incluez une fonction d'aide, vous faciliter vie pour les utilisateurs.

La fonction GetHelp affiche des informations dans beaucoup la même manière que la cmdlet Get-Help. Trois sections de texte sont affichées : description, paramètres et syntaxe. GetHelp fait deux choses. Il crée une chaîne ici qui contient le texte à afficher, et puis il affiche le contenu de la variable qui contient la chaîne-ici (dans ce cas, il est helpText $).

Une chaîne ici, est une structure de Windows PowerShell vous permet de taper informations et formater la sortie sans craindre de citer des règles. Tout ce que vous tapez dans la chaîne-ici est considéré comme texte. GetHelp est appelé lorsque le script est exécutez avec le commutateur –help ou si quelqu'un tape un paramètre incorrect. figure 3 illustre le résultat de l'appel du script avec le commutateur –help.

fig03.gif

La figure 3 appel le script avec the–help passer

Le Nitty-Gritty

Maintenant nous viennent à la fonction GetAD­Schema, celui qui est essentiel du travail réel pour le script dans la figure 1 . La clé icie utilise la classe DirectoryServices.ActiveDir­ectory.ActiveDirectorySchema Microsoft .NET Framework. En plaçant entre crochets et après que la classe avec doubles deux-points, vous pouvez accéder les méthodes statiques de la classe (dans ce cas, GetSchema et Get­CurrentSchema).

La méthode statique GetCurrent­Schema renvoie une instance d'une classe Active­DirectorySchema qui représente le schéma à laquelle vous êtes actuellement connecté. la figure 4 illustre les membres de classe ActiveDirectorySchema.

fig04.gif

Après avoir créé une instance de la classe DirectoryServices.ActiveDirectory.Ac­tive­Schema .NET Framework et banque de l'objet de schéma qui en résulte dans la variable de schéma $, vous devez décider quelle action effectuer. Pour ce faire, une instruction switch évalue la valeur qui est passée au de la variable d'action $.

Selon la condition est satisfaite, la fonction est rechercher toutes les classes dans AD DS, d'afficher les propriétés obligatoires ou facultatifs d'une classe spécifique ou recherchez une classe qui répond à un critère donné. Lorsque vous utilisez le commutateur, il est recommandé de toujours inclure une condition par défaut.

Fonctions d'assistance

Pour diviser du code et le rendre plus faciles à développer le script, j'ai inclus un certain nombre de d'assistance de fonctions qui sont appelées en fonction des paramètres transmis au script lorsqu'il est exécuté. Chacune des fonctions d'assistance appelle GetADSchema qui transmet un autre ensemble de paramètres, selon la valeur fournie pour le paramètre –action à partir de la ligne de commande.

La première fonction d'assistance est GetAllClasses qui appelle GetADSchema et transmet le mot « classes ». Lorsque l'instruction Switch dans la fonction GetAD­Schema correspond à la chaîne « classes », il appelle la méthode FindAllClasses à partir de la classe ActiveDirectorySchema. Voici le code appelé par l'instruction Switch :

"classes" { 
              $schema.FindAllClasses() | 
              Select-Object -Property Name'

Et Voici la fonction GetAllClasses :

Function GetAllClasses()
{
GetADSchema("classes")
} #end GetAllClasses

La fonction d'assistance suivante est GetMandatory, dont l'objectif consiste à retourner les propriétés obligatoires de l'objet spécifié dans le paramètre –class lorsque le script est exécuté. La fonction GetMandatory reçoit la valeur de la classe $ de la ligne de commande via le paramètre –class. Lorsque GetMandatory appelle la fonction GetADSchema, il transmet deux paramètres. Car deux paramètres sont en cours passés, je considère qu'il recommandé de spécifier le nom complet de paramètre pour les deux, facilite la lecture et la compréhension du code. En revanche, dans la fonction GetAllClasses, nous n'a pas utiliser le –action paramètre nom lorsque vous appelez la fonction GetADSchema. Dans ce cas, la valeur « classes » a été passée d'une manière position.

Lorsque la fonction GetADSchema est appelée, elle utilise la méthode FindClass à partir de la classe ActiveDirectorySchema pour récupérer la classe qui est spécifié dans la variable de classe $. Elle renvoie une instance d'une classe ActiveDirectorySchemaClass. Les membres de cette classe sont illustrés figure 5 .

fig05.gif

La fonction GetADSchema interroge la propriété MandatoryProperties de l'objet suivant et canalisations les résultats de la cmdlet Format-Table, où il choisit les propriétés Name, syntaxe et IsSingleValued. Le paramètre –autosize a basculé de la cmdlet Format-Table redimensionne automatiquement les colonnes pour éviter les coupant hors des valeurs de propriétés, si possible. Le code qui exécute lorsque la chaîne « obligatoire correspond est affichée ici :

"Mandatory" 
       {
       "Mandatory Properties of $class object"
       ($schema.FindClass("$class")).MandatoryProperties | 
       Format-Table -Property Name, Syntax, IsSingleValued -AutoSize 
       }

Et Voici la fonction GetMandatory :

Function GetMandatory($class)
{
 GetAdSchema -action "Mandatory" -class $class 
} #end GetMandatory

Maintenant examinons comment la fonction Get­Optional peut afficher les propriétés facultatives d'une classe de services de domaine Active Directory (AD DS). GetOptional accepte la valeur de classe $ reçue à partir de la ligne de commande via le paramètre –class, puis il transmet la valeur de classe $ à la fonction GetADSchema along with l'action appelée « manuel ».

Lorsque la chaîne « manuel » est détectée dans l'instruction Switch, un message est imprimé à l'écran afin d'expliquer qu'affichage des propriétés facultatives peut prendre quelques secondes. Ensuite, la méthode FindClass à partir de la classe ActiveDirectorySchema est appelée. La méthode FindClass renvoie une instance d'une classe ActiveDirectory­SchemaClass. Si vous étiez pour interroger la propriété Optional­Properties de la classe ActiveDirectorySchema­Class, il souhaitez renvoyer les propriétés facultatives définies pour la classe sélectionnée dans AD DS.

Les résultats sont pipelined à la cmdlet Format-Table, qui affiche les informations dans la même manière que pour les propriétés obligatoires. Voici cette section du code :

"Optional" 
      {
      "Optional Properties of $class object"
      "This might take a few seconds ..."
      ($schema.FindClass("$class")).OptionalProperties | 
      Format-Table -Property Name, Syntax, IsSingleValued -AutoSize 
      }

Le code suivant est la fonction GetOptional terminée :

Function GetOptional($class)
{
 GetAdSchema -action "Optional"  -class $class 
} #end GetOptional

La fonction d'assistance final est FindClasses qui appelle la fonction GetADSchema et transmet deux valeurs. Le premier est l'action rechercher et le deuxième est la classe pour localiser. Cette fonction vise pour aider l'utilisateur à identifier les classes dans le schéma Directory qui peut merit plus exploration.

Supposons que vous êtes intéressé par l'utilisation de courrier électronique. Dans ce cas, vous souhaitez voir les classes liées à la messagerie, puis les propriétés existent pour une classe applicable. Comme le montre la figure 6 , tout d'abord vous exécutez le script avec la f –action et –class messagerie paramètres. Ceci renvoie toutes les classes qui ont la chaîne de messagerie contenu quelque part dans le nom. Après avoir trouvé une classe que vous intéresse, vous découvrez les propriétés de la classe en cliquant sur l'action m (pour obligatoire) et en spécifiant le paramètre –c (pour la classe), suivi du nom exact de la classe.

fig06.gif

La figure 6 recherche une classe dans le schéma de services de domaine Active Directory (AD DS)

Lorsque la fonction FindClasses appelle le GetADSchema, la méthode FindAllClasses est appelée et la collection obtenue de classes ActiveDirectorySchemaClass est envoyée via le pipeline. Le Where-Object utilise une correspondance d'expressions régulières pour rechercher des classes qui correspond à la valeur stockée dans la variable de classe $. Voici le code :

"Find" 
    {
    $schema.FindAllClasses() | 
    Where-Object { $_.name -match "$class" } |
    Select-Object -property name

Et c'est la fonction FindClasses :

Function FindClasses($class)
{
 GetAdSchema -action "Find" -class $class
} #end FindClasses

Une fois que toutes les fonctions d'assistance sont définies, vous arrivez au point d'entrée au script. Le point d'entrée ne fait qu'une seule chose, il examine la ligne de commande et détermine quelle fonction appeler. La première chose à savoir activée est la présence du paramètre –help. Si le script est exécuté avec –h ou –help, le script s'appeler la fonction GetHelp pour afficher l'aide et quittez, comme suit :

if($help) { GetHelp ; Exit }

Étant donné que le paramètre –help est examiné pour première, sa présence dans la ligne de commande trumps tout le reste. Si le paramètre –help n'a pas utilisé, le script doit évaluer la valeur fournie pour le paramètre –action, qui est le paramètre par défaut. Rien tapé sur la ligne de commande peut être interprétée comme une valeur de –action Si rien d'autre n'est utilisé. Cela donne l'avantage de permettre la capture de l'entrée fictif au script.

L'instruction switch est un outil naturel pour évaluer les valeurs fournies pour –action. Les quatre opérations sont définies, chaque qui appeler la fonction appropriée. La cinquième condition qui est définie est l'action par défaut et affiche un message indiquant que l'action n'est pas autorisée, whereupon il appelle la fonction GetHelp.

Une chose à garder à l'esprit sur l'instruction Switch est qu'il trouve plusieurs correspondances. Pour cette raison, l'instruction Exit est utilisée après chaque appel aux fonctions. Voici le code d'instruction Switch :

Switch ($action)
{
 "L" {GetAllClasses ; Exit}
 "M" {GetMandatory($class) ; Exit}
 "O" {GetOptional($class) ; Exit}
 "F" {FindClasses($class) ; Exit}
 DEFAULT { "$action is not a valid action." ; GetHelp ; Exit} 
}

Enfin, qui est plus gens. Il n'y a aucun Explorateur d'objets Active Directory, autres que le Scriptomatic ADSI. Mais le script BrowseActive­DirectorySchema.ps1 doit servir également pour le temps. Pour plus amusante script Active Directory, consultez la Active Directory script concentrateur. Et que vous savez que nous sommes ouvrir chaque moment de l'année sur la Centre de scripts.

Wilson Édition est consultant senior chez Microsoft et un expert de script bien connu. Il est un Trainer de Certified pour le Microsoft qui fournit un atelier de Windows PowerShell courante à Microsoft premier clients dans le monde entier. Il a écrit des livres huit notamment plusieurs de scripts Windows, et il a contribué à presque une douzaine autres livres. Édition contient plus de 20 certifications de secteur d'activité.

Craig Liebendorfer est wordsmith et longtime éditeur Web de Microsoft. Craig can’t pensez toujours il ’s un travail paie lui pour travailler avec des mots chaque jour. Une des ses choses favoris est irreverent d'humour, afin qu'il doit ajuster droite ici. Il considère que ses accomplishment plus élevé dans la vie à sa fille magnificent.