IIS 7.0 および IIS 7.5 で Microsoft Acess データベースと共に Classic ASP を使用する

作成者 : Robert McMurray
発行日 : 2009 年 2 月 19 日 (作業者 : robmcm(英語))
更新日 : 2009 年 2 月 20 日 (作業者 : robmcm(英語))

: Microsoft Access データベースは、小規模なアプリケーションに Active Server Pages (ASP) を使用している開発者に長年にわたり人気のアプリケーションですが、Microsoft Acess データベースは、スケーラビリティに対応した設計ではありません。そのため、Access データベースはパフォーマンスが問題とならない場合にのみ使用する必要があり、大規模なデータ ドリブン型アプリケーションのホスティングには適していません。

IIS 7.0 および 7.5 ではセキュリティ上の変更がいくつか行われましたが、これらの変更が Classic ASP アプリケーションの動作方法に影響する可能性があります。たとえば、Web サイトのコンテンツ領域内にある Access データベースを使用する Classic ASP アプリケーションを、IIS 7.0 を使用するサーバーにコピーすると、次のようなエラー メッセージが表示されることがあります。

**Microsoft JET Database Engine error '80004005'

Unspecified error.

/example.asp, line 100**

これは Access ドライバーによってトリガーされる一般的なエラーで、さまざまな理由で発生することがありますが、通常はアクセス許可が正しくないことが原因です。具体的に言うと、Microsoft Acess データベースと連動する機能は、Microsoft Jet データベース エンジンを介して実装されますが、エンジンが Access データベースに接続する際にさまざまな一時ファイルやロック ファイルが生成されます。以下のセクションでは、これが発生する理由をいくつか挙げて、これらの状況を解決する方法について説明します。

ユーザー アクセス制御の操作

このドキュメントの手順は、完全な管理アクセス許可を持つアカウントを使用して実行する必要があります。次のいずれかの方法を使用することをお勧めします。

  • ローカル管理者アカウントを使用してコンピューターにログインします。
  • 管理アクセス許可を持つ、ローカル管理者アカウント以外のアカウントを使用してログインする場合は、[管理者として実行] オプションを使用してすべてのアプリケーションとすべてのコマンド プロンプト セッションを開きます。

Windows Vista および Windows Server 2008 では、ユーザーアカウント制御 (UAC) セキュリティ コンポーネントにより IIS 7 構成設定への管理目的でのアクセスが制限されるため、上記の条件が必要となります。UAC の詳細については、次のドキュメントを参照してください。

最初のトラブルシューティングの調査

何らかの形式のトレースやデバッグを有効にしている場合、トレースやデバッグの情報から、データベース接続が開いているときに発生しているエラーを確認できることがあります。たとえば、次は ASP コードの行です。

strCN = "DRIVER={Microsoft Access Driver (*.mdb)};" & _
        "DBQ=C:\Inetpub\wwwroot\App_Data\example.mdb" 
 Set objCN = Server.CreateObject("ADODB.Connection") 
 objCN.Open strCN ' <-- 注 : ASP エラーがここに発生しています
 strSQL = "SELECT * FROM TableName"
Set objRS = objCN.Execute(strSQL)

IIS 7.0 での失敗した要求トレースの使用

HTTP 500 エラーからトレース ログをキャプチャするように IIS 7.0 の失敗した要求トレースを構成している場合、エラーのトレース ログを調べると、以下と同じようなメッセージが確認されます。

Ee155451.Using Classic fig1(ja-jp,TechNet.10).jpg

このエラーは、データベースを開くときに失敗したことを示していますが、問題の特定に役立つ情報ではありません。

プロセス モニターを使用した情報の収集

Microsoft Windows Sysinternals プロセス モニターユーティリティは、アクセス許可関連の問題のトレースに役立ちます。ここで IIS の問題のトレースにプロセス モニターを使用できるように、W3wp.exe プロセスによって作成されるイベントのトレースのみフィルターするようにプロセス モニターを構成します。以下のように設定します。

Ee155451.Using Classic fig2(ja-jp,TechNet.10).jpg

プロセス モニターのフィルター設定を構成したら、プロセス モニターがイベントをキャプチャーして、エラーを再現するように構成します。エラーを再現したら、次の図に示すように、プロセス モニターのキャプチャー ログの [結果] 列でエラーがないか調べます。

Ee155451.Using Classic fig3(ja-jp,TechNet.10).jpg

プロセス モニターのログの情報を分析することで、アクセス許可に関係する問題を特定できます。これは、以下の例で説明します。

一時フォルダーに関するアクセス許可

Windows Server 2008 および Windows Vista SP1 上に IIS 7.0 の既定のインストールが行われているコンピューターでプロセス モニター ユーティリティを使用すると、ASP が Access データベースに接続するときに次のようなエラーが表示されることがあります。

プロセス名 : w3wp.exe
操作 : CreateFile
パス : C:\Windows\Temp\JET5150.tmp
結果 : ACCESS DENIED
詳細 :
Desired Access:Generic Read/Write, Delete
Disposition:Create
Options:Synchronous IO Non-Alert, Non-Directory File, Random Access, Delete On Close, Open No Recall
Attributes:NT
ShareMode:None
AllocationSize:0
Impersonating:NT AUTHORITY\IUSR

このエラーは、JET データベース エンジンが既定の Windows 一時ディレクトリに偽装アプリケーション プール ID として一時ファイルを作成できないことを示しています。これは、Windows Server 2008 および Windows Vista SP1 上で IIS 7.0 のリリース バージョンに既定の設定を使用している場合に発生します。この場合、既定では、IIS はアプリケーション プール ID のプロファイルに対してユーザー プロファイルを読み込みません。この問題を解決するには、読み取り/書き込みアクセス許可を偽装ユーザーに対して許可するように %SystemDrive**%\Windows\Temp ディレクトリのアクセス許可を変更します。

Windows Vista の最初のリリース バージョンを使用している場合、ASP が Acess データベースに接続するときに、以下のようなエラーが表示されることがあります。

プロセス名 : w3wp.exe
操作 : CreateFile
パス : C:\Windows\ServiceProfiles\NetworkService\AppData\Local\Temp
結果 : ACCESS DENIED
詳細 :
Desired Access:Read Attributes
Disposition:Open
Options:Open Reparse Point
Attributes:n/a
ShareMode:Read, Write, Delete
AllocationSize:n/a
Impersonating:NT AUTHORITY\IUSR

このエラーは、偽装アプリケーション プール ID を使用している Network Service ユーザー プロファイルの一時ディレクトリに JET データベース エンジンがアクセスできないことを示しています。この例では、アプリケーション プール ID が Network Service アカウントを使用するように構成されていて、IIS が偽装アプリケーション プール ID にユーザー プロファイルを読み込むように構成されています。偽装アプリケーション プール ID は Network Service アカウントの一時フォルダーにアクセスできないため、エラーが発生します。この特定の問題を解決するには、偽装ユーザーの読み取り/書き込みアクセス許可を付与するように %SystemDrive**%\Windows\ServiceProfiles\NetworkService\AppData\Local\Temp ディレクトリーのアクセス許可を変更します。または、IIS がユーザー プロファイルを読み込まないように構成することもできます。ユーザー プロファイルが読み込まれると JET データベース エンジンが使用する一時フォルダーが変更されるためです。

アプリケーション プール ID にユーザー プロファイルが読み込まれるかどうかを決定する構成設定は、loadUserProfile です。これは既定で false に設定されています。この設定は、アプリケーション プールの [詳細設定] ダイアログ ボックスの [ユーザー プロファイルの読み込み] 属性の値を変更することで構成できます。

Ee155451.Using Classic fig4(ja-jp,TechNet.10).jpg

また、この設定は、AppCmd.exe コマンドライン ツールで次の構文を使用して構成することもできます。

appcmd.exe set config -section:system.applicationHost/applicationPools /[name='DefaultAppPool'].processModel.loadUserProfile:"False" /commit:apphost

コンテンツ フォルダーのアクセス許可

Access データベースを使用する Classic ASP アプリケーションを展開すると、Access データベースのロック ファイルを作成できないためにエラーとなることがあります。これはAccess データベースがファイル名の拡張子に .MDB を使用しているファイルに保持されているために発生します。データベースへの追加やデータの更新を試みると、Microsoft JET データベース エンジンはファイル名拡張子に .LDB を使用するロック ファイルを作成しようとします。Access データベースが Web サイトのコンテンツ領域内に保存されている場合、既定では、JET データベース エンジンがデータベースを更新するアクセス許可を持たないために、Web ブラウザーに次のようなエラー メッセージが表示されます。

**Microsoft JET Database Engine error '80004005'

更新可能なクエリであることが必要です。

/example.asp, line 100**

エラーの再現時にプロセス モニター ユーティリティを使用した場合は、エラーに関する以下の情報がログに記録されます。

プロセス名 : w3wp.exe
操作 : CreateFile
パス : C:\Inetpub\wwwroot\App_Data\example.ldb
結果 : ACCESS DENIED
詳細 :
Desired Access:Generic Read/Write
Disposition:OpenIf
Options:Synchronous IO Non-Alert, Non-Directory File, Random Access, Open No Recall
Attributes:N
ShareMode:Read, Write
AllocationSize:0
Impersonating:NT AUTHORITY\IUSR

このエラーは、エラーの原因がロック ファイルであることを明確に示しています。この問題を解決するには、アプリケーション プールの偽装 ID に対して、Access データベースを含むフォルダーへの読み取り/書き込みアクセス許可を付与します。ただし、これによって Web サイトのセキュリティーが損なわれます。これよりも、Access データベースを、Web サイトのコンテンツ領域から、アプリケーション プールの偽装 ID が読み取り/書き込みアクセス許可を持つフォルダーに移動し、データベースの場所をポイントするシステム データ ソース名 (DSN) を作成することをお勧めします。この場合、ASP コードはデータベースの物理パスではなく接続文字列内のシステム DSN を参照します。そのため、この方法はセキュリティの面からも優れています。コンテンツ領域にデータベースを保存する必要がある場合は、IIS 7.0 の要求のフィルタリング機能を使って既定でブロックされているフォルダー (App_Data フォルダーなど) に常にデータベースを保存するようにしてください。

詳細情報

loadUserProfile 属性やその他のアプリケーション プール属性の詳細は、Microsoft サポートおよび IIS.net (英語) Web サイトの以下のページを参照してください。