Windows PowerShellディレクトリの管理を自動化する

Don Jones

Windows PowerShell の最初のバージョンに関して最も残念なことの 1 つは、リリースのタイミングです。Windows PowerShell チームは、製品を出荷しなければならないという一定のプレッシャーを常に感じていました (Exchange Server 2007 というちょっとした製品の発売があり、この製品が Windows PowerShell に依存していたからです)。

また、Active Directory チームは、当時多くの仕事を抱えていました (Windows Server® 2008 というもう 1 つのちょっとした製品の開発も進行中だったからです)。このため、Windows PowerShell は、Active Directory® を管理する機能の完成度が低い状態でリリースされました。

確かに、Windows PowerShell® で Active Directory の機能がまったく提供されていないわけではありません。実際 Windows PowerShell チームは、土壇場で、VBScript のユーザーに既によく知られている、スクリプトに適したテクノロジである Active Directory Services Interface (ADSI) を適切にサポートするというすばらしい仕事を成し遂げました。

ADSI の特徴

ADSI の動作は、Windows® Management Instrumentation (WMI) に似ており、特別な構文を使用して記述されたクエリを発行します。このクエリは、リモート コンピュータ (ドメイン コントローラなど) に転送されてから、実行されます。クエリを実行すると、Active Directory オブジェクトまたはオブジェクトのコレクション (ユーザーやグループなど) が作成され、そのオブジェクトへの参照が返されます。これにより、そのオブジェクトを操作できるようになります。オブジェクトのプロパティを変更したり、メソッドを実行して、変更の保存、新しいオブジェクトの作成、オブジェクトの削除などを実行したりできます。たとえば、ユーザーを作成するには、そのユーザーの作成先となる組織単位 (OU) またはコンテナに対してクエリを実行します。返されるオブジェクトには Create メソッドが含まれているので、このメソッドを使用してユーザーを作成できます。

非常に基本的なレベルでは、Windows PowerShell で ADSI を使用することは簡単であると思われます。たとえば、次のコマンドでは、ユーザーを取得し、そのユーザーの Company 属性を表示しています。

$user = [ADSI]"LDAP://cn=Ringo,ou=Singers,dc=company,dc=pri"
$user.Get("Company")

このユーザーを Get-Member に渡して、そのプロパティとメソッドを表示できます。残念ながら、これらのディレクトリ オブジェクトの実装に関して、Windows PowerShell 1.0 はあまり良い仕事をしているとは言えません。このシェルでは、オブジェクトのディレクトリ属性は列挙されず、オブジェクトのメソッド (私が使用した Get メソッドなど) も表示されません (図 1 参照)。

Figure 1 Piping the user to Get-Member to see its properties

Figure 1** Piping the user to Get-Member to see its properties **(画像を拡大するには、ここをクリックします)

このサポートは Windows PowerShell 2.0 の Community Technology Preview (CTP) で若干強化されましたが、その程度は限られています。つまり、Microsoft® .NET Framework が基盤として使用されているので、管理者が目的の操作を行うことが難しくなっています。そもそも .NET Framework は、開発者用に設計された動作環境です。その他の問題として挙げられるのは、Windows PowerShell チームができることは限られており、優れた Active Directory のサポートを提供するにはディレクトリに詳しい人の手を借りる必要があるということです。ディレクトリに詳しい人とは、つまり Active Directory チームのことです。これはそのうち実現されると思いますが、結局のところ、Windows PowerShell はまだ成熟段階に達していません。では、当面はどうすればよいでしょうか。

2007 年 6 月号のこのコラム (technetmagazine.com/issues/2007/06/PowerShell) で説明した、Windows PowerShell に含まれている ADSI テクノロジのことを思い出してください。この "ネイティブ" の手法の詳細については、コラムを参照してください。今回は、その他のいくつかの方法を紹介します。

優れたエコシステム

Windows PowerShell のアーキテクトである Jeffrey Snover は、Windows PowerShell を取り巻く優れたエコシステムについてよく言及しています。これは、Windows PowerShell チームがすばらしい仕事を成し遂げた結果、マイクロソフト内のプログラマだけでなく、だれでも Windows PowerShell の機能を拡張できるようになったことを意味しています。多くの企業は、コマンド ラインから自社の製品を管理できるネイティブの Windows PowerShell コマンドレットを作成することにより、既にこの作業を行っています。たとえば、VMWare、IBM、Citrix、Foundry などの主要企業が挙げられます。

私が気に入っているこの優れたエコシステムの 1 つは、Quest のソフトウェアです。この企業は、Active Directory を管理するために設計された、一連の無償のコマンドレットを提供しています。これらのコマンドレットは、quest.com/powershell からダウンロードできます。Quest では、グラフィカルな UI を使用して Windows PowerShell を操作できる PowerGUI (powergui.org) も提供しています。このソフトウェアは、コマンド ラインをまだ完全に使いこなすことができない人を対象としており、無償で利用できます。PowerGUI を使用すると、Active Directory を管理するコマンドレットの使用方法をより簡単に学習できます。本当にこのツールは役立ちます。これらのコマンドレットにより、かつてないほど簡単で強力な Active Directory の管理が提供されます (PowerGUI の詳細については、technetmagazine.com/issues/2008/01/Toolbox で公開されている、2008 年 1 月号の「ツールボックス」コラムを参照してください)。

Windows PowerShell の特徴

コマンドレットに関するすべての要素は、Windows PowerShell に固有のものです。従来のようなスクリプトや特別なプログラミング オブジェクトを扱う必要はありません。ここで、私が世界で一番気に入っている 1 行のコマンド ラインを紹介します。このコマンド ラインでは、CSV ファイルをインポートし、そのファイル内の情報を使用して、何十個または何百個もの新しい Active Directory ユーザーを作成できます。

Import-CSV 'C:\provision1.csv' |
ForEach-Object {New-QADUser -organizationalUnit 'company.pri/Singers' -name ($_.'First Name' + '.' + $_.'Last Name') 
-samAccountName $_.'Logon name' -city $_.city -title $_.'Job title' -department $_.department} 

これは実に長いコマンドですが、非常に強力です。まず、シェルのネイティブ コマンドレットである Import-CSV を使用し、単純に CSV ファイルを読み取ってオブジェクトを返します。CSV ファイル内の各行は 1 つのオブジェクト、各列はそのオブジェクトのプロパティとして処理されます。私が作成した Provision1.csv ファイルでは、"Logon Name" や "First Name" などの列名が使用されています。興味深いことですが、これらの列名は Active Directory ユーザーの属性には直接マップされません。このようなファイルでは、Active Directory に固有の名前ではなく、今挙げたような聞き覚えのある列名を使用することが一般的です。このファイルを作成する人事部などの社員は、姓を表す Active Directory の属性が sn であることは知らないと思います。

CSV ファイル内のすべてのデータがインポートされ、オブジェクトに変換された後、これらのオブジェクトが ForEach-Object コマンドレットに渡されます。次に、コマンド ライン内のかっこで囲まれた部分のコードが各オブジェクトに対して実行されます。つまり、CSV ファイル内の各行に対して、このコードが 1 回実行されます。このコード内では、特殊な $_ 変数によって、現在のオブジェクト、つまり CSV ファイルの現在の行が参照されます。

ご覧のとおり、各オブジェクトに対して実行しているコマンドレットは、New-QADUser です。これは、Quest のアドインによって提供される数十個のコマンドレットのうちの 1 つです。QADUser という名前に注目してください。既におわかりかもしれませんが、Q は Quest を表しています。このような名前付け規則を適用した目的は、マイクロソフトの Active Directory チームが今後作成すると思われる New-ADUser コマンドレットとの競合を回避するためです。これにより、両方のコマンドレットが同時にシェルに読み込まれたとしても、人もシェルもこれらのコマンドレットを簡単に区別できるようになります。

コマンド ラインの残りの部分は、New-QADUser コマンドレットのパラメータで構成されます。まず、すべての新規ユーザーの作成先である organizationalUnit を指定しています。次は name 属性です。[First Name] 列の内容、ピリオド、[Last Name] 列の内容の順に指定しています。

最後にもう 1 つ興味深い事実を紹介します。city パラメータによって、Active Directory の l 属性 (つまり Locality-Name) が実際に変更されます。このコマンドレットには、l というパラメータを指定してもかまいません。ほとんどの場合、Active Directory の属性を参照するパラメータでは、Active Directory ユーザーとコンピュータ ツールで使用されている属性名やテキスト ラベルを使用できます。

その他の Windows PowerShell の特徴

Active Directory は階層的なストアです。Windows PowerShell の強みの 1 つは、任意の階層的なストアをディスク ドライブとして公開できることです。これによって、Dir、Del、Ren、Copy などの馴染みのあるコマンドを使用して、さまざまなストアを管理できるようになります。残念ながら、Windows PowerShell 1.0 には Active Directory 用の PSDrive プロバイダは含まれていません。つまり、このシェルでは Active Directory 自体をドライブとして公開することはできません。

さいわい、PowerShell Community Extensions を使用することで、優れたエコシステムが提供されるようになります。PowerShell Community Extensions は無償のオープンソース アドインであり、codeplex.com/powershellcx から入手できます。この拡張機能をインストールすると、シェルでドメイン名を指定して、ディレクトリがドライブであるかのように、ディレクトリを管理できるようになります。

CD COMPANY:
CD SINGERS
DIR

上記のコマンドでは、現在のディレクトリを COMPANY ドメインに変更し、Singers OU に変更した後、オブジェクトの一覧を表示しています (図 2 参照)。この後、Del コマンドを使用してユーザーを削除したり、Md コマンドを使用して新しい OU を作成したりできます。Community Extensions の PSDrive プロバイダには、いくつかの弱点があります。これらの弱点が原因で、実装されることが期待された機能が実質的には提供されません。この理由は、さまざまな要素が Active Directory 自体の動作にマップされないからです。また、十分に注意していただきたいのですが、現在のディレクトリをドメインのルートに変更して del * -recurse を実行すると、権限が与えられていれば、ドメイン内のすべてのオブジェクトが削除されます。既定では、削除するかどうかを確認するメッセージも表示されません。コマンド ラインは強力ですが、その強力さゆえに、スキルと慎重さに欠けるユーザーにとってはリスクがあります。

Figure 2 Using the PowerShell Community Extensions to direct the shell and manage the directory

Figure 2** Using the PowerShell Community Extensions to direct the shell and manage the directory **(画像を拡大するには、ここをクリックします)

今すぐ Windows PowerShell を使用しましょう

私はいつも生徒から、現在 Windows PowerShell でどのような操作を行うことができるかを尋ねられます。結局のところ、すべてのマイクロソフト製品が Windows PowerShell を使用するように再設計されたわけではないので、まだ周りが Windows PowerShell の盛り上がりについてきていないのではないかと思われるかもしれません。

実際は、周りも既に盛り上がっています。マイクロソフトはまだコマンド ラインで管理できるように Active Directory を整備できていませんが、他の企業がそれに挑戦し、非常に大きな成果を挙げています。Windows PowerShell を使用すると、多くの管理作業を行うことができます。たとえば、大量の新規ユーザーの作成など、非常に手間のかかる面倒ないくつかの作業を自動化できます。効率化のヒントは、コミュニティが Windows PowerShell の利便性を向上させるために提供しているツールを入手することです (私も運営に携わっている、マイクロソフトとの共同サイトである PowerShellCommunity.org を参照してください)。適切なツールを Windows PowerShell に読み込むことによって、非常に手間のかかるいくつかの管理作業をスクリプト化し、より効果的および効率的な管理を実現できるようになります。

Don Jones は『Windows PowerShell: TFM, 2nd Edition』の共著者であり、『VBScript, WMI, and ADSI Unleashed』の著者です。また、PowerShellCommunity.org の責任者でもあります。

© 2008 Microsoft Corporation and CMP Media, LLC. All rights reserved; 許可なしに一部または全体を複製することは禁止されています.