質問者
mdbファイルにアクセスできない

質問
-
koqjpです。
VWD2005でAccessベースの簡単なWebアプリケーションを作っています。
そこで「エラーを特定できません」と出てきてしまい困っています。
どうもASPNETアカウントの設定のようなのですが同じ悩みを抱えている方おりませんでしょうか。
再現している環境は以下の通りです。
・Webサーバー:Windows2000Pro SP4最新パッチ
・.NET Framework1.0,1.1,2.0インストール済み(ただし、対象のページは2.0で動いています。)
・IIS:Windows統合認証モード
・Active Directoryに参加し、ユーザーはweb.configのimpersonate設定によってドメインユーザー権限でIISにアクセスします。
・Accessのファイルはc:\DB\db1.mdbでAdministratorsとDomain Usersにフルコントロールのアクセス権が設定してあります。
・ページが保存されたディレクトリc:\Inetpub\wwwroot\testはAdministratorsにフルコントロール、Domain Userに読み取りと実行、フォルダの一覧表示、読み取りの許可が与えられています。
再現しているプログラムはこれです。
<%@ Page Language="VB" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Dim SQL As String = "SELECT name FROM test WHERE ID =" & TextBox1.Text
Dim CON As New System.Data.OleDb.OleDbConnection
CON.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\DB\db1.mdb;"
Dim MemDbCMD As New System.Data.OleDb.OleDbCommand(SQL, CON)CON.Open()
Label1.Text = MemDbCMD.ExecuteScalar.ToString()
CON.Close()
End SubProtected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
ASPNETLabel.Text = System.Security.Principal.WindowsIdentity.GetCurrent.Name.ToString
End Sub
</script><html xmlns="http://www.w3.org/1999/xhtml" >
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="ASPNETLabel" runat="server" Text="Label"></asp:Label><br />
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" /><br />
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label></div>
</form>
</body>
</html>
このとき、Domain Userの一人がこのページにアクセスするとASPNETLabelに
ドメイン/ユーザー名
が表示されます。
ここでTextBox1にdb1.mdbのレコードのIDを入力しButton1を押すと
例外の詳細: System.Data.OleDb.OleDbException: エラーを特定できません
ソース エラー:
行 13: Dim MemDbCMD As New System.Data.OleDb.OleDbCommand(SQL, CON)
行 14:
行 15: CON.Open()
行 16: Label1.Text = MemDbCMD.ExecuteScalar.ToString()
行 17: CON.Close()
と表示され止ってしまいます。
ところが、このドメインユーザーをこのサーバーのAdministratorsに加えてやると、プログラムどおりdb1.mdbのtestテーブルから指定したIDのnameを取ってきてくれます。
.NET1.1のときも原因不明でDBにアクセスできず、machine.configのprocessModelでuserをmachineからsystemに変えたことで動いたことがあります。
結局、そのときはフォルダのアクセス権限等では解決できず、しょうがないのでmachine.configの設定を変えたまま運用しました。
今回の.NET2.0ではmachine.configのprocessModelにUserが見つからなかったのですが、なるべくこういった部分の設定を変更せずに動くようにしたいと思っています。どなたかお力をお貸しいただけないでしょうか。
すべての返信
-
ここの中に
「プログラムの方法によっては、プロセス アカウントへの権限の追加が必要とされる場合があります。これは、避けるべきです。たとえば、Windows Server 2000 で LogonUser を呼び出す場合、またはユーザーのプリンシパル名からトークンを生成する新規の WindowsIdentity コンストラクタを使用して Windows Server 2003 で偽装レベルのトークンを取得する場合には、プロセス アカウントに "オペレーティング システムの一部として動作する" を付与する必要があります。 」
という記述があります。
この"オペレーティングシステムの一部として動作する"という設定がされてないんじゃないでしょうか。 -
どっとねっとふぁんさん、
早速の回答ありがとうございます。
リンク先を読んだのですが、内容が非常に難しいですね・・・。
「ASP.NET2.0で偽装を行う場合は、デフォルト状態ではWebデータベースアプリケーションは動きませんよ」と書いてあるように見えます。
もともと動きがおかしいなと思ったのは、VS2002時代に.NET Framework1.0を使っているときは、processModelの設定等をいじらなくても動いたんです。つまり、デフォルトで偽装を使用してDBにアクセスできました。
それが1.1をインストールしたら動かなくなり、設定変更して使うようにし、2.0をインストールしたらまた動かない・・・。く、苦しい!! 息が詰まる・・・バタッ。
とちょっと愚痴になってしまいましたが、Active Directoryを使用しているイントラネットでシングルサインオンでリソースを使用しようと思ったら、Webサーバーには偽装しか手はないと思うのですが、皆さん困ってないのでしょうか。
あまり話題にならないということは使わないと言うこと??
もうちょっと調べてみます。 -
> Active Directoryを使用しているイントラネットでシングルサインオンでリソースを使用しようと思ったら、Webサーバーには偽装しか手はないと思うのですが、皆さん困ってないのでしょうか。
どういうリソースをどういう権限で使いたいかによると思います。
シングルサインオンといっても個々のユーザの権限で利用しないといけない場合っていうのは少なくないですか?
たとえばデータベースを個々のユーザの権限で使わせようと思ったらコネクションプーリングの恩恵は受けにくくなるし、データベース側の権限も個々のユーザ毎にきっちり設定するのか、という話になりますよね?
偽装をしなくてすむような設計というのもあると思いますけどね。 -
どっとねっとふぁんさん、ご意見ありがとうございます。
例えば次のような使い方をしたい場合、偽装を使うメリットは非常に大きいと思うのです。
社員が100人、グループが10個、それぞれ10人前後の人が属しています。各グループの業務はかなり異なり、顧客情報、商流、グループごとにコンフィデンシャルなベンダーとのやり取り情報、コールセンター対応方法等はまちまちです。
100人しかいない会社ですから、サーバーの数は増やしたくありません。一台のサーバーに10個のローカルグループを作成し、そのグループに各人がアサインされ、グループごとにアクセス権限が設定されたデータベースが存在します。Webページも各グループごとに最適化された項目とインターフェースを持っています。
四半期ごとに人員配置が見直されます。関連のないグループ同士で頻繁な人事異動があります。
親会社はWindowsを使用しており、Active Directory参加は必須、セキュリティポリシーは親会社のセキュリティポリシーを使用しなければいけません。たとえば、パスワードの覚書を残すとか、他人のIDを使用することとか、簡単なパスワードを設定することは許されてません。
このような環境でフォーム認証で全員が使うWebアプリケーションを使ったら、情報システムのセキュリティポリシーを守れなくなる確立はかなり高くなりますよね。
上記環境で偽装を使うメリットは
・情報システム部の厳しいパスワード管理要求には、一つのアカウントだけ考えればよい。
・ディレクトリへのアクセス権限はグループごとに設定されているので、人事異動が発生したら一台のサーバーのローカルグループ間で人員を動かせばよく、いちいちディレクトリごと、データベースごとに権限を設定しなおすということがない。
・Active Directoryを使用しなければならないことが前提なので、各個人のPCを起動してログインしたらそのまま自分がアクセスを許されたリソースだけにアクセスできるようになっている。
まさに私の会社は上記で、このような会社はうち以外にも周りに非常に多いです。
Webアプリは内製でパッケージソフトではできない業務へのフィッティングをしています。
Windowsを使うメリットはActive Directoryとの連携だと思うので、もっと私と同じ悩みを持っている人はたくさんいると思っていました。
なにかどこかの知識が完全に抜けているのかなぁと考えてしまうのですが、もしご指摘いただければありがたいです。 -
まぁ、システム要求によってどんな技術を使うべきかはケースバイケースですから、偽装を使うかどうかは設計者の考えによるでしょうね。
偽装を使うことでパスワードの問題がクリアできることをメリットと考えるか、システムの作り方や効率を考えてユーザにパスワードを複数管理してもらうようにするか、どちらを重視すべきか一様には答えられない問題でしょうし。
で、元もとの問題にたいしては、
「プロセス アカウントに "オペレーティング システムの一部として動作する" を付与する必要があります。」
という記述があるのだから、この通りにしてみたらどうですか?
全体を読まなくてもピンポイントでわかるようにこの部分を抜き出したつもりだったんですけどね。
偽装を使うにはこういう設定が必要だ、とマイクロソフトから提示されているのですから、まずその通りやってみてはいかがでしょうか。