Hey, Scripting Guy!

Hey, Scripting Guy!

TechNet コラムへようこそ。このコラムでは、よく寄せられるシステム管理スクリプトに関する質問に Scripting Guys がお答えします。システム管理スクリプトについて質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。

Hey, Scripting Guy! アーカイブも忘れずにチェックしてください (この記事には英語のページへのリンクも含まれています)。

今日の質問 : Windows PowerShell を使用して Active Directory ユーザー アカウントにバインドする方法はありますか


Windows PowerShell を使用して Active Directory ユーザー アカウントにバインドする方法はありますか

Q

Scripting Guy さん、よろしくお願いします。Windows PowerShell をいろいろ試しているのですが、たいへん興味深いですね。ところが、1 つ問題があります。Active Directory ユーザー アカウントに関する情報を取得する手っ取り早い方法として PowerShell を使用したいのですが、ユーザー アカウントにバインドする方法がわかりません。解決策はありますか。

-- BW

ATechNet Script Center

BW さん、こんにちは。数日前にお伝えしたとおり、Windows PowerShell はまだベータ版です (2006 年 6 月時点) 。そのため、テクノロジは機能します (しかも申し分なく機能します) が、一部の機能は不足しています。残念ながら、その一部の機能の 1 つが、偶然にも Active Directory オブジェクトへのバインドと操作を簡単にするコマンドレットです (Get-WMIObject コマンドレットの WMI に対する動作と同様です)。そのコマンドレットを使用できれば、Active Directory の操作は非常に楽になります。まだその時ではないので、運が悪いというほかありません。BW さん、またお会いしましょう。日差しを浴びに外へ出かけてきます。

いや、戻ってきました。編集者に、BW さんを無視して出かけていないで、今は BW さんの問題を解決する "お手伝い" をするようにと提案されました。大丈夫です。Windows PowerShell を使用して、Active Directory ユーザー アカウントにバインドする方法がわかるかどうか確認してみます。ただし、はっきり言って、真面目に仕事をするのはただ編集者が怖いからです (おわかりでしょうが、だれも編集者の上に家を落としたことがないのはいまだに驚きです)。

編集者注 : 編集者は、通常このような内容を削除しますが、その代わり Scripting Guys に "空飛ぶサル" を紹介することにしました (ケシの花束を送り付けることも考えましたが、彼らは既に一日の大半を寝て過ごしています)。

Active Directory にアクセスする VBScript スクリプトを記述したことがあれば、おそらく次のようなコードを使用しているでしょう。

Set objUser = GetObject _ 
    ("LDAP://cn=kenmyer, ou=Finance, dc=fabrikam, dc=com")

このコード行に問題があるでしょうか。ありません。VBScript を使用するのであれば、正常に機能します。ただし、Windows PowerShell を使用するとなると、話は違います。それは、Windows PowerShell には GetObject メソッドと類似したコマンドレットがないからです。何かに接続するために GetObject を使用する必要がある場合は、問題となります。

だからといって、"運が悪い" といえるでしょうか。そうでもありません。Windows PowerShell の優れた点の 1 つは、.NET Framework に直接アクセスできることです。このコラムを執筆している Scripting Guy は、正確には .NET Framework の専門家ではありませんが、1 つだけわかることがあります。それは、DirectoryServices.DirectoryEntry クラスを使用すると、Active Directory のオブジェクトにバインドできるということです。この .NET Framework クラスを使用して Ken Myer というユーザー アカウントに関する情報を取得できるでしょうか。これから調べてみます。

ちょっと出かけてからすぐにやります。例のあの人に言わないでください。いいですね (言ってしまってもたぶんかまいません。どうせ彼女の空飛ぶサルが告げ口するに決まっています)。

編集者注 : 心配しないでください。このコラムを完了するために、空飛ぶサルが Scripting Guys をオフィスに連れ戻してくれました。

さて、どこまで説明しましたっけ。そうでした。Windows PowerShell を使用して Active Directory ユーザー アカウントにバインドする、という話でした。お答えしましょう。

New-Object DirectoryServices.DirectoryEntry "LDAP://cn=kenmyer, ou=Finance, dc=fabrikam, dc=com"

ご覧のとおり、実はかなり巧妙です。New-Object コマンドレットに続いて、作成する .NET オブジェクトの型 (DirectoryServices.DirectoryEntry) を呼び出します。その後に続けて、バインド先のオブジェクトの ADsPath を指定します。とても簡単です。

ちなみに、New-Object コマンドレットを使用して COM オブジェクトにアクセスすることもできます。少しだけ複雑かもしれないので、今日のところは理由を説明しません。しかし、皆さんに少しでも関心を持っていただけるように、Microsoft Excel の表示インスタンスを起動するコマンドをお教えします (–com パラメータを使用することに注意してください)。

$A = New-Object –com Excel.Application; $A.Visible = $True

すばらしいでしょう。

既定では、少し前にお見せした Active Directory コマンドによって、ユーザーの識別名のみが返されます (このコマンドは意外と使い物になりません。結局、識別名は ADsPath の一部なので、ユーザーの識別名を知っていることが前提になります)。でも、これでいいのです。ユーザー アカウントにバインドした後、Select-Object コマンドレットを使用して必要なプロパティを選び出します。BW さんは、ユーザーの名前 (Name) と電話番号 (telephoneNumber) を知りたいとおっしゃいましたね。次のようになります。

New-Object DirectoryServices.DirectoryEntry "LDAP://cn=kenmyer, ou=Finance, dc=fabrikam, dc=com" | 
Select-Object name, telephoneNumber

今度は "すべて" のプロパティとその値を取得したいですって。その場合は、Select-Object を呼び出す際に、ワイルドカード文字 (アスタリスク) を使用するだけです。

New-Object DirectoryServices.DirectoryEntry "LDAP://cn=kenmyer, ou=Finance, dc=fabrikam, dc=com" | 
Select-Object *

なかなかの解決策でしょう。

なるほど、良い質問ですね。このユーザー アカウントのどのプロパティが取得できるかを、前もって判断する方法を知りたいのですね。ヒントをお教えします。オブジェクトにバインドし、そのオブジェクトを Get-Member コマンドレットに渡すと、すべてのオブジェクトのプロパティとメソッドのレポートが返されます。

さらに役立つヒントをお教えしましょう。次のスクリプトを実行します。

New-Object DirectoryServices.DirectoryEntry "LDAP://cn=kenmyer, ou=Finance, dc=fabrikam, dc=com" | Get-Member

今日行ったことはすべて、"Active Directory ユーザー アカウントにバインドし、その情報を取得する方法はありますか" という非常に具体的な質問への回答であることに注意する必要があります。きっと、Windows PowerShell を使用した Active Directory の操作に関して、("ユーザー アカウントを作成/削除/変更する方法はありますか" などの) 他の質問をお持ちでしょう。正直に言うと、そのような質問の多くに対して回答できません。Scripting Guys 自身が Windows PowerShell の初心者なのです。ただし、答えがわかってきたら、最初に皆さんにお知らせします。お約束しますよ。

それでは、出かけることにしましょう。だって、シアトルの太陽は日食か昇給のようなものですから。運が良ければ、一生に 1 回は体験できるかもしれません。昇給は諦めましたが、日光浴をやめるつもりはありません。


関連情報

Hey, Scripting Guy!- アーカイブもチェックしてください。

ページのトップへページのトップへ