次の方法で共有


IIS 上の Microsoft Access データベースでの Classic ASP の使用

執筆者: Robert McMurray

Note

Microsoft Access データベースは、小規模なアプリケーションに Active Server Pages (ASP) を使用する開発者により長年多用されてきましたが、Microsoft Access データベースはスケーラビリティのために設計されていないため、Access データベースはパフォーマンスが重要でない場合にのみ使用する必要があります。Microsoft Access データベースでは大規模なデータドリブン アプリケーションはホストしないことをお勧めします。

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

Microsoft JET データベース エンジン エラー '80004005'

エラーを特定できません。

/example.asp、行 100

これは、Access ドライバーによってトリガーされる一般的なエラーであり、さまざまな理由で発生する可能性がありますが、アクセス許可が正しくないことが一般的な原因です。 具体的には、Microsoft Access データベースを操作する機能は、Microsoft JET データベース エンジンを通じて実装されます。これは、Access データベースに接続するときにさまざまな一時ファイルとロック ファイルを作成します。 以降のセクションでは、これを発生させる理由のいくつかと、それらの状況を解決する方法について説明します。

64 ビット システムでの操作

残念ながら、64 ビット ODBC ドライバーは存在しないため、64 ビット システムでは 32 ビット モードでアプリケーションを実行する必要があります。 そのためには、次の手順を行ってください。

  1. タスク バーで、[スタート] ボタンをクリックし、[管理ツール][インターネット インフォメーション サービス (IIS) マネージャー] の順にクリックします。
  2. [接続] ウィンドウで [アプリケーション プール] をクリックします。
  3. アプリケーションのアプリケーション プールを強調表示し、[アクション] ウィンドウで [詳細設定] をクリックします。
  4. [詳細設定] ダイアログで、[32 ビット アプリケーションを有効にする][True] に設定します。
  5. [OK] をクリックして [詳細設定] ダイアログを閉じます。

注: ODBC 接続を管理するための 64 ビット コントロール パネル アプレットには、32 ビット ODBC ドライバーは表示されません。 この問題を回避するには、32 ビット ODBC アプレットを開く必要があります。 そのためには、次の手順を行ってください。

  1. [開始] をクリックし、[実行] をクリックするか、コマンド プロンプトを開きます。

  2. 次のコマンドを入力します。

    %windir%\syswow64\odbcad32.exe
    
  3. Enter キーを押します。

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

完全な管理アクセス許可が付与されたアカウントを使用して、このドキュメントの手順に従う必要があります。 そのためには、次の 2 つの方法のいずれかを使用します。

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

上記の条件が必要となる理由は、Windows Vista と Windows Server 2008 のユーザー アカウント制御 (UAC) セキュリティ コンポーネントにより、IIS 構成設定への管理アクセスが妨げられるためです。 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 ' <-- Note: ASP Error Occurs Here
strSQL = "SELECT * FROM TableName"

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

HTTP 500 エラーからトレース ログをキャプチャするように IIS の失敗した要求のトレースが構成されている場合は、エラーからトレース ログを調べると、次の図のように表示されます。

トレース ログの一部を示すブラウザー ウィンドウのスクリーンショット。

このエラーは、データベースを開くときにエラーが発生したことを示しますが、問題を特定の領域に絞り込むのに役立つ追加情報は提供されません。

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

Microsoft Windows Sysinternals プロセス モニター ユーティリティは、アクセス許可関連の問題を追跡するための優れたリソースです。 プロセス モニターを使用してこのトピックの IIS の問題をトレースするには、次の図に示すように、プロセス モニターを構成して、W3wp.exe プロセスによって作成されたイベントのみをトレースするようにフィルター処理します。

[プロセス モニター フィルター] ダイアログのスクリーンショット。

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

プロセス モニター ログを示すスクリーンショット。

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

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

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

プロセス名: w3wp.exe
操作: CreateFile
パス: C:\Windows\Temp\JET5150.tmp
結果: アクセス拒否
詳細:

必要なアクセス: 汎用読み取り/書き込み、削除
処理: 作成​​
オプション: Synchronous IO Non-Alert、Non-Directory File、Random Access、Delete On Close、Open No Recall
属性: NT
ShareMode: なし
AllocationSize: 0
権限借用: NT AUTHORITY\IUSR

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

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

プロセス名: w3wp.exe
操作: CreateFile
Path: C:\Windows\ServiceProfiles\NetworkService\AppData\Local\TempResult: ACCESS DENIED
詳細:

必要なアクセス: 属性の読み取り
処理:
オプション: 再解析ポイントを開く
属性: 該当なし
ShareMode: 読み取り、書き込み、削除
AllocationSize: 該当なし
権限借用: NT AUTHORITY\IUSR

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

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

[詳細設定] ダイアログのスクリーンショット。[ユーザー プロファイルの読み込み] が強調表示されています。

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

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

コンテンツ フォルダーに対するアクセス許可

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

**Microsoft JET データベース エンジン エラー '80004005'

操作では、更新可能なクエリを使用する必要があります。

/example.asp、行 100**

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

プロセス名: w3wp.exe
操作: CreateFile
Path: C:\Inetpub\wwwroot\App\_Data\example.ldbResult: ACCESS DENIED
詳細:

必要なアクセス: 汎用の読み取り/書き込み
処理: OpenIf
オプション: Synchronous IO Non-Alert、Non-Directory File、Random Access、Open No Recall
属性: N
ShareMode: 読み取り、書き込み
AllocationSize: 0
権限借用: NT AUTHORITY\IUSR

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

その他の情報

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