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を稼働させる管理者にスキルを要求することになりそうです。