
TechNet コラムへようこそ。このコラムでは、よく寄せられるシステム管理スクリプトに関する質問に Scripting Guys がお答えします。システム管理スクリプトについて質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。
詳細情報
| • | |
| • | |
| • |
![]()
Scripting Guy さん、よろしくお願いします。ユーザーのログオン名とドメインしかわからない場合に、ユーザー アカウントの GUID を取得する方法はありますか。
-- IU

IU さん、こんにちは。このコラムを執筆している Scripting Guy の長所の 1 つは・・・。ええと、そうです。このコラムを執筆している Scripting Guy の長所をすぐには思い付くことができません (ただし、編集者はきっと長所を記載したリストに同意してくれるでしょう。編集者、いらっしゃいますか)。
そうは言うものの、このコラムを執筆している Scripting Guy は外見を見破り、問題の核心を突くことがとても得意です (ご指摘のとおり、その主な要因は、彼がいつも問題の核心だからというものですが)。突き詰めて考えると、UI さん、これは変換の問題です。つまり、Windows NT 形式のドメイン名 (たとえば、fabrikam\kenmyer) があり、それをユーザー GUID (たとえば、97614339-087d-4f26-9fc5-86e8e7425ce7) に変換する必要があります。ここで皆さんに質問です。何かを変換しなければならない場合に必ず必要となるのは何でしょうか。まさにそのとおりです。変換ツールが必要です。
注 : この「何かを変換するためには変換ツールが必要」など、Scripting Guy はすばらしい洞察力を持っていますよね。これは、まさにこのコラムの本質を表しています。このコラムを無料で提供していることが信じられないと思いませんか。 |
そうでした、1 つだけ問題があります。Windows NT 4.0 (NT 4.0) ドメインの名前を GUID に変換する方法はありません。まったくありません。
それともあるのでしょうか。次のコードを見てみましょう。
Const ADS_NAME_INITTYPE_GC = 3
Const ADS_NAME_TYPE_NT4 = 3
Const ADS_NAME_TYPE_GUID = 7
strUserName = "fabrikam\kenmyer"
Set objTranslator = CreateObject("NameTranslate")
objTranslator.Init ADS_NAME_INITTYPE_GC, ""
objTranslator.Set ADS_NAME_TYPE_NT4, strUserName
strUserGUID = objTranslator.Get(ADS_NAME_TYPE_GUID)
Wscript.Echo strUserGUID
このスクリプトを記述する作業は、実はちょっと楽しいものだったということを認めざるを得ません。というのも、オペレーティング システムに組み込まれている ADSI インターフェイスである IADsNameTranslate ユーティリティを使用する機会を得ることができたからです。この名前が示すとおり、IADsNameTranslate インターフェイスは Active Directory で使用されるさまざまな名前の種類の多くを変換することができます。たとえば、IADsNameTranslate に識別名を渡すと表示名が返されます。正規名を渡すと UPN 名が返されます。そして、Windows NT 4.0 ドメインの名前を渡すと GUID が返されます。
とにかく、そうだといいと思います。では、見ていきましょう。
スクリプトでは、まず次の 3 つの定数を定義します。
| • | ADS_NAME_INITTYPE_GC (ここでは値 3 を代入): グローバル カタログ サーバーに接続して、名前の情報を検索する必要があることをスクリプトに示します。 |
| • | ADS_NAME_TYPE_NT4 (ここでは、この定数にも値 3 を代入): NT 4.0 ドメインの名前を指定するのに使用します。 |
| • | ADS_NAME_TYPE_GUID (ここでは値 7 を代入): Active Directory の GUID を指定するのに使用します。 |
定数を指定したら、次に、NT 4.0 ドメインの名前付け規則 "ドメイン\ユーザー名" を使用して、ユーザー名を strUserName という名前の変数に代入します。
strUserName = "fabrikam\kenmyer"
さあ、これで準備ができました。まず、IADsNameTranslate インターフェイスの ProgID である、NameTranslate オブジェクトのインスタンスを作成します。その後、Init メソッドを呼び出して Active Directory にバインドします。この場合は、メソッドのパラメータとして ADS_NAME_INITTYPE_GC 定数を渡しているので、Init メソッドはグローバル カタログ サーバーにバインドします (2 番目のパラメータとして空の文字列を渡していることにも注意してください。この 2 番目のパラメータにより、コンピュータまたはドメイン名を指定する機会が与えられます。グローバル カタログ サーバーに接続する場合には、コンピュータ名やドメイン名を指定する必要はありませんが、この "省略可能な" パラメータとして空の文字列を渡す必要があります。そうしなければ、スクリプトは失敗します)。
ちなみに、Init メソッドの呼び出しは次のようになります。
objTranslator.Init ADS_NAME_INITTYPE_GC, ""
そして、Set メソッドの呼び出しは次のようになります。
objTranslator.Set ADS_NAME_TYPE_NT4, strUserName
ご覧のとおり、Set メソッドには 2 つのパラメータを渡しています。1 つは変換する Active Directory 名の種類 (ADS_NAME_TYPE_NT4 定数で表されています) で、もう 1 つは名前そのもの (strUserName 変数で表されています) です。Set メソッドを呼び出したら、Get メソッドを呼び出します。取得する必要があるのは何でしょうか。簡単なことです。ADS_NAME_TYPE_GUID 定数を渡して示したように、ユーザーの GUID を取得する必要があります。NameTranslate オブジェクトにより GUID が取得され、strUserGUID という名前の変数に格納されます。
strUserGUID = objTranslator.Get(ADS_NAME_TYPE_GUID)
では、これはうまくいくでしょうか。もちろんうまくいきます。strUserGUID 変数の値がエコー バックされると、次のような情報が表示されます。
{97614339-087d-4f26-9fc5-86e8e7425ce7}
すばらしいですよね。
先ほど言いましたが、操作できる名前の形式は他にもあります。これには、次のようなものがあります。
定数 | 値 | 説明 |
ADS_NAME_TYPE_1779 | 1 | RFC 1779 で規定されている名前の形式。たとえば、"CN=Jeff Smith, CN=users, DC=Fabrikam, DC=com" です。 |
ADS_NAME_TYPE_CANONICAL | 2 | 正規名の形式。たとえば、Fabrikam.com/Users/Jeff Smith です。 |
ADS_NAME_TYPE_NT4 | 3 | Windows NT 4.0 で使用されるアカウント名の形式。たとえば、Fabrikam\JeffSmith です。 |
ADS_NAME_TYPE_DISPLAY | 4 | 表示名の形式。たとえば、Jeff Smith です。 |
ADS_NAME_TYPE_DOMAIN_SIMPLE | 5 | 単純なドメイン名の形式。たとえば、JeffSmith@Fabrikam.com です。 |
ADS_NAME_TYPE_ENTERPRISE_SIMPLE | 6 | 単純なエンタープライズ名の形式。たとえば、JeffSmith@Fabrikam.com です。 |
ADS_NAME_TYPE_GUID | 7 | グローバル一意識別子の形式。たとえば、{95ee9fff-3436-11d1-b2b0-d15ae3ac8436} です。 |
ADS_NAME_TYPE_USER_PRINCIPAL_NAME | 9 | ユーザー プリンシパル名の形式。たとえば、JeffSmith@Fabrikam.com です。 |
ADS_NAME_TYPE_CANONICAL_EX | 10 | 正規名の拡張形式。たとえば、Fabrikam.com/Users Jeff Smith です。 |
ADS_NAME_TYPE_SERVICE_PRINCIPAL_NAME | 11 | サービス プリンシパル名の形式。たとえば、www/www.fabrikam.com@fabrikam.com です。 |
いくつか試してみて結果をご覧ください。まだ IADsNameTranslate についてあまり説明していませんが、これはちょっとした便利な機能機能です。そのうえ、Active Directory 検索スクリプトを使用するよりも、この方法の方が少し早くて簡単であることを立証できます。ですから、特定のユーザーを検索して、そのユーザーの GUID を返す代替方法として使用できます。
IU さんの変換の問題のお役に立てばと思います。最近イタリアから戻ってきて、このコラムを執筆している Scripting Guy は変換の問題はお手の物です。イタリアへ旅行へ行ったからではありません。多くのイタリア人が英語を話すだけでなく、このコラムを執筆している Scripting Guy も少なくともメニューなどを読むのに事足りるくらいのイタリア語を学びました。ただ、マイクロソフトに戻ってきた、このコラムを執筆している Scripting Guy は、周囲の人が Web 2.0、戦略的提携、企業方針、権限委譲と集中訓練、積極的な相乗効果などについて話しているのを理解するために変換ツール (つまり、翻訳機) が必要です。
これまでで 1 番のお気に入りは言うまでもありません。キャンパス内の思想導入です (これはマイクロソフトのビルで、ポスターを吊り下げるときに必ず付随する活動だということがわかりました)。
仕事に戻るのも悪くありません。