ADSI、ASP、およびいくつかのトリックによる仮想ディレクトリの自動作成 - Part 1

Tom Moran
Jeff Sandquist
Microsoft Corporation

January 25, 1999
日本語版最終更新日 1999 年 8 月 31 日

この記事は、もともと Site Builder Network Magazine のコラム "Servin' It Up" (現在は MSDN Online Voices のコラム "Servin' It Up")として掲載されたものです。

新年の誓いはどうなっていますか? 今年こそ運動をしようと思って買った、Total Gym 2000 というロゴの入ったシャツが、自転車のハンドルに巻きつけられたままになっていませんか? 『50カロリー以下の簡単な食事 500種』という本が、Age of Empires を 12時間連続してプレイしても首が痛くならないようにと、モニターの台として使われていませんか? まあそうだとしても、ASP のスタープログラマになるという誓いだけは諦めないでください。

今月は、友人で同僚の Jeff Sandquist が記事を書くのを手伝ってくれています。Jeff は Developer Support 部門で働いており、カナダ出身なので、今回は私が真の国際的なコラムへと向けて足を踏み出す第一歩ということになります。Active Directory Service Interfaces (ADSI) の紹介をするために、小さなプロジェクトを実施することになりました。このプロジェクトは今月と来月の2か月をかけて完成させる予定です。

シナリオ

あなたはプロダクション Web サーバーの責任者です。特定のユーザー、おそらくは管理者のグループが、特定の開発者のための仮想ディレクトリを自動的に作成し、それと同時に適切な権限を設定できるようにしたいと考えています。サーバーには FrontPage Server Extensions はインストールされていないので、アプリケーションの開発に Visual InterDev™ を使うことはできません。また、新しいアプリケーションの要請があるたびに、個人的に対応して、あらゆる場所に Visual InterDev をインストールするというようなことをしたくもありません。ADSI と Active Server Pages (ASP) テクノロジに、いくぶんの DOS を加えれば、このような事態にも対応することができます。

アプリケーション

われわれは、ユーザーが特権グループのメンバであるかどうかを調べることによって、ユーザーの確認を行います。その後、リストボックスに、別のユーザーグループの全メンバのユーザー名を記載しているフォームを準備します。このフォームでは、ユーザーを選択し、そのユーザーの新しい仮想ディレクトリに対する権限を選択することができます。今月は、基本的にここまでを扱います。来月は、フォームからデータを取り出し、すべての適切な権限とともにディレクトリの作成を行います。このアプリケーションを少し手直しすれば、あらゆる人が仮想ディレクトリを要求し、自動的に作成できるような機能を持たせられることがわかるでしょう。忙しい管理者にとって、大いに時間の節約になります。

予定表

  • ユーザーの認証には NT LAN Manager (NTLM) を使用します。
  • ユーザーが特定の NT グループ(このケースでは Web administrators)のメンバであるかどうかを確認するために ADSI を使用します。
  • 特定のグループのメンバをリストするために ADSI を使用します。

われわれは Windows NT Server 上に2つのグループを作成しました。サンプルを実行するためには、同じことを行うか、サーバー上の既存のグループを使い、コードの中の名前を変更する必要があります。

  • Web administrators: 仮想ディレクトリを作成することができます。
  • Intranet developers: 実際の作業を行う人々です。

注意事項

Windows 98 上の Personal Web Server でこれを行うことはできません。Windows NT Server と Internet Information Server (IIS) 4.0 が必要です。

アプリケーション

まず、Web ページ上での認証を行うように設定しなくてはなりません。このためには、HTTP ヘッダーを変更し、認証を実行します。次のコードを ASP ファイルにコピーしてください。

                  
<%@ Language=VBScript %>
<% Option Explicit %>

<%
' Force authentication
If Request.ServerVariables("LOGON_USER") = "" Then
   Response.Status = "401 Authorization Required"
   Response.End
End If
%>

次に、いくつかの変数を宣言し(優れた ASP プログラマは必ず option explicit を使用します)、マシンオブジェクトと、カレントユーザーの Active Directory Services (ADS) パスの両方を動的に作成します。マシンオブジェクトは、名前空間を取得するという目的にのみ使用されます。名前空間はなぜ重要なのでしょうか? これは、すべてのグループコレクションにアクセスするための鍵であり、コードの後の方で頻繁に使用するからです。ユーザーの ADS パスは、その人を特定のグループのメンバとして確認するために使用されます。

前のコードのすぐ後に、次のコードを挿入してください。

                  
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
<TITLE>Web Administrator</TITLE>
</HEAD>
<BODY>

<%
Dim strServerName     'NT local machine name
Dim strGroup          'NT group name
Dim strMachineObject  'ADSI machine object path
Dim strUserADsPath    'ADSI user ads path
Dim objMachine        'ADSI machine object
Dim strNameSpace      'ADSI namespace
Dim objMember         'ADSI member object
Dim objGroup          'ADSI group object
Dim strADSPath        'ADS path
Dim bolAuthenticated  'Authentication flag
Dim strMember         'NT user name for group member

' Build MachineObject
strServerName = Request.ServerVariables("SERVER_NAME")
strMachineObject = "WinNT://" & strServerName

ログオンから返されたスラッシュを、ADS の規約に合わせて変更しなくてはならないことに注意してください。

                  
' Build Current User's UserAdsPath 
strUserAdsPath = "WinNT://" & Request.ServerVariables("LOGON_USER")
strUserAdsPath = Replace(strUserAdsPath, "\", "/")

次に、名前空間を取得します(もちろん、オブジェクトの作業を終えたら、必ずオブジェクトを nothing に設定する必要があります)。これは動的に行われるので、コードは読者のサーバーにも簡単に移植できます。

                  
' Get NameSpace from Machine Object
Set objMachine = GetObject(strMachineObject)
strNameSpace = objMachine.Parent
Set objMachine = Nothing

' Build Name Space for Group Object
strGroup = "Web Administrators"
strNameSpace = strNameSpace & "/" & strServername

これで名前空間が取得できたので、認証されたユーザーが、Web Administrators グループのメンバであることを確認する必要があります。メンバであれば、bolAuthenticated フラグを true に設定します。

                  
' Iterate through the Web Administrators group and ensure 
' that the user visiting this page is a member
Set objGroup = GetObject(strNameSpace & "/" & strGroup)

For Each objMember in objGroup.Members
   If objMember.ADsPath = strUserAdsPath then
      bolAuthenticated = "True"
      Exit for
   End If
Next

Set objGroup = Nothing

まず最初に、auth フラグをチェックして、ユーザーが Web Administrators グループのメンバとして認証されていることを確認します。次に、Intranet Developers グループのメンバを取得し、Web 管理者として選択するユーザーのリストを動的に作成します。各グループ メンバの AdsPath の値を取り出し、これを domain\user という形式に変更します。これらは、新しい仮想ディレクトリの権限を取得する人々です(来月説明します)。また、管理者に対し、スクリプト権限をオンにするオプションを与え、フォームを送信できるようにします。他にも、Visual InterDev が配置エクスプローラを使って配置を行えるように、書き込み権限を設定することもできます。

                  
If bolAuthenticated then 
%>

<CENTER>

<FORM ACTION="http://sand1/ServinSecure/CreateDirectory.asp" 
  METHOD="POST">

   <TABLE WIDTH=600 BORDER=0 CELLSPACING=1 CELLPADDING=1>
      <TR>
         <TD ALIGN="RIGHT" NOWRAP>
           Virtual Directory To Create</TD>
         <TD ALIGN="LEFT" NOWRAP>
           <INPUT type="text" 
           id=textVirtualDirectory 
           name=textVirtualDirectory></TD>
      </TR>
      <TR>
         <TD ALIGN="RIGHT" NOWRAP>Developer</TD>
         <TD ALIGN="LEFT" NOWRAP>
           <SELECT size=1 id=selectOwner name=selectOwner>

<%

strGroup = "Intranet Developers"

' Iterate through the Users group and get a list of people
' who are a member of that group.
Set objGroup = GetObject(strNameSpace& "/" & strGroup)

For Each objMember in objGroup.Members
   strMember = Replace(objMember.ADsPath, "/", "\")
   strMember = Mid(strMember, 9, Len(strMember))
   Response.Write "<OPTION VALUE=" & strMember & ">"
   Response.Write strMember
   Response.Write "</OPTION>"
Next
Set objGroup = Nothing
%>
            </SELECT>
         </TD>
      </TR>
      <TR>
         <TD ALIGN="RIGHT" NOWRAP>
           Turn on Script Permissions</TD>
         <TD ALIGN="LEFT" NOWRAP>
           <INPUT type="checkbox" id=checkboxScript 
             name=checkboxScript></TD>
      </TR>
      <TR>
         <TD ALIGN="RIGHT" NOWRAP>
           <INPUT type="reset" value="Reset" 
           id=reset1 name=reset1></TD>
         <TD ALIGN="LEFT" NOWRAP>
           <INPUT type="submit" value="Submit" 
           id=submit1 name=submit1></TD>
      </TR>
   </TABLE>


</FORM>

</CENTER>

これらのユーザーが Web Administrators のメンバとして認証されなかった場合には、次のコードでお別れの言葉を告げることになります。

                  
<%
Else
%>
   <P>I am sorry you do not have access to this page.  
   Please contact the Web site administrators 
   for more information</P>
<%
End If
%>

</BODY>
</HTML>

最後に

あらゆる機能を備えた完璧なサンプルを見たい方は、Windows NT Option Pack を調べてみてください。Internet Service Manager (HTML) の完全なソース コードが収録されています。

「DOS はどこで出てくるんだ?」と思った方もいるでしょう。これについては来月まで待っていただく必要があります。来月は、このフォーム、ADSI、およびいくつかのトリックを使って、IIS 上に実際にディレクトリを作成し、適切な権限を割り当てます。

では、来月まで

Tom Moran は、 Microsoft Developer Support のプログラムマネージャで、MSDN Online Web Workshop チームと多くの時間を過ごしています。

Jeff Sandquist は、Developer Support の Active Server Pages Escalation Team の一員であり、 Visual InterDev MVP Non-MSDN Online link プログラムの最高責任者です。