トップ回答者
ネットワーク接続しているAccessファイルへのODBC接続について

質問
-
下記の内容について、わかるかたがいましたら、回答を頂きたくお願いします。
上記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
回答
すべての返信
-
返信ありがとうございます。
エラーメッセージは、表示されていません。
エラーではなく、止まってしまいます。
Perlのスクリプト(test.cgi)は、以下のように、データ5個表示させたら終了しています。
DOSモードで、
perl d:\web\test.cgiと実行させればデータが5個表示されます。
同じ、Webサーバ上で、ブラウザから実行させた場合、ソースは<body>まで表示されます。
テストで、「print "OK\n";」の文を「$db->Sql("SELECT * FROM LIST");」の
前におくと、ブラウザでも「OK」が表示されますが、後ろにおくと表示されません。
下記では、Perlのモジュールの「Win32:
DBC」を使用していますが、
モジュールの「DBD:
DBC」を使ったときも、同様(DOSモードOK)で、
ODBC接続するときに処理がとまります。
「DBD:
DBC」の場合、
$db = DBI->connect("DBI
DBC:REPORT") or print("接続エラー");
で、「接続エラー」が表示されます。
#<< test.cgi >>
use Win32:
DBC;
print "Content-type: text/html\n\n";
print "<html><body>";$db= new Win32:
DBC("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 -
ということは、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 -
返信ありがとうございます。
IISのODBCログについては、システムのイベントログに「...HTTPLOGにデータを記録できませんでした。」の
ログが書き込まれています。
イベントIDは、6です。
ODBCデータソースアドミニストレータで、トレースを設定して、ログを取ったところ、
ブラウザから実行したときだけ、SQL_ERRORになり、
「DIAG[S1009][Microsoft][ODBC Microsoft Access Driver]パス’(不明)’は正しくありません。
パス名に間違いがないことと、ファイルが置かれたサーバに接続していることを確認してください。(-1023)」
のログが書き込まれていました。
DOSモードから実行した場合は、同じ場所で、SQL_SUCCRSSになり、エラーは書き込まれまず
最後まで実行されたようです。
AN HTTPDを使用して、WEBサーバで実行した場合も、DOSモードと同様に成功しています。
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