Windows PowerShellユーザー プロビジョニングを自動化する (第 1 部)

Don Jones

目次

目標を設定する
初期構造を構築する
データを取得する
拡張
次回について

このコラムでは、実用的なユーザー プロビジョニング スクリプトを Windows PowerShell で作成する方法を 4 回シリーズで紹介します。第 1 回目では、スクリプト構造の作成を中心に取り上げます。来月のコラムでは、Active Directory および Exchange Server 2007 でメールボックスが有効な新しいユーザーを実際に作成する方法について説明します。5 月号のコラムでは、ホーム ディレクトリを作成して、適切なアクセス制御リスト (ACL) を適用する方法を紹介します。そして最終回となる 6 月号のコラムでは、グループに新しいユーザーを配置して、追加の Active Directory 属性を設定する方法を紹介します。

Windows PowerShell に関する Q&A

Q MSDN Web サイトで Win32_OperatingSystem Windows Management Instrumentation (WMI) クラスについて調べたところ、このクラスにはサービス パックのバージョン情報が含まれていることがわかりました。ですが、Windows PowerShell で Get-WmiObject Win32_OperatingSystem というコマンドを実行しても、サービス パックの情報が表示されません。なぜでしょうか。

A Windows PowerShell の書式設定サブシステムにより、Win32_OperatingSystem WMI クラスの表示するプロパティの既定サブセットが選択されます。すべてのプロパティが表示されるようにするには、次のように書式設定コマンドレットを使用して既定の処理を無効にする方法があります。

Get-WmiObject Win32_OperatingSystem | Format-List *

特定のプロパティを表示する必要がある場合は、次のようなコードを実行します。

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

目標を設定する

ユーザー プロビジョニングで最も厄介なのは、初期データの取得元を決定することです。作成するユーザーをどのように判断すればよいのか、名前、電子メール アドレス、郵送先住所、所属部署、その他の詳細情報などのユーザー情報をどこから取得するのか、ということを考える必要があります。

これは環境によって異なるので、さまざまな場所から取得したデータを受け取れるスクリプトを作成します。スクリプトは若干複雑になりますが、柔軟性が向上するため、長期的に見れば労力を費やす価値があります。また、100 人の新しいユーザーをできるだけ簡単に作成できるスクリプトも作りたいと考えています。つまり、自動化を実現したいと考えています。

初期構造を構築する

さまざまな企業のコンサルティングを数多く行っていますが、その中心となるのはスクリプトの作成と自動化です。当然のことながら、これまでに多数のスクリプト見てきてましたが、管理者はプロビジョニング スクリプトを 1 つしか作成しない傾向があることに気付きました。

時間の経過と共に、管理者は、より多くのタスクを処理できるようにスクリプトを変更するでしょう。これは悪い方法ではありませんが、もう少しモジュール化された構造をあらかじめ作成しておけば、より柔軟で保守が簡単なスクリプトを作成できます。また、このような構造の作成には、それほど多くの追加作業は必要ありません。

まず、Provision という名前のメイン関数を使用します。この関数で実行される処理はそれほど多くありません。Provision 関数は、新しいユーザーの情報を含むハッシュテーブル (または連想配列) を受け取って、すべてのプロビジョニング タスクを実際に処理する一連のサブ関数を呼び出します。Windows PowerShell を使用するので、すべての処理がパイプラインで行われるようにする必要があります。そのため、Provision 関数が、新しいユーザーごとに 1 つのハッシュテーブルを受け取るようにします。また、多数のハッシュテーブルが指定されたパイプラインを受け取って複数のユーザーを作成できるようにします。

基本的な関数テンプレートは次のようになります。

Function Provision {
  PROCESS {
  }
}

あまりインパクトはありませんね。でも Windows PowerShell の場合、それで良いのです。この PROCESS スクリプト ブロックは、この関数にパイプするオブジェクトごとに 1 回実行されます。また、PROCESS スクリプト ブロック内では $_ 変数を使用して、現在のパイプライン オブジェクトにアクセスします。

データを取得する

Provision 関数単独でデータを取得していないのは、柔軟性を向上させ、新しい形式のデータが導入されるたびに関数を変更しなくても済むようにするためです。代わりに、CSV ファイルとデータベースから新しいユーザーの情報を取得する 2 つの関数を作成します。CSV ファイルはメモ帳などのテキスト エディタを使用して (または Microsoft Excel や大半のデータベース アプリケーションでも) 簡単に作成できるので、ここでは CSV に対応した関数について説明します。

CSV についての注意事項は、ファイルの列見出しが適切な Active Directory 属性であるとは限らないことです。特に、専門知識の乏しい人から提供された CSV ファイルの場合は注意が必要です。つまり、sn や samAccountName ではなく、Last Name や Logon Name のような列名が使用されている可能性が高いということです。しかし、Windows PowerShell では、このような列名を変換できるので問題ありません。たとえば、CSV ファイルに次の列が含まれているとします。

  • First Name
  • Last Name
  • City
  • Department
  • Job Title
  • Logon Name
  • Password

もちろん、このリストは拡張できます。そのしくみについては、この後すぐに説明します。このリストを使用したサンプル CSV ファイルは次のようになります。

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

次のように、ProvisionInputCSV という名前の関数を作成し、この関数が入力パラメータとしてファイル名を受け取り、単に CSV ファイルを読み取るようにします。

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

次のように、この関数を単独で実行して、関数が CSV ファイルを読み取っていることを確認することができます。

ProvisionInputCSV c:\files\myinput.csv

次に、ProvisionInputCSV 関数で CSV ファイルの各行をハッシュテーブルに変換します。この際、CSV ファイルの列見出しの値は、そのまま使用するのではなく、Active Directory に対応した属性名に変換します。Windows PowerShell には、この作業を行うさまざまな方法がありますが、ここでは比較的単純な方法を使用します。つまり、foreach ループを使用して CSV ファイルの各行を処理します。一度に処理する行は 1 行です。ファイルの行ごとにハッシュテーブルを作成して、パイプラインに出力します。

図 1 に示す関数をご覧ください。この関数には、次のような注目すべき点があります。

  • foreach ブロック内の $user 変数には、単一のユーザーの情報が格納されています。foreach コンストラクトによって $users 変数の各行が処理され、$user 変数に次の値が自動的に設定されます。
  • 列見出しにはスペースが含まれているものもあるので、列見出しの値は引用符で囲む必要があります。
  • displayName という新しい属性を追加しました。この属性は、First Name および Last Name という CSV ファイルの 2 つの列の値で構成されています。
  • Write-Output コマンドレットを使用して、パイプラインに各ハッシュテーブルを出力します。

図 1 foreach ループを使用する関数

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

以上の結果、1 つの関数を使用して CSV ファイルを読み取り、そのデータをハッシュテーブルに変換できるようになります。その後、次のように、最初に作成したプロビジョニング関数にハッシュテーブルをパイプできます。

ProvisionInputCSV c:\data\myinput.csv | Provision

Provision 関数では標準的なハッシュテーブルを受け取るので、ProvisionInputDatabase や ProvisionInputSpreadsheet など、他の類似関数を作成できます。

サブ関数から、多数のユーザー データが格納された標準的なハッシュテーブルが出力されれば、Provision メイン関数は正しく動作します。つまり、今後は、Provision 関数を変更しなくても、まったく新しい形式の新しいユーザー データを使用できるということです。

拡張

お使いのバージョンの CSV ファイルに列を追加して、電話番号など、他の必要なデータを簡単に設定することができます。必要な処理は、その情報が含まれるようにハッシュテーブルを拡張するだけです。たとえば、CSV ファイルに Description および Office という列を追加するとします。この場合に必要な作業は、図 2 に示すように、数行のコードを追加してハッシュテーブルを拡張するだけです。つまり、ここで紹介した基本構造を使用すると、お使いの環境の新しいユーザー アカウントの Active Directory 属性に対するどのような要件にも対応することができます。

図 2 変更後の関数

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

次回について

来月は、新しいユーザー アカウントを作成するサブ関数を作成して、Provision メイン関数の拡張に着手します。サブ関数については、2 つのバージョンを紹介します。1 つは (Windows PowerShell 対応の) Exchange Server 2007 を使用しているユーザー用で、もう一つは Exchange Server 2007 を使用していないユーザー用です。来月のコラムを読むと、非常に役立つスクリプトを使用できるようになります。このスクリプトで行う処理は、ユーザー アカウントの作成のみですが、ユーザー アカウントの作成は、新しいユーザーの処理の中でも時間のかかる作業なので、この関数を使用するとすぐに時間を節約できるようになります。

Don Jones は、Concentrated Technology の共同創設者です。彼は、このサイトで、Windows PowerShell、SQL Server、App-V などのトピックに関するブログを毎週更新しています。Don に対するお問い合わせについては、彼の Web サイトを参照してください。