私の問題の説明はやや複雑に聞こえますが、私のアプローチには欠陥があると思われるので、もっと良いアイデアもありがたいです。
簡単な説明:
MSSQL 2008 DBへの接続文字列とIIS6に展開されているWebサイト名を前提として、Webサイトがデータベースに接続できるかどうかをプログラムで確認したいと思います。
長い説明:
- 私はMSSQLServerデータベースを持っています、それを呼びましょう
portal_db
。 - IIS6にデプロイされた。というアプリケーションがあります
portal
。URLでアクセスできますhttp://localhost/portal
。Web.configファイルで、データベースへの接続文字列を指定しました。これは次のようになります。"server=(local)\SQLEXPRESS;trusted_connection=yes;database=portal_db"
- Webアプリケーションは
System.Data.SqlClient.SqlConnection
、ラッパー、ORM、マッピングなどを使用せずに、を使用してデータベースにアクセスしています。 - ウェブサイトはappoolで実行するように構成されています
PortalAppPool
。ApplicationPoolIdentity
セキュリティコンテキストとして使用しています。 - Webアプリケーションコード(特にデータベースへのアクセス方法)を簡単に変更することはできません。
Webアプリケーションがデータベースに接続しようとすると、ユーザーIIS APPPOOL\PortalAppPool
がMSSQLデータベースで構成されているかどうかに応じて、成功または失敗します。これは私が理解している部分ですが、アプリをデプロイするときに、apppool仮想アカウントのdbに新しいユーザー/ログインを作成するのを忘れることがよくあります。したがって、私がやりたいのは、別のスタンドアロンのコンソールアプリ(できればC#で記述されているが、必ずしもそうとは限らない)から、次の方法でWebアプリケーションがデータベースにアクセスできるかどうかを確認することです。
- から接続文字列を読み取ります
Web.config
- アプリプールID設定の読み取り(Directory Services APIによってこれを行うために管理されています)
- アプリプールで定義された資格情報を使用してIDを偽装します(ここで見つけた偽装クラスを使用:http://platinumdogs.me/2008/10/30/net-c-impersonation-with-network-credentials/これは他の多くの場所で見つかったアイデアを使用します、MSDNを含む)
SqlConnection
から読み取った接続文字列で開きますWeb.config
要約すると、次のスニペットになります。
using (new Impersonator("IIS APPPOOL\\PortalAppPool", "", ""))
{
SqlConnection conn = new SqlConnection(databaseConnectString);
conn.Open();
}
アプリプールのセキュリティコンテキストが特定のユーザー、ローカルシステムなど以外の値に設定されている場合、すべてが非常にうまく機能します。ユーザーの名前とパスワードにAppPoolIdentity
渡される資格情報を変更すると、目的の結果が得られます(Impersonator
データベースにログインマッピングします。追加するとすべて問題ありません)。しかし、仮想アカウントを偽装することはできないようです。IIS APPPOOLS\PortalAppPool
どのパラメーターを渡す必要があるのかわかりLogonUser
ません。それが不可能な場合でも、驚くことはありません。なりすましのアプローチに集中しすぎている可能性があり(他のユーザーのレジストリキーやサービスにアクセスするために使用していますが、うまく機能します)、もっと良い方法があるかもしれません。
他にもっと良いアイデアがある場合、またはこの問題についてさらに説明が必要な場合は、私に知らせてください。