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

Don Jones

目次

ユーザーを作成する
Exchange Server 2007 を使用していない場合
柔軟性

先月のコラムでは、ユーザー プロビジョニングを自動化するスクリプトの基盤を作成し、ProvisionInputCSV という関数を作成しました。この関数は、CSV ファイルからユーザーの情報を読み取り、その情報をハッシュテーブルの形式で返すように設計されています。この関数は、他に複数のインポート関数 (データベース、スプレッドシートなどからデータをインポートする関数) を作成し、それぞれの関数で同じ見た目のハッシュテーブルが返されるようにするために作成しました。プロビジョニング関数本体で必要な処理は、単に、返されたハッシュテーブルを受け取ることです。ハッシュテーブルには、ユーザーの名、姓、市区町村、部署などの要素が含まれています。

今月のコラムでは、まず、返されたハッシュテーブルを使用して、メールボックスが有効になっている新しい Active Directory ユーザー (Exchange Server 2007 を使用していない場合は、メールボックスが有効になっていないユーザー) を作成します。

プロビジョニング (Provision) 関数の基本的な構造は次のようになります。

Function Provision {
  PROCESS {
  }
}

この関数では、パイプラインでハッシュテーブルを受け取るようになっています。ハッシュテーブルには、PROCESS スクリプト ブロック内で $_ という特殊な変数を使用してアクセスします。ハッシュテーブルにユーザーの属性に対応するキーが作成され、それらのキーの値に各ユーザーの情報が格納されます。たとえば、次のようなものがあります。

  • $_['sn'] = "Jones"
  • $_['givenName'] = "Don"
  • $_['samAccountName'] = "donj"

実際に使用できる属性は、ProvisionInputCSV 関数や他のインポート関数に渡した情報によって異なります。

通常、ユーザー プロビジョニングでは、アカウントの作成、フォルダの作成など、いくつかのタスクを行う必要があります。このようなタスクをすべて Provision 関数で実行することは簡単ですが、そうすると関数の処理がかなり複雑になり、デバッグとトラブルシューティングが難しくなります。ここでは、一種のマスタ タスク リストとして Provision 関数を使用し、各タスクの処理はサブ関数に分割します。最終的に、Provision 関数は次のようになります。

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

Windows PowerShell に関する Q&A

Q –computerName パラメータを使用しているコマンドレットはほとんど見かけません。Windows PowerShell を使用してリモート コンピュータを管理することはできますか。

A Windows PowerShell 1.0 では、完全なリモート管理機能は提供されていません。お気付きかもしれませんが、Get-WmiObject コマンドレットでは -computerName パラメータを指定できるので、1 台以上のリモート コンピュータから情報を取得できます。このコマンドは次のようになります。

Get-WmiObject Win32_Service –computerName
  "localhost","server2","server3"

ただし、これは、Windows PowerShell 1.0 に組み込まれている唯一のリモート管理機能です。

しかし、Exchange Server や Active Directory などの他のテクノロジには、リモート管理機能が備わっています。つまり、クライアント コンピュータはメール サーバーやドメイン コントローラでないことを認識していて、必要に応じてメール サーバーやドメイン コントローラに接続します。ですので、このようなテクノロジと連携するコマンドでは -computerName パラメータは必要ありません。

4 つのサブ関数では、このシリーズの第 1 部で概説した主なタスクを処理します。また、各サブ関数には、$_ 変数に格納されたユーザー情報一式が渡されます。これで、プロビジョニング スクリプトは完成です。

ユーザーを作成する

ほんの冗談です。当然ながら、前述の 4 つのサブ関数で行う実際の処理を記述する必要があります。今月のコラムでは、CreateUser 関数について説明します。このコードの最初の反復処理では、環境で Exchange Server 2007 が使用されていることを想定しています (申し訳ありませんが、このコードは Exchange Server 2007 以前のバージョンでは機能しません)。このスクリプトを実行するコンピュータには、Exchange Server 管理ツールがインストールされている必要があります。また、Windows PowerShell 用の Exchange Server スナップインが読み込まれているようにする必要があります。この確認を行うには、Get-PSSnapin コマンドレットを実行して、Windows PowerShell 用の Exchange Server スナップインが一覧に表示されるかどうかを確認します。表示されない場合は、Get-PSSnapin -registered というコマンドを実行してスナップインがインストールされていることを確認します。その後、次のコマンドを実行して、シェルにスナップインを読み込みます。

Add-PSSnapin Microsoft.Exchange.Management.PowerShell.Admin. 

上記のコマンドを入力するのが面倒な場合は、すべてのプロビジョニング関数が含まれているスクリプトにコマンドを追加したり、Windows PowerShell プロファイルにコマンドを追加してシェルを開いたときに読み込まれるようにしたりすることができます (カスタム プロファイルの作成方法については、2008 年 10 月号のコラム「プロファイルの力」を参照してください)。

この関数の基本的な構造は次のようになります。

Function CreateUser {
  Param($userinfo)
}

ここでは Param というブロックを含めました。このブロックにより、必要なパラメータがシェルに指示されます。この関数を呼び出すと、渡したハッシュテーブルが $userinfo 変数に自動的に格納されます。

この関数は、次のように記述することもできます。

Function CreateUser($userinfo) {
}

この構文でもまったく同じ処理が行われます。ただし、シェルの内部では最初に紹介した構文が使用されるので、私自身は、最初の構文を使用することが多いです。また、Param ブロックを使用すると、関数では、その後の処理がやりやすくなるというメリットがあります。

関数内で実行する必要があるのは、New-Mailbox という 1 つのコマンドレットだけです。このコマンドレットは、新しいメールボックスを作成するだけでなく、Active Directory に新しいユーザーを作成します。メールボックスを格納するメールボックス データベースなど、事前に把握しておく必要のある情報があります。基本的な構文は次のようになります (非常に長い構文ですが、1 行のコマンドです)。

New-Mailbox –UserPrincipalName don@concentratedtech.com 
  -alias DonJ 
  –database "Storage Group 1\Mailbox Database 1" 
  –name Don Jones 
  –organizationalUnit Users 
  –password $password 
  –FirstName Don 
  –LastName Jones 
  –DisplayName "Don Jones" 
  –ResetPasswordOnNextLogon $true

ご覧のとおり、新しいユーザーのパスワードを考えて、そのユーザーを追加する OU (組織単位) を決める必要があります (厳密には、この例の Users は、OU ではなくコンテナですが、New-Mailbox コマンドはどちらの情報でも受け取るので問題ありません)。必要なすべてのデータを生成するように ProvisionInputCSV 関数を変更すると、$userinfo 変数には次の最小限の情報が含まれるようになります。

  • UPN (ユーザー プリンシパル名)
  • OU (ユーザーを追加する OU)
  • MailDatabase
  • givenName (名)
  • sn (姓)
  • samAccountName (エイリアスとして使用します)

そのため、CreateUser 関数は次のようになります。

Function CreateUser {
  Param($userinfo)

New-Mailbox –UserPrincipalName $userinfo['upn'] 
  -alias $userinfo['samAccountName'] 
  –database $userinfo['mailboxDatabase'] 
  –name ($userinfo['givenName'] + ' ' + $userinfo['sn']) 
  –organizationalUnit $userinfo['ou'] 
  –password 'P@ssw0rd!' –FirstName ($userinfo['givenName'] 
  –LastName $userinfo['sn']) 
  –DisplayName ($userinfo['givenName'] + ' ' + $userinfo['sn']) 
  –ResetPasswordOnNextLogon $true
}

この場合も、コマンドは 1 行ですが、わかりやすいように改行を入れました。この関数を、Provision 関数および ProvisionInputCSV 関数と組み合わせて使用すると、新しいユーザーが作成され、ユーザーのメールボックスが有効になります。

ここで注目すべき点をいくつかご紹介しましょう。

  • 名前で使用した大文字と小文字の組み合わせが維持されるなど、Active Directory では大文字と小文字が区別されますが、コマンドでは大文字と小文字が区別されません。
  • -name パラメータと -displayName パラメータに渡す値は式で指定しています。シェルで式が評価されてパラメータに結果が渡されるように、式を (かっこ) で囲んでいます。この技法を使用すると、givenName 属性と sn 属性の値を使用してフル ネームを作成できます。
  • 一時的なパスワードは、作成するのではなくハードコーディングしました。パスワードを作成するには、ユーザーにパスワードを通知する方法が必要ですが、それは今回のコラムで取り扱う範囲を超えているので、説明は省略します。
  • $true 変数はシェルに組み込まれているもので、ブール値 True (False の反対) を表します。

Exchange Server 2007 を使用していない場合

Exchange Server 2007 を使用していない場合、Windows PowerShell を使用してメールボックスが有効になっているユーザーを作成することはできません。ただし、Active Directory に基本的なユーザー アカウントを作成することはできます。これを行うには、www.quest.com/powershell から無償でダウンロードして利用できる、Windows PowerShell に対応した一連の Active Directory コマンドレットが必要です。スクリプトを実行するコンピュータにこれらのコマンドレットをインストールし、次のコマンドを実行してシェルにスナップインを追加します。

Add-PSSnapin Quest.ActiveRoles.ADManagement 

スナップイン名に市販の Quest 製品の名前 (ActiveRoles Server) が含まれていますが、スナップインのコマンドレットを使用するために、その製品が必要なわけではありません。

ここでは、New-QADUser コマンドレットを使用します。このコマンドレットは、CreateUser 関数内で次のような構文で実行します。

New-QADUser –samAccountName $userinfo['samAccountName'] 
  –parentContainer $userinfo['OU'] 
  –FirstName $userinfo['givenName'] 
  –LastName $userinfo['sn'] 
  –Name ($userinfo['givenName'] + ' ' + $userinfo['sn']) 
  –UserPrincipalName $userinfo['UPN'] 
  –displayName ($userinfo['givenName'] + ' ' + $userinfo['sn']) 
  –userPassword "P@ssw0rd!" | Enable-QADUser

このコマンドの出力 (新しく作成されたユーザー) を、ユーザー アカウントを有効にする別のコマンドレットにパイプしていることに注意してください。この設計がお使いの環境に適しているかどうかは、ご自分で判断してください。

New-QADUser コマンドレットには、追加の Active Directory 属性を設定するのに使用できる多数のパラメータが用意されていますが、Exchange Server 2007 との対応性を高めるために、現状のままにしてあります。追加の属性については、このスクリプトの最後の部分で付け足します。

柔軟性

Exchange Server 2007 を実行している場合でも、New-QADUser コマンドレットを使用してユーザー アカウントを作成するのが適していることがあります。New-QADUser コマンドレットではすべてのディレクトリ属性を処理できるので、このコマンドレットを使用すると柔軟性が確実に向上します。また、Exchange Server 2007 を使用しているかどうかに関係なく、スクリプトを任意の環境で実行できるようになります。

Exchange Server 2007 を使用している場合は、New-Mailbox コマンドレットの代替構文を使用して、メールボックスを作成し、作成したばかりの Active Directory アカウントに関連付けることができます。通常、Windows PowerShell で何か処理を行う際には複数の方法が用意されています。一般に、最適な方法とは、最短の学習時間で必要な処理を実行できる方法です。

来月は、ユーザーのホーム フォルダを作成し、適切なアクセス制御リスト (ACL) を適用する処理を追加して、このプロビジョニング関数を拡張します。ACL の操作には特に注意が必要ですが、Windows PowerShell の技法には、その作業を驚くほど簡単に完了できるものがあります。

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