- - PR -
WEBサービス側での「File.Exists」によるファイル存在確認について
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-03-09 15:42
囚人さん>
お返事ありがとう御座います。 クライアントPCのASPNETユーザーに対して「ファイルにアクセスする権限」 を追加すればよいのでしょうか。 ネットワーク越しで権限付加しようとしても「場所」でローカルPC名しか表示 されず、クライアントPCのASPNETユーザーが見えないので追加できません。 それでひとまずローカルのASPNETユーザーを付加してみたのですが・・・。 どのように追加すればよいのか分からないので、どうかご教授下さい。 宜しくお願い致します。 | ||||||||||||||||
|
投稿日時: 2006-03-09 15:55
渋木宏明(ひどり)さん>
お返事ありがとう御座います。 クライアントPC(A)からAPサーバーにあるWEBサービス(B)を呼び出し、 その(B)が、とあるPC(C)に存在するファイルの有無をチェックし、 最終的に(A)に「ありました」と返事させたいのですが、 WEBサービス側のみのテストとして、 (B)から(C)のファイルをチェックさせるとtrueを返すのですが クライアントから呼び出そうと (A)から(B)を呼び出して(C)にあるファイルを存在チェックさせると falseが返ってきます。 (A)から呼び出してもtrueが返ってくるのを期待しております。 引用--------------------------- 「どこにあるファイル」の存在を「どこで動いているプログラム」で検出したいのでしょうか? ------------------------------- (C)にあるファイルをWEBサービス(B)で検出したいのですが・・。 宜しくお願い致します。 | ||||||||||||||||
|
投稿日時: 2006-03-09 16:02
ファイルにアクセスするのは「WEBサービス(B)」なので、WEBサービス(B)のマシンがファイルにアクセス出来なければなりません。 でも
これが出来てるんなら、権限がどうのこうのの話ではないのでは? ちょっとずつテストして、どこまで正常でどこからおかしいのかテストしてみては? 原因を突き止めましょう。それから解決案を考えたら宜しい。 _________________ 囚人のジレンマな日々 | ||||||||||||||||
|
投稿日時: 2006-03-09 18:35
お世話になります。簡単なつくりの方がエラーが分かりやすいと思い、
APサーバー側で下記の様にソリューション内で作成しました。 ---------------------------------------------------------------------- @ドライバプロジェクト ■ドライバ■ [STAThread] static void Main(string[] args) { string str = string.Empty; //WEBサービス経由 localhost.Service1 srv01 = new driver.localhost.Service1(); str = srv01.FolderCheck(); //false str = srv01.FolderCheck2(); //true //ローカル直接呼出し Module mod = new Module(); str = mod.ModFolderCheck(); //true str = mod.ModFolderCheck2(); //true } AWEBサービスプロジェクト ■WEBサービス■ [WebMethod] public string FolderCheck() { string str = string.Empty; Module mod = new Module(); str = mod.ModFolderCheck(); return(str); } [WebMethod] public string FolderCheck2() { string str = string.Empty; Module mod = new Module(); str = mod.ModFolderCheck2(); return(str); } ■WEBサービス側モジュール■ public class Module { public string ModFolderCheck() { if (Directory.Exists(@"\\testpc1\C$\DBserver\makefile02")) { return (Directory.Exists(@"\\testpc1\C$\DBserver\makefile02").ToString()); } else { return (Directory.Exists(@"\\testpc1\C$\DBserver\makefile02").ToString()); } } public string ModFolderCheck2() { if (Directory.Exists(@"C:\mawadev")) { return (Directory.Exists(@"C:\mawadev").ToString()); } else { return (Directory.Exists(@"C:\mawadev").ToString()); } } } --------------------------------------------------------------------- やはりWEBサービスを中継して、外のフォルダを見に行く時にエラーが起こってしまいました。 WEBサービスを中継していても、LOCALのフォルダなら正常を返しました。 また、WEBサービスを介さない場合、外のフォルダ、LOCALのフォルダとも正常を返しました。 やはりWEBサービスが関係している様なので、ASPNETユーザーの権限なのかと疑っておりますが・・・。 どうか、ご教授くださいます様宜しくお願い致します。 | ||||||||||||||||
|
投稿日時: 2006-03-09 19:15
すみません。
私が話を混乱させた原因かもしれません。 最初の投稿のAをよく読んでいませんでした。 ↓
私が記述した権限に関する事項は、 APが存在するPCと同一のPCにファイルが存在する場合に ファイル・フォルダへのアクセス拒否エラーが発生したケースの解決方法です。 「まわ」さんの最初のAの記述から、ファイルの存在するPCが ネットワークドライブとしてAPの存在するPCにマウントされていたとしても、 //{サーバ名}/{ドライブ文字}$/{ファイル名}などと記述しても、 ASP.NETからFile.Exists()を呼ぶと、falseになるということだと思います。 ただ質問事項に「DBから値を取る」という記述が存在するので、DBの検索のしかた(DB自信の文字コードと検索取得文字コードの変換)にも問題があるかもしれないと思ってしまいますが、この問題はないと仮定して話をします。 (DBからパスをを取らずにコードにベタ書きしても実存するファイルの存在がFile.Exists()では確認できない) ASP.NETではなくWindowsAPで作成するとべた書きパスでネットワーク越しにファイルの存在は確認できますか? もしそうであれば、この現象は私は経験したことがありますが・・ 結果的に解決出来ませんでした。 そのとき調べたどこかのサイトには、 「System.IO.File.Exists()の存在する mscolib.dll の内部に問題がありそうだ」と記述していたと記憶してます。 やはり権限上の問題(DLL内部のSystem.Security.Permission.FileIOPermission())の呼び方だった記憶してますが・・。(←記憶違いかもしれません) 解決法を知っている方々のレスがあると大変私も参考したいです。。 ※余談 ちなみに、私が取った代替え方法は、ファイルの存在するサーバのフォルダをWebサイトとかftpのサイトにしてファイルの取得やファイルの存在確認をしました。 | ||||||||||||||||
|
投稿日時: 2006-03-10 00:35
なるほど、よく分かりました。
このテストはどういう手順で行っていますか? 通常、Web サービスは、ネットワーク資源を参照できないアカウント権限で実行されています。 Web.config で、偽装の設定を行っていますか? また、PC(A)(B)(C)は、それぞれ Windows ドメインに参加していますか?
ここも、Web.config の設定によって変化します。 ↑の「Webサービス側のみのテスト」はどのような手順で行っているんでしょうね? _________________ // 渋木宏明 (Hiroaki SHIBUKI) // http://hidori.jp/ // Microsoft MVP for Visual C# // // @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/ | ||||||||||||||||
|
投稿日時: 2006-03-10 10:50
おはよう御座います。お世話になっております。
xxななおxxさん> 引用-------------------------------------------------------------------------- ASP.NETではなくWindowsAPで作成するとべた書きパスでネットワーク越しにファイルの存在は確認できますか? もしそうであれば、この現象は私は経験したことがありますが・・ 結果的に解決出来ませんでした。 ------------------------------------------------------------------------------ APサーバーでWinアプリで対象パスをソースべた書きで試しました。 ファイルの存在を確認できました。 渋木宏明(ひどり)さん> 引用-------------------------------------------------------------------------- @このテストはどういう手順で行っていますか? 通常、Web サービスは、ネットワーク資源を参照できないアカウント権限で実行されています。 AWeb.config で、偽装の設定を行っていますか? Bまた、PC(A)(B)(C)は、それぞれ Windows ドメインに参加していますか? ------------------------------------------------------------------------------ @ テスト方法については、APサーバーにあるWEBサービスと同じソリューション内で ドライバの役割を持つプロジェクトをつくり、MainからWEBサービスを介さないで行いました。 AWEB.CONFIGに関しては特にさわっておりません。「偽装」というものを理解・意識していなかったので・・・。 Bクライアントは社内ドメインに参加しておりますが、APサーバー、ファイルが存在 するサーバーは参加しておりません。 3つのマシンを同じドメインに入れないといけないということですか? ---------------------- 昨日、私の前回の書き込みにあるようなテストを行いました。 宜しくお願い致します。 | ||||||||||||||||
|
投稿日時: 2006-03-10 13:22
それは(100%の)テストになってないです。 理由はすでに述べたとおり
です。 よくあるパターンですが、これが本件の本質でしょう。 要するに、「ネットワーク資源を参照可能なアカウント権限で Web サービスを実行する必要がある」ということです。 Web サービスの実行アカウントを変更するには、Web.config の設定で「偽装」を行うのが一般的な処方です。 具体的には、Web サービスを動作させるPC(B)とファイルを公開するPC(C)に共通のアカウント(同名、同PW)を作成(=この辺がドメイン管理なら1個のアカウント登録ですむ訳です)し、そのアカウントで Web サービスを実行するように設定します。 なお、システムをよりセキュアなものにするためには、このアカウントは不必要な操作が行えないように、権限を厳重に制限するべきです。 これで、PC(B)上のWeb サービスから、PC(C)上の共有フォルダにアクセスできるはずです。
勉強してください。 問題の解決に必要な情報です。
3台のPCが必ずドメインに参加していなければならないわけではありませんが、ドメインへの参加状況によって、とるべき方策が異なります。 Windows のアカウント管理やユーザ権限についても、基本的なことを勉強してください。 _________________ // 渋木宏明 (Hiroaki SHIBUKI) // http://hidori.jp/ // Microsoft MVP for Visual C# [ メッセージ編集済み 編集者: 渋木宏明(ひどり) 編集日時 2006-03-10 14:43 ] |