2004年05月04日
川俣晶の縁側ソフトウェアMagSite1開発日誌 total 4579 count

MagSiteManからIISを管理できない問題とその解決

Written By: 川俣 晶連絡先

 IISのWebサイト一覧を出力するサンプルソース (ADSI経由)などというものを書いた直後、もちろん、このコードとほぼ同じものを、開発中のMagSiteMan(MagSite1の管理ソフト)に入れました。

 ところが、何と言うことでしょう。

 権限がないと言って、エラーで動きません。

 試しに、ASP.NETを実行するアカウントであるASPNETを、Administratorsグループに入れてみました。(良い子は絶対に真似してはいけないぞ)

 それでもエラーになりましたが、マシンをリブートすると動くようになりました。

 と言うわけで、ASPNETにADSI経由でIISを管理できる権限がないことが問題であることが、ほぼ確定しました。

 これは頭が痛い問題です。ASPNETは(基本的に)すべてのASP.NETプログラムの実行に使われるアカウントですから、うかつに強力な権限を与えたくはありません。一時は、ASP.NETはやめて、スタンドアロンのGUIアプリケーションにしないと駄目か、とまで思いました。

 しかし、きちんと調査する前に結論を先走っても益はないと思いながらも、あまり期待しないで検索してみると。

 こんなに有益なマイクロソフト サポート技術情報がすぐに見付かりました。

[HOWTO] ASP.NET で System.DirectoryServices 名前空間を使用する方法

 いくつかの原因と解決方法が述べられていますが、以下の方法で問題なく対処できることが分かりました。(Windows XP, Windows Server 2000, Windows 2003 Serverで動作確認)

デフォルトでは、すべての ASP.NET アプリケーションは基本プロセス アカウントである MACHINENAME\ASPNET で実行されます。このアカウントはローカル アカウントであり、Active Directory 内のオブジェクトに対するアクセス許可がありません。IIS に渡される資格情報を使用して Active Directory にアクセスするには、Web.config ファイルを変更して、identity impersonate="true" と authentication mode="Windows" の 2 つのパラメータを含める必要があります。この 2 つのパラメータが存在すると、ASP.NET では IIS から渡された資格情報でコードが実行されます。

 ちなみに、identity impersonate="true"は正しくは<identity impersonate="true" />になります。

 同様にauthentication mode="Windows"は<authentication mode="Windows" />になります。

 どこまでが要素名で、どこまでが属性なのか分かりにくい、あまり嬉しくない書き方ですね。

 翻訳の時に落ちたのかと思いましたが、英語版も同様ですね。

 この修正により、MagSiteManはログオンした権限で動作することになります。必然的に、IISの管理以外の機能もこのアカウントで動作することになります。その結果として、たとえばMagSiteManが作成するディレクトリなどのオーナーはログオンしたアカウントになることが予想されます。しかし、そのディレクトリを使用するMagSite1は、依然としてASPNETで動作します。それが、もしかしたら、何らかのトラブルの原因になる可能性はあり得ます。

 余談ですが、MagSiteManにはディレクトリの書き込み権限の確認コードが既に含まれていますが、同じアカウントで動かなければ確認も意味がありません。

 ちょっとだけ、MagSiteManを稼働させる管理者にスキルを要求することになりそうです。