- PR -

WEBサービス側での「File.Exists」によるファイル存在確認について

投稿者投稿内容
まわ
常連さん
会議室デビュー日: 2006/03/09
投稿数: 43
投稿日時: 2006-03-09 15:42
囚人さん>
お返事ありがとう御座います。

クライアントPCのASPNETユーザーに対して「ファイルにアクセスする権限」
を追加すればよいのでしょうか。

ネットワーク越しで権限付加しようとしても「場所」でローカルPC名しか表示
されず、クライアントPCのASPNETユーザーが見えないので追加できません。
それでひとまずローカルのASPNETユーザーを付加してみたのですが・・・。

どのように追加すればよいのか分からないので、どうかご教授下さい。
宜しくお願い致します。
まわ
常連さん
会議室デビュー日: 2006/03/09
投稿数: 43
投稿日時: 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)で検出したいのですが・・。

宜しくお願い致します。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-03-09 16:02
引用:

クライアントPCのASPNETユーザーに対して「ファイルにアクセスする権限」
を追加すればよいのでしょうか。


引用:

クライアントPC(A)からAPサーバーにあるWEBサービス(B)を呼び出し、
その(B)が、とあるPC(C)に存在するファイルの有無をチェックし、
最終的に(A)に「ありました」と返事させたいのですが、


ファイルにアクセスするのは「WEBサービス(B)」なので、WEBサービス(B)のマシンがファイルにアクセス出来なければなりません。

でも
引用:

WEBサービス側のみのテストとして、
(B)から(C)のファイルをチェックさせるとtrueを返すのですが

クライアントから呼び出そうと
(A)から(B)を呼び出して(C)にあるファイルを存在チェックさせると
falseが返ってきます。


これが出来てるんなら、権限がどうのこうのの話ではないのでは?
ちょっとずつテストして、どこまで正常でどこからおかしいのかテストしてみては?
原因を突き止めましょう。それから解決案を考えたら宜しい。
_________________
囚人のジレンマな日々
まわ
常連さん
会議室デビュー日: 2006/03/09
投稿数: 43
投稿日時: 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ユーザーの権限なのかと疑っておりますが・・・。
どうか、ご教授くださいます様宜しくお願い致します。
xxななおxx
ベテラン
会議室デビュー日: 2005/01/18
投稿数: 61
お住まい・勤務地: 東京(練馬)
投稿日時: 2006-03-09 19:15
すみません。
私が話を混乱させた原因かもしれません。

最初の投稿のAをよく読んでいませんでした。

引用:

AAPサーバー側でDBサーバーより「ファイルのフルパス」を
 取得し、その値を元に存在確認する。
(存在確認したいフォルダはAPサーバーには存在せず、他のサーバーにあります。
DBから取得するパスは「サーバー名+フルパス」と「ネットワークドライブ+フルパス」で試しました。)



私が記述した権限に関する事項は、
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のサイトにしてファイルの取得やファイルの存在確認をしました。



渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-03-10 00:35
引用:

クライアントPC(A)からAPサーバーにあるWEBサービス(B)を呼び出し、
その(B)が、とあるPC(C)に存在するファイルの有無をチェックし、
最終的に(A)に「ありました」と返事させたいのですが、



なるほど、よく分かりました。

引用:

WEBサービス側のみのテストとして、
(B)から(C)のファイルをチェックさせるとtrueを返すのですが



このテストはどういう手順で行っていますか?
通常、Web サービスは、ネットワーク資源を参照できないアカウント権限で実行されています。

Web.config で、偽装の設定を行っていますか?
また、PC(A)(B)(C)は、それぞれ Windows ドメインに参加していますか?

引用:

クライアントから呼び出そうと
(A)から(B)を呼び出して(C)にあるファイルを存在チェックさせると
falseが返ってきます。



ここも、Web.config の設定によって変化します。
↑の「Webサービス側のみのテスト」はどのような手順で行っているんでしょうね?

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
まわ
常連さん
会議室デビュー日: 2006/03/09
投稿数: 43
投稿日時: 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つのマシンを同じドメインに入れないといけないということですか?

----------------------
昨日、私の前回の書き込みにあるようなテストを行いました。

宜しくお願い致します。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-03-10 13:22
引用:

(1)このテストはどういう手順で行っていますか?
テスト方法については、APサーバーにあるWEBサービスと同じソリューション内で
ドライバの役割を持つプロジェクトをつくり、MainからWEBサービスを介さないで行いました。



それは(100%の)テストになってないです。

理由はすでに述べたとおり

引用:

通常、Web サービスは、ネットワーク資源を参照できないアカウント権限で実行されています。



です。

よくあるパターンですが、これが本件の本質でしょう。

要するに、「ネットワーク資源を参照可能なアカウント権限で Web サービスを実行する必要がある」ということです。

Web サービスの実行アカウントを変更するには、Web.config の設定で「偽装」を行うのが一般的な処方です。

具体的には、Web サービスを動作させるPC(B)とファイルを公開するPC(C)に共通のアカウント(同名、同PW)を作成(=この辺がドメイン管理なら1個のアカウント登録ですむ訳です)し、そのアカウントで Web サービスを実行するように設定します。

なお、システムをよりセキュアなものにするためには、このアカウントは不必要な操作が行えないように、権限を厳重に制限するべきです。

これで、PC(B)上のWeb サービスから、PC(C)上の共有フォルダにアクセスできるはずです。

引用:

(2)Web.config で、偽装の設定を行っていますか?
WEB.CONFIGに関しては特にさわっておりません。「偽装」というものを理解・意識していなかったので・・・。



勉強してください。
問題の解決に必要な情報です。

引用:

(3)また、PC(A)(B)(C)は、それぞれ Windows ドメインに参加していますか?
クライアントは社内ドメインに参加しておりますが、APサーバー、ファイルが存在 するサーバーは参加しておりません。
 3つのマシンを同じドメインに入れないといけないということですか?



3台のPCが必ずドメインに参加していなければならないわけではありませんが、ドメインへの参加状況によって、とるべき方策が異なります。
Windows のアカウント管理やユーザ権限についても、基本的なことを勉強してください。


_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#

[ メッセージ編集済み 編集者: 渋木宏明(ひどり) 編集日時 2006-03-10 14:43 ]

スキルアップ/キャリアアップ(JOB@IT)