DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ネットワークに配置して動かしたアプリについて

環境/言語:[XP/VB.NET3.5]
分類:[.NET]

ネットワーク(職場LAN)上に自作VB.NETアプリを作成して動かしたいのですが
どうもうまく動きません。
そのアプリは、ネットワーク上のファイルを自己PCにコピーさせるという物ですが
My.Computer.FileSystem.CopyFile("\\NetworkDisk\File.txt","D:\File.txt")
のようにコピーをしようとしたのですができません。
どうもネットワーク上で動かすと My.~~~ が使用できないようです。
なにかいい解決方法知っている方お願いします。
My.~~~ 以外は動くようです。
2009/11/12(Thu) 09:14:51 編集(投稿者)

■No25771に返信(hirosさんの記事)
> どうもうまく動きません。
具体的には、どのような動作をしてしまうのでしょうか?

・起動すらしない。
・起動はするが、CopyFile メソッドを呼び出しても何も起きない。
・コピー処理の段階で、System.Sercurity 名前空間の例外が発生する。
・コピー処理の段階で、System.IO 名前空間の例外が発生する。
・全然違うファイルがコピーされてしまう。
・その他


> My.Computer.FileSystem.CopyFile("\\NetworkDisk\File.txt","D:\File.txt")
> のようにコピーをしようとしたのですができません。
パスが間違っていませんか? (たとえば、"\\NetworkDisk\Shared\File.txt" など)
\\NetworkDisk\File.txt の場合、それは特定のファイルを表していません。
「NetworkDisk」サーバー上の「File.txt」共有フォルダを意味します。


> どうもネットワーク上で動かすと My.~~~ が使用できないようです。
指定したパスに間違いが無い場合には、実行時のアカウントが、
「共有フォルダに対するアクセス権」を所有しているかどうかを確認してください。


次に、「コード アクセス セキュリティ」を確認してください。
初期設定では、ローカル上の EXE は FullTrust という最大権限にて動作しますが、
ネットワーク上に配置された EXE は、より少ない権限の元で実行される事になります。

たとえば、 My.Computer.FileSystem.CopyFile メソッドの実行には、
FileIOPermission など、幾つかのアクセス許可が要求されます。
http://msdn.microsoft.com/ja-jp/library/36xbexyf.aspx
■No25772に返信(魔界の仮面弁士さんの記事)
> 2009/11/12(Thu) 09:14:51 編集(投稿者)
>
> ■No25771に返信(hirosさんの記事)
>>どうもうまく動きません。

返答ありがとうございます。
> 具体的には、どのような動作をしてしまうのでしょうか?
作成したEXEファイルはネットワークフォルダ上にあります。
EXEファイルは起動します。メッセージや、フォームなども表示できます。
エラーは、ネットワークサーバーで動かすと”問題が発生しました”程度の
エラー表示しか出ません。


My.Computer.FileSystem.CopyFile("\\NetworkDisk\File.txt","D:\File.txt")
のネットワークパスは確かに間違っていました
\\NetworkDisk\Folder\File.txt"が正解ですね。

そしてこのEXEファイルはネットワークサーバー上に存在し、
そのEXEファイルを各LAN上のコンピュータから実行させるように
しています。

そして、
System.IO.File.Exists(fileName)
でファイルの存在を調べようとすると、
fileName="\\NetworDisk\Folder\File.txt"はTrueが返ってきますが、

directoryName="D:\MyFolder"
System.IO.Directory.Exists(directoryName)
でEXEファイルを実行したコンピュータのフォルダの存在を調べようとすると
Falseが返ってきます。

> FileIOPermission など、幾つかのアクセス許可が要求されます。
MSDNにある例を使用し、
Dim f2 As New FileIOPermission(FileIOPermissionAccess.Read, "D:\MyFolder")
として、Exists で確認しましたが、やはりFalseが返ってきました。


この場合、"D:\MyFolder" は共有しておかなければいけないんでしょうか?
FileIOPaermissionの使用方法も間違っているかもしれませんが。
とにかく、実行したコンピュータのフォルダが読み取れません。

また、ご教授をお願いします。
素人ですみません。
2009/11/13(Fri) 01:17:36 編集(投稿者)

前提条件を変えることができなければ、プログラム上で何をやっても解決しません。
(セキュリティ上の制限なので、プログラム側で回避できたらそれはセキュリティホールとみなされる)

解決案1:実行環境全てに.NET Framework 3.5 SP1をインストールする。
 難しいことを考えずに済むので楽。

解決案2:実行ファイルを各作業者がローカルフォルダにコピーしてから実行してもらう。
 環境への影響を与えず、運用によって問題を回避する。

解決案3:各マシンでコードアクセスセキュリティ関連の設定を甘くする。
 細かい手順は調べてないので省略します。
■No25796に返信(Azuleanさんの記事)
> 2009/11/13(Fri) 01:17:36 編集(投稿者)
>
> 前提条件を変えることができなければ、プログラム上で何をやっても解決しません。
> (セキュリティ上の制限なので、プログラム側で回避できたらそれはセキュリティホールとみなされる)

ありがとうございます。やはり現状では無理なようですね。
解決策1を試してみようと思います。
ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板