Windows PowerShellAutomatisation utilisateur mise en service, partie 1

Don Jones

Contenu

Définition des objectifs
Création de la structure initiale
Obtention d'entrée
Expansion
Provenant des suivant

À cette rubrique, je suis pour désactiver une série de quatre sur la création d'un script pratique, réel, la mise en service par l'utilisateur dans Windows PowerShell.Dans cette première partie, je me concentrerai sur la création de la structure pour le script.Mois prochain, j'examinerai en fait créer un utilisateur nouveau, avec boîte aux lettres dans Active Directory et Exchange Server 2007.Le mois suivant, je vais s'en occupent Création des répertoires de base et en appliquant le bon Access listes de contrôle (ACL) à leur.Et dans le dernier article, je vous placer le nouvel utilisateur dans les groupes et prendre en charge lors du remplissage des attributs Active Directory.

Vidéo

Don Jones intervient désactiver une série de quatre parties regardant comment vous pouvez utiliser Windows PowerShell pour créer un utilisateur script de mise en service.Regardez n'illustrer ces techniques dans cette vidéo.

Définition des objectifs

La partie trickiest de mise en service de l'utilisateur est décider d'interviennent les données initiales.Comment se savoir quels aux utilisateurs de créer ?Et où sont J'obtiens leurs informations, telles que des noms, adresses de messagerie, adresse, service et autres détails ?

Presque chaque environnement aura une autre réponse, et donc je créerai un script qui est capable d'accepter l'entrée d'une variété de place.Qui effectue le script légèrement plus complexe, mais il vous être important l'effort à long terme parce que le script n'est plus flexible.Vous souhaitez créer un script capable de créer une centaine nouveaux utilisateurs aussi facilement qu'un, il s'agit sur automation, après tout !

Création de la structure initiale

Faire une quantité adéquate d'entreprises différentes et un lot de la vue est de scripts et automatisation.Pas étonnamment, J'AI voir beaucoup de scripts et ai j'remarqué qu'une approche courante consiste pour un administrateur pour simplement créer un seul script d'attribution de privilèges d'accès.

Dans le temps, l'administrateur modifiera le script pour gérer les tâches plus et plus.Qui n'est pas une approche incorrecte, mais en tirant temps maximum avant de créer un légèrement plus structure modularisé, vous pouvez créer un script qui est en fait plus flexibles et plus facile à gérer.Et cela ne requiert pas le volume de travail supplémentaire.

Je vais commencer par une fonction centrale nommée provision.Il n'est pas réellement va faire très beaucoup ; il accepte une table de hachage (ou un tableau associatif) qui contient les nouvelles informations utilisateur, et ensuite il appellera une série de sous-fonctions réellement gérer toutes les tâches d'attribution de privilèges d'accès.Comme il s'agit de Windows PowerShell, je veux tout cela pour travailler sur le pipeline.Ainsi, je vais à ce qu'il accepte une table de hachage pour chaque nouvel utilisateur, et je s'activer accepter une canalisation entière de hashtables pour créer plusieurs utilisateurs.

Le modèle de fonction base ressemble à ceci :

Function Provision {
  PROCESS {
  }
}

Pas très impressionnant, se trouve-t-il ? Avec Windows PowerShell, il ne doit être. Ce bloc de script PROCESS exécutera une fois pour chaque objet que je canal dans la fonction. Et dans le bloc de script PROCESS, J'AI utilisera la variable $ _ pour accéder à l'objet pipeline actuel.

Windows PowerShell Forum aux questions

q: J'AI recherché la classe Win32_OperatingSystem WMI (Windows Management Instrumentation) sur le site Web MSDN. Il indique la classe contient des informations de version service pack. Lorsque j'exécute Get-WmiObject Win32_OperatingSystem dans Windows PowerShell, sans informations sur le service pack s'affiche. Pourquoi ?

A le Windows PowerShell mise en forme sous-système sélectionne un sous-ensemble par défaut des propriétés de cette classe pour l'affichage. Une façon de forcer afin d'afficher toutes les propriétés consiste à utiliser une cmdlet mise en forme pour remplacer ces valeurs par défaut :

Get-WmiObject Win32_OperatingSystem | Format-List *

Ou, si vous voulez simplement des propriétés spécifiques :

Get-WmiObject Win32_OperatingSystem | 
Format-List BuildNumber,CSName,ServicePackMajorVersion

Obtention d'entrée

La raison que je n'est pas que la fonction provision en fait obtenir toutes les données sur son propre est que je veux une plus grande souplesse, et je ne souhaite pas revenir et modifier la fonction chaque fois que je souhaitez adopter un nouveau formulaire d'entrée. Au lieu de cela, je créerai deux fonctions qui obtenir mes informations new-utilisateur, un à partir d'un fichier CSV et l'autre à partir d'une base de données. Pour l'instant, J'AI simplement travaillerez sur la fonction liées de CSV puisque fichiers CSV sont faciles à créer avec le Bloc-notes ou un autre éditeur de texte (ou même Microsoft Excel et la plupart des applications de base de données).

Une astuce sur CSVs, surtout si fournie par une personne moins techniquement inclined, est que vous ne pouvez pas compter sur les en-têtes de colonne du fichier en cours les attributs Active Directory appropriés. C'est-à-dire, à la place des noms de colonnes comme sn et samAccountName, vous risquez plus obtenir les noms de colonne tels que Nom et nom d'ouverture de session. C'est OK, Windows PowerShell faire la conversion. Je vais commencer par en supposant qu'un fichier CSV contient les colonnes suivantes :

  • Nom
  • Nom usuel
  • Ville
  • Département
  • Fonction
  • Nom d'ouverture de session
  • Mot de passe

Vous pouvez, bien sûr, développer cette liste, je vais vous montrer comment cela fonctionne dans un instant. Utilisez cette liste, un fichier CSV exemple pourrait ressembler à ceci :

First Name,Last Name,City,Department,Job  Title,Logon Name,Password
Don,Jones,Las Vegas,IT,Writer,donj,P@ssw0rd
Greg,Shields,Denver,IT,Administrator,gregs,  P@ssw0rd

Je vais créer une fonction nommée ProvisionInputCSV, qu'il accepte un nom de fichier comme un paramètre d'entrée et il est simplement lire le fichier CSV :

Function ProvisionInputCSV {
  Param ([string]$filename)
  Import-CSV $filename
}

Je peux exécuter cette fonction en soi, comme uniquement pour vous assurer qu'il est par conséquent, lecture du fichier CSV :

ProvisionInputCSV c:\files\myinput.csv

Maintenant, je veux que la fonction convertir chaque ligne de la CSV dans une table de hachage. Et, plutôt que de conserver les noms d'en-tête de colonne du fichier CSV, je souhaite convertir ces en-têtes de colonne dans noms d'attribut plus Active Directory acceptable. Il existe de nombreuses méthodes pour cela de Windows PowerShell, mais je vais coller avec une approche est relativement simple : j'utilise une boucle foreach pour traiter chaque ligne du fichier CSV, un à la fois. Pour chaque ligne du fichier, je vais créer une table de hachage et écrire dans le pipeline.

Observez que ma fonction illustrée figure 1 . Il existe quelques points important de noter :

  • Dans le bloc foreach, la variable utilisateur $ contient un utilisateur unique. La construction foreach s'exécute à chaque ligne dans la variable utilisateur $ et le remplit automatiquement utilisateur $ avec celle qui suit.
  • Étant donné que des noms d'en-tête de colonne contiennent des espaces, il est nécessaire que J'AI placez entre ces noms guillemets.
  • J'ai ajouté un autre attribut, displayName, qui est construit à partir de deux des colonnes CSV : prénom et nom.
  • Écriture sortie est utilisé pour écrire chaque table de hachage dans le pipeline.

Figure 1 en utilisant une boucle foreach, fonction

Function ProvisionInputCSV {
  Param ([string]$filename)
  $users = Import-CSV $filename
  foreach ($user in $users) {
    $ht = @{'givenName'=$user."First Name";
            'sn'= $user."Last Name";
            'title'= $user."Job Title";
            'department'= $user.Department;
            'displayName'= $user."First Name" + " " + $user."Last Name";
            'city'= $user.City;
            'password'= $user.Password;
            'samAccountName'= $user."Logon Name"
           }
    Write-Output $ht
  }
}                                                  
 

Le résultat de tous les pratique cela est que je pouvez utiliser une fonction pour lire le fichier CSV et transformer ses données hashtables. Le hashtables peut ensuite être transmis à ma fonction d'attribution de privilèges d'accès :

ProvisionInputCSV c:\data\myinput.csv | Provision

Étant donné que ma fonction provision accepte une table de hachage normalisé, je peux créer plusieurs autres fonctions de génération de l'entrée — ProvisionInputDatabase, Pro­visionInputSpreadsheet, et ainsi de suite.

Tant que ces fonctions sortie ma table de hachage normalisé de données utilisateur, la fonction de provision principale fonctionnent correctement. Cette approche signifie que je pouvez, à l'avenir, utiliser entièrement nouveau sources d'entrée pour les nouvelles données utilisateur, sans devoir modifier la fonction de provision de base.

Expansion

Vous pouvez facilement ajouter davantage de colonnes à votre version du fichier CSV pour remplir les éléments tels que les numéros de téléphone ou autre autres données de vos besoins. Vous devez simplement vous assurer que vous également développer la table de hachage pour contenir ces informations. Par exemple, supposons que J'AI voulez ajouter Description et Office à mon fichier CSV. Je souhaitez simplement étendre la table de hachage en ajoutant des lignes, comme illustré figure 2 . En d'autres termes, vous pouvez utiliser la structure de base que j'ai indiquée pour prendre en charge qu'exigences de votre environnement a pour les attributs de répertoire de nouveaux comptes d'utilisateur.

La figure 2 révisé fonction

Function ProvisionInputCSV {
  Param ([string]$filename)
  $users = Import-CSV $filename
  foreach ($user in $users) {
    $ht = @{'givenName'=$user."First Name";
            'sn'= $user."Last Name";
            'title'= $user."Job Title";
            'department'= $user.Department;
            'displayName'= $user."First Name" + " " + $user."Last Name";
            'city'= $user.City;
            'password'= $user.Password;
            'samAccountName'= $user."Logon Name";
            'office' = $user.office;
            'description' = $user.description
           }
    Write-Output $ht
  }
}

Provenant des suivant

Mois prochain, je vais commencer remplir la fonction de provision principale en créant une sub-function qui crée de nouveaux comptes d'utilisateur. Je vais vous donner deux versions que sub-fonction — un pour les gens qui ont Exchange Server 2007 (qui est activé de Windows PowerShell) et un autre pour les gens qui n'est pas. À ce stade, vous allez réellement avez un script assez utilisable : il vous créer simplement comptes d'utilisateurs. Mais vous mesure une des parties plus de temps de traitement des nouveaux utilisateurs, cette fonction peut aider pour démarrer gagner du temps immédiatement.

Don Jones est cofondateur de Technologie concentréeoù il blogs hebdomadaires sur Windows PowerShell, SQL Server, Application-V et d'autres rubriques. Contacter par le biais de son site Web.