Hey, Scripting Guy!

Scripting Guys が皆さんの質問にお答えします

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

詳細情報

Hey, Scripting Guy! カテゴリ別アーカイブ

Hey, Scripting Guy! 日付別アーカイブ

Hey, Scripting Guy! ダウンロード

Windows PowerShell を使用してローカル グループにドメイン ユーザーを追加する方法はありますか

 

Scripting Guy さん、よろしくお願いします。先日、VBScript を使用してローカル グループにドメイン ユーザーを追加する方法について説明している記事を読みました。Windows PowerShell で同じ処理を実行する方法はありますか。

-- KE

KE さん、こんにちは。まず最初に、このコラムを執筆している Scripting Guy が、新しくお気に入りのテレビ コマーシャルを見つけたことをお知らせしておきます。彼は (どこかの自動車メーカーのものであること以外) コマーシャルが何を宣伝しているのかさえわかっていませんが、このコマーシャルでは、(そっくりな運転手と乗客が乗っている) そっくりな 2 台の車が並行な道路を走っています。2 本の道路が合流すると、車も魔法のように合体し、2 台の車が 1 台の車になります。

確かに、それほどたいしたことではありませんね。むしろ、このコマーシャルの本当におもしろい点は、コマーシャル自体ではなく、コマーシャルに付属している次のような注意書きです。

プロのドライバーが専用コースで運転しています。まねしないでください。

率直に言うと、これは非常に良いアドバイスです。たとえば、皆さんに自分のクローンがいて、自分とクローンの両方が、そっくりな車を運転しているとします。並行な道路を運転しているときに、2 台の車が 1 台に合体すると想定して、互いの車を衝突させるべきでしょうか。いいえ、そのようなことをしてはいけません。

ただし、皆さんとクローンの両方がプロのドライバーで、専用コースで運転している場合は別です。その場合は、問題ありません。

少なくとも、テレビではこのように伝えています。ですが、実を言うと、私たちにはこれがそれほど難しいことだとは思えません。試してみて結果をお知らせいただけないでしょうか。

: 高齢の編集者が心臓発作を起こすのを承知のうえで、今の言葉を次のように訂正します。皆さんが専用コースで運転しているプロのドライバーであっても、このようなことは試さないでください。もちろん、皆さんのクローンがプロのドライバーである場合でも、試さないでください。

おっと、ここで 1 つ簡単なアドバイスがあります。私たちの知る限りでは、「Scripting Guys がそうしろと言った」ことをばかげた行為の正当な理由として認める裁判所は、世界中どこを探してもありません。

それに、そのようなことを正当な理由として認めるべきではありません。

でも心配は無用です。専用コースで運転しているプロのドライバーだけが楽しいことをできるわけではありません。確かに、2 台の車を衝突させて、何とかして 1 台の車に合体できるかどうか確認することはできません (ですが…。いえ、気にしないでください。それについて考えることもしないでください。少なくとも、それについて考えるよう Scripting Guys に言われたとは、だれにも言わないでください)。でもそれはどうでもいいことですね。信じられないかもしれませんが、2 台の車を衝突させなくても楽しいことができます。たとえば、ローカル グループにドメイン ユーザーを追加する Windows PowerShell スクリプトを作成するには、専用コースで運転するプロのドライバーである必要はありません。それに必要な作業は、次のスクリプトを作成するだけです。

Visual Basic
$objUser = [ADSI]("WinNT://fabrikam/kenmyer") 
$objGroup = [ADSI]("WinNT://atl-fs-001/Administrators") 
 
$objGroup.PSBase.Invoke("Add",$objUser.PSBase.Path)
 

ここではどのような処理が行われているのか、ですって。良い質問ですね。1 行目では、[ADSI] という型アダプターを使用して、Active Directory ユーザー アカウントへのオブジェクト参照を作成しています。もっと具体的に言うと、fabrikam\kenmyer ユーザー アカウントへのオブジェクト参照を作成しています。[ADSI] 型アダプターとは何か、ですって。これも良い質問ですね。システム管理者にとって特定の処理がもう少し簡単でわかりやすくなるように、PowerShell には [ADSI] などいくつかの "型アダプター" が用意されています。今回の場合は、型アダプターを使用すると、ADSI を使用して Active Directory のアカウントとローカル アカウントのどちらを管理しているかに関係なく、簡単に ADSI に接続できます。型アダプターがない場合、ADSI に接続するには、.NET Framework を隅々まで調べて System.DirectoryServices.DirectoryEntry クラスのインスタンスを作成する必要があります。型アダプターを使用すると簡単にこのインスタンスが作成されます。

うーん、これも良い質問ですね。「今回の操作対象が Active Directory なら、どうして WinNT プロバイダーを使用したのでしょうか。Active Directory を操作する場合は LDAP プロバイダーを使用するはずではないでしょうか」というご質問ですね。

Active Directory だけを操作する場合は、そのとおりです。しかし、今回の場合は、Active Directory だけを操作しているのではなく、ローカル アカウントも操作しています。ローカル アカウントには WinNT プロバイダーを使用する必要がありますが、WinNT プロバイダーでは OU や他の Active Directory コンポーネントの操作方法を把握していません。そのため、昔ながらの "ドメイン/ユーザー名" 形式の構文を使用する必要があります。

ユーザー アカウントへのオブジェクト参照を作成したら、同じ処理を繰り返して 2 つ目のオブジェクト参照を作成します。今度はローカル グループへのオブジェクト参照です。上記のサンプル スクリプトでは、参照先は atl-ws-001 コンピューターの Administrators グループです。

Visual Basic
$objGroup = [ADSI]("WinNT://atl-fs-001/Administrators")
 

この処理が完了したら、次のコード行を使用して、Ken Myer というドメイン ユーザーをローカルの Administrators グループに追加できます。

Visual Basic
$objGroup.PSBase.Invoke("Add",$objUser.PSBase.Path)
 

またまた良い質問ですね。PSBase とはいったい何か、というご質問ですね。Windows PowerShell を使用してオブジェクトに接続する場合、公開されるメソッドやプロパティは、たいてい事前に PowerShell で決定されます。これは通常問題ありませんが、PowerShell の推測が間違っている場合があります。つまり、本当に必要なプロパティやメソッドが公開されない場合があります。そして、今回はこのケースに該当します。ローカル グループのアカウント (Administrator アカウントなど) にバインドすると、PowerShell では、ほんの一部のメソッドやプロパティしか公開されません。

Visual Basic
Name                        MemberType 
----                        ---------- 
ConvertDNWithBinaryToString CodeMethod 
ConvertLargeIntegerToInt64  CodeMethod 
Description                 Property 
groupType                   Property 
Name                        Property 
objectSid                   Property
 

そこで、PSBase オブジェクトを使用します。PSBase オブジェクトを使用すると PowerShell によって既定で公開されるオブジェクトの "そのままの状態の" オブジェクトにアクセスできます。つまり、PSBase オブジェクトを使用すると、オブジェクトのすべてのプロパティとメソッドにアクセスできます。

Visual Basic
Name                      MemberType 
----                      ---------- 
Close                     Method 
CommitChanges             Method 
CopyTo                    Method 
CreateObjRef              Method 
DeleteTree                Method 
Dispose                   Method 
Equals                    Method 
GetHashCode               Method 
GetLifetimeService        Method 
GetType                   Method 
InitializeLifetimeService Method 
Invoke                    Method 
InvokeGet                 Method 
InvokeSet                 Method 
MoveTo                    Method 
RefreshCache              Method 
Rename                    Method 
ToString                  Method 
AuthenticationType        Property 
Children                  Property 
Container                 Property 
Guid                      Property 
Name                      Property 
NativeGuid                Property 
NativeObject              Property 
ObjectSecurity            Property 
Options                   Property 
Parent                    Property 
Password                  Property 
Path                      Property 
Properties                Property 
SchemaClassName           Property 
SchemaEntry               Property 
Site                      Property 
UsePropertyCache          Property 
Username                  Property
 

今回の場合、PSBase オブジェクトによって Invoke メソッドが公開されます。その後、Invoke メソッドを呼び出して、Add パラメーター、および Active Directory のユーザー アカウントを含む Path プロパティを渡します。何が起きるでしょうか。そうです、そのとおりです。ここで処理しているユーザー (fabrikam\kenmyer) が、atl-fs-001 コンピューターのローカルの Administrators グループに追加されます。

: ところで、お気付きかもしれませんが、Invoke メソッドを呼び出すときは、$objUser.PSBase.Path というユーザー アカウントの PSBase オブジェクトを使用する必要があります。これは、既定では Path オブジェクトにアクセスできないため必要となる処理です。このオブジェクトにアクセスする唯一の方法が、PSBase オブジェクトの使用です。

KE さん、信じられないかもしれませんが、これで作業は完了です。このスクリプトを実行すると、Ken Myer の Active Directory アカウントがローカルの Administrators アカウントに追加されます。ご自分で試して結果をご覧になってください。

ただし、ご自分で 2 台の車を衝突することは試さないでください。また、車以外でも 2 つのものを衝突させようとはしないでください。数年前、Scripting Guys は、Peter Costantini と Dean Tsaltas を全力疾走させて 2 人を衝突する実験を試みました。2 人を合わせれば、スーパー Scripting Guy が誕生するのではないかと思ったのです。この結果がどうなったかというと、現在の Peter と Dean の状況そのものです。

この事実が皆さんにとって警告になれば、と思います。


ページのトップへ