locked
ネットワーク接続しているAccessファイルへのODBC接続について RRS feed

  • 質問

  • 下記の内容について、わかるかたがいましたら、回答を頂きたくお願いします。

     

    上記Webサーバから、別のファイルサーバのフォルダにネットワーク接続し、そこにあるMS-ACCESSの

    ファイルを、Microsoft ODBC AdministratorでDSN(システムDSN)の設定をしています。

     

    Perlで、ODBC接続しているのですが、Webサーバ上のDOSモードで、Perlスクリプトを走らせると

    ODBC接続先のデータを取得することができますが、Webサーバ上のブラウザで実行すると(IIS6.0)、

    ODBC接続のところで、接続エラーになります。

     

    考えられる原因はなんでしょうか?

     

    環境:

    Webサーバ OS:Windows2003 Server / IIS6.0 / ODBCドライバ:Microsoft Access driver(*.mdb)

    IIS設定:[ディレクトリ セキュリティの認証設定][匿名アクセスを有効にする]にチェックをいれ、

      ユーザは、ファイルサーバにアクセスできるユーザを設定

     

    そのほか、必要な情報があったら、教えてください。

    • 移動 Wang Huang 2012年10月2日 1:35 (移動元:Internet Information Services 5.x, 6.0 - 全般)
    2008年12月15日 4:35

回答

  • だどさん、フォローありがとうございます。

     

    基本認証するにも、ファイルサーバ側にそのアカウントでアクセス許可を与えておかなければ

    いけないんでしょうかね。これについては、そのうちやってみようと思います。

     

    「IIS によるパスワードの管理を有効にする(許可する)」は、IIS5.0では、チェックボックスがあり、

    チェックを外していたんですが、IIS6.0では見当たりません。

     

     

     

     

    2008年12月17日 4:09

すべての返信

  • こんにちは、フォーラムオペレータ大久保です。

     

    エラーメッセージの詳細はおわかりになりますか?

    2008年12月15日 5:31
  • 返信ありがとうございます。

     

    エラーメッセージは、表示されていません。

    エラーではなく、止まってしまいます。

     

    Perlのスクリプト(test.cgi)は、以下のように、データ5個表示させたら終了しています。

    DOSモードで、

    perl d:\web\test.cgiと実行させればデータが5個表示されます。

    同じ、Webサーバ上で、ブラウザから実行させた場合、ソースは<body>まで表示されます。

    テストで、「print "OK\n";」の文を「$db->Sql("SELECT * FROM LIST");」の

    前におくと、ブラウザでも「OK」が表示されますが、後ろにおくと表示されません。

     

    下記では、Perlのモジュールの「Win32:SurpriseDBC」を使用していますが、

    モジュールの「DBD:SurpriseDBC」を使ったときも、同様(DOSモードOK)で、

    ODBC接続するときに処理がとまります。

    「DBD:SurpriseDBC」の場合、

    $db = DBI->connect("DBISurpriseDBC:REPORT") or print("接続エラー");

    で、「接続エラー」が表示されます。

     

    #<< test.cgi >>

    use Win32:SurpriseDBC;

    print "Content-type: text/html\n\n";
    print "<html><body>";

    $db= new Win32:SurpriseDBC("DSN=REPORT");
    $db->Sql("SELECT * FROM LIST");
    $count=0;
    while (@cols = $db->FetchRow() ){
     $count++;
     last if ($count >6);
      undef %FIELDS;
      %FIELDS= $db->DataHash();
     while (($k,$v) = each %FIELDS) {
       print "$k=$v"," / ";
     }
     print "<p>\n\n";
    }
    $db->Close( );
    print "</body></html>";
    exit; 

    2008年12月15日 6:57
  • 追加情報として、、、

    Webサーバアプリケーションとして、An Httpdで、起動させれば、Webサーバ上のブラウザでも

    ほかのPCからもODBC接続され、データが表示されます。

    2008年12月16日 1:48
  • ということは、IIS でだけダメなんですね。

    IIS でODBCログをとる方法が見つかりましたので、まずはどんなエラーが出てるのかを確認されてはいかがでしょう?

     

    IIS で ODBC のログ出力を構成する方法

    http://support.microsoft.com/kb/245243

     

     

    実は私はIISにはサッパリ詳しくないんですが 、具体的なエラーコードやエラーメッセージなどをいただければ

    ある程度までなら調査のお手伝いもできるかと思います。

    2008年12月16日 2:31
  • 返信ありがとうございます。

     

    ODBCログの件、

    ACCESSでテーブルを作成。(ファイル名ODBCLOG.mdb/テーブル名:ODBCLOG)

    作成したACCESSファイルを、ODBCのシステムDSNに「HTTPLOG]で設定

    IISの設定で、ログ形式にODBC ログを選択し、プロパティに上記、DSN、テーブル名を設定

      → この時点で、ACCESSのLockFile(ldb)が生成されるので、ACCESSファイルが認識されていると判断

    その後、該当のPerlスクリプトをブラウザから実行→ACCESSのLockFileが消える

     

    以上の手順ですが、ACCESSファイルのテーブルには、何も書き込まれていませんでした。

    サンプルがSQL Serverベースで書かれていたので、何か手順を間違えたのでしょうか。

     

    ちなみに、IISのODBCログのプロパティのアカウントは、WebサーバにAdministrator権限を持つ

    domain\usenameで設定しました。

    2008年12月16日 6:00
  • うーん、KBに記載されている手順は全部行っていただいたんですよね?

     

    イベントログに何か記録はされていませんか?

    あと、テーブル名は「InternetLog」という名前である必要があるようですが、テーブル名を変更してみていただいてどうですか?

     

    2008年12月16日 6:33
  • 返信ありがとうございます。

    IISのODBCログについては、システムのイベントログに「...HTTPLOGにデータを記録できませんでした。」の

    ログが書き込まれています。

    イベントIDは、6です。

     

     

    ODBCデータソースアドミニストレータで、トレースを設定して、ログを取ったところ、

    ブラウザから実行したときだけ、SQL_ERRORになり、

    「DIAG[S1009][Microsoft][ODBC Microsoft Access Driver]パス’(不明)’は正しくありません。

     パス名に間違いがないことと、ファイルが置かれたサーバに接続していることを確認してください。(-1023)」

    のログが書き込まれていました。

     

    DOSモードから実行した場合は、同じ場所で、SQL_SUCCRSSになり、エラーは書き込まれまず

    最後まで実行されたようです。

    AN HTTPDを使用して、WEBサーバで実行した場合も、DOSモードと同様に成功しています。

     

    なぜ、Web経由(IIS)では、ネットワーク接続されたACCESSのODBC接続が成功しないんでしょうか?
    2008年12月16日 7:40
  • やっぱりファイルにアクセスできないんですね。 しかも、 パス’(不明)’ って。

     

    このエラーメッセージをもとに調査したところ、CGI や Perl であることとは関係なく、 IIS では Jet エンジンとの接続については推奨しておらず、OLE DB ならまだしも ODBC はまったくNGのようです。

    1件だけ同様っぽい事例(他サーバーのシェアにある Access ファイルへのODBC接続)があったのですが、このような理由で「できません」という結論になっておりました。

    どうも釈然としない結論で申し訳ありません。。。。。

     

    IIS 上での Jet データベース エンジンの使用について
    http://support.microsoft.com/kb/832205/ja

     

    おそらくローカルにファイルがあれば接続できるんじゃないかと思うんですが、上記の資料のような事情もありますので、

    長期にわたっての利用を考えていらっしゃるのであれば、SQL Server などの DBMS のご利用をご検討ください。

     

     

    もっと早く答えをお出しできればよかったんですが、もたついてしまってすみませんでした。

    2008年12月16日 8:34
  • はじめまして。だどさんです。

     

    この件はセキュリティによるものです。ひとことでいうと、匿名ユーザあるいは Network ユーザはクレデンシャルのホップができない権限でログインします。(LOGON32_LOGON_NETWORK) このため、別サーバにファイルを取りにいこうとしても失敗します。

     

    試していないので IIS 6.0 でもちゃんと動くかちょっと自信ないのですが、おそらく基本認証をしている状態ならば、ちゃんと動作するのではないでしょうか?基本認証の場合のログインは、LOGON32_LOGON_INTERACTIVE でログインするのでクレデンシャルのホップが可能で、別サーバにも接続が可能になります。

     

    一番良い回避方法はローカルに MDB を配置する、ということだと思います。

     

    お役に立てれば幸いです。

     

    --------------------------------------------

    だどさん http://keicode.com/

     

     

     

    2008年12月16日 16:12
  • 大久保さん、返信ありがとうございます。

     

    結論から言うと、IISの使用はあきらめ、別のWebサーバをたて、Portを変えて対応しようかと思います。

     

    ここに至った経緯は、Webサーバを新規のサーバ(Windows2003Server + II6.0)に移行したため、

    この対応をしていました。

    該当のシステムは、別のWebサーバ(IIS以外で稼動)にあったものを、旧Webサーバ(Windows2000Server + II5.0)に

    移行したんですが、そのときもODBC接続ができませんでしたが、IIS設定の認証で、匿名アクセスに

    アクセス権限のあるユーザを設定することにより、回避できました。

     

    ローカルにACCESSファイルを置けば、可動することはわかっていましたが、いろいろと不都合があり、

    ネットワーク接続でACCESSファイルを参照するしかない状況です。

     

    いろいろと対応ありがとうございました。
    2008年12月17日 0:17
  • だどさん、返信ありがとうございます。

     

    基本認証に関しては、設定の仕方がまずいのか、うまくいきませんでした。

    下記のサイトにも書かれていますが、時間のあるときに検証してみたいと思います。

    だどさんのおかげで、下記のページを見つけることができました。ありがとうございます。

    http://support.microsoft.com/kb/410100/ja

     

    ローカルに関しては、上述のとおりです。

    一番いいのは、Accessをやめて、ほかのORACLEなどのデータベースに変えてしまえばいいのですが。

     

    情報ありがとうございました。

     

    2008年12月17日 0:56
  • 後手に回って申し訳ありませんが、「匿名アクセス」 と書いてあるのをみて、一点、思い出しました。

     

    IIS サーバー上、およびファイルサーバー上、両方で認証可能なユーザー(例えば同一ドメインに入っていればドメインユーザ)を、匿名ユーザーに設定し、「IIS によるパスワードの管理を有効にする」 というチェックをはずせば、対話的ログオンになり、基本認証のようにホップ可能なアクセスになったと思います。(チェックボックスのキャプションは厳密には違うかもしれません) これで、MDB にアクセス可能かもしれません。このチェックをつけると、IIS のサブ認証モジュールが使われ、チェックをつけないと通常の Windows の LSA が動きます。

     

    -----------------------------------------

    だどさん http://keicode.com/

     

     

     

    2008年12月17日 1:05
  • すみません、書き込みが入れ違いになってしまいました。

    そうですか、基本認証で動かないとなると、何かまた別の原因がありそうですね。

     

    Access DB は確かにファイルが破損してしまう問題がよくありますので、SQL Server Express などに入れ替えられるのでしたら、そちらの方がやはりいいと思います。

     

    ありがとうございます。

     

    ------------------------------------

    だどさん http://keicode.com/

     

     

    2008年12月17日 1:09
  • だどさん、フォローありがとうございます。

     

    基本認証するにも、ファイルサーバ側にそのアカウントでアクセス許可を与えておかなければ

    いけないんでしょうかね。これについては、そのうちやってみようと思います。

     

    「IIS によるパスワードの管理を有効にする(許可する)」は、IIS5.0では、チェックボックスがあり、

    チェックを外していたんですが、IIS6.0では見当たりません。

     

     

     

     

    2008年12月17日 4:09