Windows PowerShellユーザー プロビジョニングを自動化する (第 4 部)
Don Jones
目次
入力データを決定する
グループを設定する
追加の属性
スクリプトを拡張する
最後に
このコラムは、Active Directory での新しいユーザーのプロビジョニング処理を自動化する方法を紹介している 4 部構成シリーズの最終回です。第 1 ~ 3 部では、新しいユーザーの Active Directory アカウントを作成する方法、新しいユーザーのホーム フォルダを作成する方法、および作成したホーム フォルダにアクセス許可を割り当てる方法について説明しました。今回は、複数のドメイン グループにユーザーを追加して、いくつかの Active Directory の属性を更新する方法を紹介します。
これまでの内容を思い出していただくために、概要を説明しましょう。このスクリプトでは、メイン関数を使用して、こうした作業をすべて統合しています。メイン関数については、このシリーズの第 1 部で説明しました。そのメイン関数は次のような状態です。
Function Provision {
PROCESS {
CreateUser $_
CreateHomeFolder $_
AddToGroups $_
UpdateAttributes $_
}
}
第 2 部では CreateUser 関数を作成し、第 3 部では CreateHomeFolder 関数を作成しました。第 4 部となる今月のコラムでは、AddToGroups 関数と UpdateAttributes 関数を作成します。
入力データを決定する
このシリーズで作成する 4 つの関数はすべて、ユーザー属性が格納されているハッシュテーブルを受け取ります。第 1 部で紹介したもともとの例では、コンマ区切り (CSV) ファイルからユーザー属性を読み取りました。第 1 部では、ユーザーを追加する必要があるドメイン グループを伝える方法についてあまり詳しく説明しませんでしたが、その方法はたくさんあります。たとえば、CSV ファイルに Groups という名前の 1 列を追加し、その列に名前をコンマで区切った次のような一覧を設定することができます。
"Domain Users,Sales,Marketing,East"
また、グループごとに個別の列を作成して、ユーザーを追加する必要があるグループのデータ列に 1 を指定し、ユーザーを追加しないグループのデータ列に 0 を指定することもできます。その場合、CSV ファイルのデータは次のような状態になります。
Domain Users,Sales,Marketing,East
1,1,0,0
1,0,1,1
2 つ目の方法はチェックリストのように見えるので、専門知識を持たない人 (人事部の担当者など) が使用する場合はこちらの方が使いやすいでしょう。また、このデータは Microsoft Access テーブルや Microsoft Excel スプレッドシートで簡単に作成し、形式を保持したまま CSV ファイル形式でエクスポートすることもできます。そのため、ここで紹介する例では、2 つ目の方法を採用しました。
追加の属性についても、CSV ファイルの特定の列に設定されている属性であることを想定しています。たとえば、postalCode 属性を設定する場合は、CSV ファイルに適切な列が既に追加されており、(このシリーズの第 1 部で説明した) Import 関数によって、その列が他の列と共にハッシュテーブルに読み込まれていることを想定しています。
つまり、ハッシュテーブルには、$userinfo['Domain Users'] などのようなキーが含まれる可能性があり、このグループにユーザーを追加する場合、このキーの値は 1 になります。また、新しいユーザーごとに、適切な値が指定された $userinfo['postalCode'] というキーが含まれていることもあります。
グループを設定する
AddToGroups 関数では、入力ファイルに記載されている可能性があるすべてのグループを受け取れるようにする必要があります。基本的には、グループごとに 1 または 0 のどちらが指定されているのかを確認し、1 が指定されている場合は、そのユーザーを当該のグループに追加しているだけです。通常、0 という数値はブール値の False と同じ意味で、0 以外の数値 (1 など) は True と同じ意味なので、非常に簡単に比較できます。そのため、関数は次のようになります。
Function AddToGroup {
Param($userinfo)
If ($userinfo['Sales']) { Add-QADGroupMember
-identity 'DOMAIN\Sales' '
-member ('DOMAIN\'+$userinfo
['samAccountName']) }
If ($userinfo['East]) { Add-QADGroupMember
-identity 'DOMAIN\East' '
-member ('DOMAIN\'+$userinfo
['samAccountName']) }
If ($userinfo['Marketing]) { Add-
QADGroupMember
-identity 'DOMAIN\Marketing'
-member ('DOMAIN\'+$userinfo
['samAccountName']) }
}
他のグループについても、同様にコードを記述できます。ここでも Quest の AD コマンドレットを使用しています。Quest の AD コマンドレットは、www.quest.com/powershell から無償でダウンロードできます。
同じコードを繰り返し記述するのは面倒なので、代わりに、設定できるグループ名の配列を作成して、その配列の項目を列挙したいと思います。そうすれば、今後、グループを追加または削除する場合は、コードをコピーして貼り付ける必要はなく、配列を変更するだけで済みます。そのため、関数は次のような状態になります。
Function AddToGroup {
Param($userinfo)
$groups = 'Sales','Marketing','East'
Foreach ($group in $groups) {
If ($userinfo[$group]) {
Add-QADGroupMember
-identity 'DOMAIN\'+$group
-member ('DOMAIN\'+$userinfo
['samAccountName']) }
}
}
コードは少し短くなり、読みやすくなりました。また、今後、変更が必要になった場合でも容易に対応できます。
追加の属性
最後に、UpdateAttributes 関数では、すべての追加属性に対応する必要があります。ここでも同じ方法を使用します。つまり、設定できる属性名の配列を作成して、その配列の項目を列挙します。ここでは、次のように、特定のユーザーの属性値が空白である場合を許可しています。
Function UpdateAttributes {
Param($userinfo)
$attribs = 'postalCode','title',
'physicalDeliveryOfficeName'
Foreach ($attrib in $attribs) {
If ($userinfo[$attrib] –ne '') {
$update = @{$attrib=$userinfo
['attrib']}
Set-QADUser
-identity 'DOMAIN\'+$userinfo
['samAccountName']
-objectAttributes $update
}
}
}
Set-QADUser コマンドレットでは、–objectAttributes パラメータで指定したハッシュテーブルを受け取るので、Set-QADUser コマンドレットに $userinfo 変数に格納されたハッシュテーブルを渡すことができると思われるかもしれません。しかし、$userinfo 変数に格納されているハッシュテーブルには、Active Directory 属性名ではないグループ名などが含まれているので、この変数を渡すことはできません。また、空の属性を渡すのは適切ではないので、この関数で行っているように、すべての属性を確認してから、元の CSV ファイルに値が含まれている属性だけを更新できるようにする必要があります。
スクリプトを拡張する
言うまでもありませんが、このスクリプトはさまざまな方法で拡張することができます。思い浮かんだ案をいくつか紹介します。
- CSV ファイルではなく、データベース (従業員データベースなど) から情報を取得できます。このシリーズの第 1 部で説明したように、必要なのは、Import 関数を置き換えることだけです。
- 他のプロビジョニング タスクを実行できます。必要なのは、Provision メイン関数に関数を追加することだけです。主なタスクをそれぞれ独自のサブ関数で実行できるようにしておけば、作成、デバッグ、および保守が容易になります。
- プロビジョニング操作のログ ファイルを作成できます。たとえば、Out-File コマンドレットを使用して、各サブ関数でログ ファイルにテキストを追加できます。
- このシリーズで紹介した技法を使用して、ユーザーが社内で異動したときにグループ、アクセス許可、および Active Directory 属性の再割り当てを行う再プロビジョニング スクリプトを作成できます。
Windows PowerShell に関する Q&A
Q Windows PowerShell コマンドレットを使用して管理できるマイクロソフト製品を教えてください。
A 現在、Windows PowerShell コマンドレットを使用して管理できる製品には Exchange Server 2007、System Center Virtual Machine Manager、System Center Operations Manager、System Center Data Protection Manager などがあります。また、主に Transact-SQL ステートメント (SQL Server のネイティブ スクリプト言語である Transact-SQL) の実行を対象としたコマンドレットになりますが、SQL Server 2008 にもいくつかの Windows PowerShell コマンドレットが用意されています。
しかし、それだけではありません。www.quest.com/powershell から無償でダウンロードできる一連のコマンドレットを使用して、Active Directory を管理することもできます。また、インターネット インフォメーション サービス (IIS) 7.0 用のコマンドレットが開発中です。さらに、マイクロソフト以外の製品 (VMWare、IBM WebSphere MQ など) 用のコマンドレットもあります。既存のコマンド ライン ツールを使用して、Windows コンポーネント (IIS、DNS、DHCP、Windows ファイアウォールなど) を管理することもできます。
最後に
完成したスクリプトとすべてのサブ関数が、独自のプロビジョニング スクリプトを作成する際の叩き台としてお役に立てばさいわいです。このシリーズの最終回の締めくくりとして、このシリーズ全体で採用した方法の一部について見解を述べたいと思います。
必要になるプロパティが事前に特定できないときには、ハッシュテーブルを使用した方が一連のプロパティを多少簡単に列挙できるので、ユーザー情報の格納にはカスタム オブジェクトではなくハッシュテーブルを使用することにしました。つまり、属性を追加する必要があることがわかっている場合や、スクリプトを実行するたびに同じ属性を使用するとは限らない場合、ハッシュテーブルの方が少し簡単に使用できます。
このシリーズの第 3 部で説明したように、単に Cacls.exe の方がシェルの *-ACL コマンドレットより簡単に使用できるという理由から、Cacls.exe を使用してフォルダのアクセス許可を変更することにしました。また、Cacls.exe を使用することで、シェル変数を使って外部コマンド ライン ツールにパラメータを渡す方法の 1 つを紹介できました。
Quest の Active Directory コマンドレットを使用した方が Windows PowerShell でネイティブにディレクトリを操作できると思ったので、ADSI ではなく Quest の Active Directory コマンドレットを使用することにしました。ADSI を使用すると作業が難しくなる可能性があります。というのも、ADSI では、この例で使用したコマンド中心のスタイルではなく、手続き型のプログラミング スタイルを使用する必要があるからです。
ここで紹介したのと同じ方法でスクリプトを作成するかどうかに関係なく、こうした技法やさまざまな手法が、自動化に関する管理上の問題を解決する一助となればさいわいです。また、皆さんからのご意見や改善案を共有できればと思います。ConcentratedTech.com という私が運営している Web サイトの連絡先ページにアクセスして、電子メール (英語のみ) をお送りください。また、その際には、お寄せいただいたコメントを、今後発行する TechNet Magazine に掲載してもよいかどうかをお知らせください。
Don Jones は、Concentrated Technology の共同創設者です。彼は、このサイトで、Windows PowerShell、SQL Server、App-V などのトピックに関するブログを毎週更新しています。Don に対するお問い合わせについては、彼の Web サイトを参照してください。