プロが教えるわが家の防犯対策術!

VB.NETで実行ファイルを作成し、それをネットワーク上のサーバー共有フォルダに置きます。
それをクライアントから実行するアプリを作成しています。

ビルドすると、作成したEXEファイルと共にDLLファイルも同時に作成されるので、それも共に共有フォルダに置いています。

そしてクライアント側からEXEファイルを実行すると「system.security.securityexception」と言うエラーが出て実行されません。

どなたか対処法などを教えて頂けないでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (2件)

アクセスするフォルダやファイルには権限があって、


起動しただけでは、それらにさわりもしないのに
エラーが起こるとなると不可解ですね
とりあえず、例外が起こることがわかっているのですから
try

catch

end try
で適当な処をマルっと囲って
securityexceptionをキャッチして
(開発環境がその例外の起こるPCに入っているなら話は簡単ですけどね)
それを適当なMessageBoxとかファイルに書き出すようにしてみたらどうでしょうか
securityexceptionを起こしているオブジェクト、
例外をスローしたアクセス許可の状態・種類が得られるということになってますけど。
    • good
    • 0

まず、そのフォルダでの実行者の実行権限がない。


ネットワーク越しで起動したEXEがローカルの資源(ファイルなどを)更新したり(新規作成・削除)しようとしているとか

この回答への補足

返信ありがとうございます。
フォルダに対してはフルアクセス権限があります。

ネットワーク上でファイルのコピー等を行う機能はありますが、それが原因なのでしょうか?
それならコピー実行時にエラーになるのはわかりますが、EXE本体が起動しない原因は他にあるような気が…。

ちなみに今まではVB6で同様のアプリが動いていて問題ありませんでした。
.NETだからダメって事なんでしょうけど…。

補足日時:2004/12/28 12:05
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qネットワーク上のコンピュータのファイルを起動させる

ネットワーク上のコンピュータにある、あるディレクトリに移動し
あるファイルを実行する

といったバッチファイルは作れますか。

ローカル内であれば
cd /D C:\
xxxxxx.exe
ですが

cd /D \\xxxx.xxxx.xxxx.xxxx
みたいなことができるコマンドはあるのでしょうか。

Aベストアンサー

pushd \\computer\sharename
で、自動的にネットワークドライブ接続して、そのドライブに移動してくれます。
popd で元のディレクトリに戻ると共に、ネットワークドライブを解放します。

QLANの共有フォルダ内の実行ファイルは実行できない?

はじめまして、当方WindowsXP Pro SP3を2台所有しておりまして、
1台は家内が使っております。

その家内のPCに共有フォルダを作ってその中にexeファイルを置いておき、
私のPCからクリックしても実行することができません。

私の使っているPCからも共有フォルダは参照できておりますし、
exeファイルも見えております。
このexeファイル同フォルダ内のdllを2つ参照しております。
フォルダごとデスクトップにダウンロードしてこれば問題なく
起動するのですが、不便で仕方ありません。

以前、このような構築をした時は問題なく起動させる事が
できたと思うのですが、SP3になってから何か仕様が変わったのでしょうか?

また、何か特殊な設定があるのでしょうか?
ご存知の方、ご教授くださいませ。

Aベストアンサー

勿論出来ますよ~
私は、4台PCを持っていますが、フリーソフトなどは、1台の共有ファイルに入れて、他のPCからアクセスして、インストールしています。(exeファイルもあります)
共有の設定で「ネトワークユーザーによるファイル変更を許可する」にチェックは入っていますか?

QVBAでネットワーク上のバッチジョブを実行したい

クライアントPCのVBAからサーバなどのネットワーク上のバッチジョブを実行するにはどのようにすればよいでしょうか?

  Dim WshShell
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run "\\サーバ名\AAAAA\BAT\TEST.bat", , True
MsgBox "終了!"
Set WshShell = Nothing

上記を参考にしたのですが、どうもうまくいかないのです。

何かが足りないのですか?

Aベストアンサー

No1で回答した者です。

なるほど、サーバサイドで実行したいとのことですね。
となりますと、クライアントからのShell呼び出しは、
クライアント実装なので、NG。
ソフトがサーバにあっても、クライアントインスタンスで
動作します。

簡単な例えで言いますと。
Webサーバでもなんでもそうですが、別の筺体のプログラムを
遠隔で処理できるようにするには、やはり。
「サーバ側で常に待ち構えている(という意味で"Server")ソフト」
と、「クライアントでトリガを発行するソフト」という2本立ての
手段をとります。
なぜ遠隔操作するのに「サーバ待ち構えソフト」が必要かというと、
ごく単純にセキュリティの問題で。
VBAのShell関数くんだりで、Delete 遠隔Fileコマンドなど発行
されると、YahooでもGoogleでも遠隔で削除できてしまうので
迷惑極まりないと。
よって、そうできない決まりになっています。

さて。
通常はサーバに対しリクエストをかける方法としては、
Socket通信など、TCP/IPで行うのがセオリーなんですが。

社内LANなど小さい、セキュリティを気にしなくていい
ネットワークでは真似ごととしてこんなやりかたもできます。

1.サーバサイドにバッチファイルを仕込む。
  そのバッチは、「どこかWindows共有フォルダに特定の
  ファイル名のファイルが入ると別プログラムをキックする
  もの」を作ります。
  簡単にはVBScriptなどで
  If (どこどこのファイルが見つかった) Then
Shell "Notepad.exe" 'メモ帳起動
  End If
  という短いものでいいです。

2.上記のプログラムは一瞬で終わってしまうので、偽装常駐
  させるため、Windowsのタスクで1分ごとにでも常に実行する
  設定をします。
  常に1分ごとに動作させておきます。

3.VBA側で、サーバの共有フォルダに特定の名前のファイルを
  放り込みます。

…この理屈で動きますよね(笑)
実際に、サーバなどという仕組みは。
簡単にいえば、上記1,2の機能を実装したようなソフトで。
…こんなしょうもないもんです。
なんでも試してやってみるといいんじゃないでしょうか?

ちなみに、サーバサイドのプログラムで「"終了"」などの
画面を出すことはよろしくありません。
プログラムがOKを押すまで止まってしまいますよ。

No1で回答した者です。

なるほど、サーバサイドで実行したいとのことですね。
となりますと、クライアントからのShell呼び出しは、
クライアント実装なので、NG。
ソフトがサーバにあっても、クライアントインスタンスで
動作します。

簡単な例えで言いますと。
Webサーバでもなんでもそうですが、別の筺体のプログラムを
遠隔で処理できるようにするには、やはり。
「サーバ側で常に待ち構えている(という意味で"Server")ソフト」
と、「クライアントでトリガを発行するソフト」という2本立ての...続きを読む

Qバッチファイルでサーバーのファイルをクライアントへコピーしたい

サーバーに保存されているファイルを、
クライアントのCドライブへコピーしたい。

各クライアントにバッチファイルを配布して、
それを実行するだけでコピーされるようにしたいのです。

初心者で申し訳ないのですが、何卒よろしくお願いします。
------------------------

下記の記述ですと、普通にサーバーのCドライブへファイルがコピーされます。
しかし、コピー先はバッチファイルを実行したクライアントのローカルディレクトリにしたいのです。

copy \\サーバー名\フォルダ名\ファイル名 C:\

Aベストアンサー

>下記の記述ですと、普通にサーバーのCドライブへファイルがコピーされます。

そんなはずはありません。何かの勘違いでしょう。

>copy \\サーバー名\フォルダ名\ファイル名 C:\

だと、バッチファイルを実行したPCのC:\にコピーされます。

copy \\サーバー名\フォルダ名\ファイル名 C:
と、最後の \ を削れば、バッチファイルがあるのと同じディレクトリにコピーされます。

QVB.NETで作ったプログラムがサーバー上で実行できない

いつもお世話になっております。
標題の件なのですが、VB.NETで作ったプログラムをサーバーに置いて、
ネットワークごしに実行するとエラーが出てしまいます。
エラーの内容は「system.security.permissions.securitypermission」です。

プログラムの内容は、
(1)XMLファイルを読み取る。
(2)ADOでOracleに接続し、ストアドを実行する。
(3)Oracleからデータを取得し、Excelを出力する。
といった感じです。

エラー内容的にセキュリティの問題だと思うのですが、回避策がございましたら、
ご教授願います。

Aベストアンサー

XMLの読み取り時にSecurityExceptionが発生したのだと思われます。

UNC経由で.NET Frameworkのプログラムを起動した場合,そのプログラムは,.NET Framework 3.5 SP1より前のバージョンでは完全信頼とされていませんでした。
そのため,ファイルアクセスを行う場合は,OpenFileDialogまたはSaveFileDialogのOpenFileメソッドを通じて行う必要がありました。
おそらく,今回はこの問題に引っかかったのだと思います。
なお,.NET Framework 3.5 SP1 (3.0 SP2/2.0 SP2含む) においては,MyComputerZoneでの実行となり,完全信頼となります。
http://msdn.microsoft.com/ja-jp/library/cc713697.aspx

方法論としては,
・Visual Studio 2005/2008でビルドし,.NET Framework 3.5 SP1を入れた環境下で実行する
・caspolコマンド等で,アセンブリにFullTrustを与える
といった必要があります。
# ドメインを構成している場合は,別の解決策があったように思いますが,失念しました。

XMLの読み取り時にSecurityExceptionが発生したのだと思われます。

UNC経由で.NET Frameworkのプログラムを起動した場合,そのプログラムは,.NET Framework 3.5 SP1より前のバージョンでは完全信頼とされていませんでした。
そのため,ファイルアクセスを行う場合は,OpenFileDialogまたはSaveFileDialogのOpenFileメソッドを通じて行う必要がありました。
おそらく,今回はこの問題に引っかかったのだと思います。
なお,.NET Framework 3.5 SP1 (3.0 SP2/2.0 SP2含む) においては,MyComputerZoneでの実...続きを読む

QVBA ネットワーク上のファイルでカレントフォルダを取得するには?

VBA ネットワーク上のファイルでカレントフォルダを取得するには?

VBA超初心者でネットで色々調べて、ところどころコピーしながらプログラムを作っています。
ローカルのPCでは問題なく動くまでになったのですが、実際にはネットワーク上の共有サーバで実行したいのですが、ネットワーク上ではカレントパスがうまく設定できていないようで、動きません。

CreateObject("WScript.Shell").CurrentDirectory = ThisWorkbook.Path

というコードでVBAが置いてあるフォルダをカレントディレクトリに設定するようにしています。

どのようにしたらネットワークサーバで動くようになりますか?

Aベストアンサー

WebDAVの環境がないため、関連のありそうな情報をあたってみました。
もしかすると、OSの機能で制限されているかもしれません。

http://heipooh.jugem.jp/?eid=56

VBAではなく、直接手動操作で設定した時にはどうでしょうか?
できないとなると、何らかの環境設定が必要なのではないでしょうか?
上記URLの操作では、エクスプローラからネットワークドライブとして認識させています。

EXCELの機能については、下記URLの「カレントドライブとカレントフォルダ」をご参照ください。
http://officetanaka.net/excel/vba/tips/tips91.htm

現状のネットワーク構成ですと、カレントディレクトリの前に、カレントドライブを認識し得る環境がないと推察されます。

取得する方法について、他もあたってみて、情報が見つかりましたら投稿致します。

QDoEvents関数って何?

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そこで「EXCEL VBA パーフェクトマスター」という本を見たら

for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
DoEvents
next i
unload userform1
と入力すれば解決することがわかりました。

しかし「DoEvents」についてあまり詳しく書いていなかったのでDoEvents関数をヘルプで見ると、
「発生したイベントがオペレーティング システムによって処理されるように、プログラムで占有していた制御をオペレーティング システムに渡すフロー制御関数です。」

と書いてあるのですが正直、書いてあることがよくわかりません。

どなたかDoEvents関数について、
もう少しわかりやすく教えていただけませんか。
それから、最初に書いたコードで実行すると
ユーザーフォームの背景が真っ白になってしまう原因も
教えていただけませんか?

よろしくお願いいたします。

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そ...続きを読む

Aベストアンサー

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
    DoEvents
    Cells(i,1) = ""
  Next i
End Sub

Private Sub CommandButton2_Click()
  MsgBox "hoge"
End Sub

っていうフォームのコードがあった場合、
DoEvents を入れることによって、ループ中にユーザーがCommandButton2 を押すことによって CommandButton2 のクリック イベントも動いちゃいます。
CommandButton1 のクリック イベントではループの前に
CommandButton1.Enabled = False
CommandButton2.Enabled = False
を書いてフォーム上の CommandButton を無効にしておき、ループが終わったら
CommandButton1.Enabled = True
CommandButton2.Enabled = True
と書いて CommandButton を有効に戻してください。

これを工夫すれば、CommandButton2 で CommandButton1 のループを途中キャンセルする処理もすることができます。

Private Canceled As Boolean

Private Sub CommandButton1_Click()

  CommandButton2.Enabled = False

  Dim i As Long
  For i = 1 To 50000
    DoEvents

    If Canceled = True Then
      MsgBox "キャンセルしました"
      Exit Sub
    End If

    Cells(i, 1).Value = ""
  Next i
End Sub

Private CommandButton2_Click()
  Canceled = True
End Sub



コードの行頭にあるスペースは見易さのために全角スペースで作成していますので、これをこのままコピペするとエラーになるかもしれません。
コピペするなら行頭の全角スペースを半角スペースに直してください。

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
...続きを読む

QShell関数からバッチファイルを起動後に、バッチファイルが終了するまで待ちたい。

はじめまして。
掲題の通り、VB.netからshell関数を用いてバッチファイルを起動します。
その後、そのバッチファイルが終了してログファイルの出力を完了した後に、
ファイルを開いて確認したいのです。
thread.sleepなどで大体このくらいかなという時間を待ってみる、
などのやり方しか今は思いつかないのですが、
何か明確にバッチファイルの終了を受け取れる方法は無いものでしょうか。

どなたかご存知の方がいらっしゃいましたらご教授ください。

Aベストアンサー

Shell関数より Processクラスで実行したほうが簡単に待てますよ

Dim oPro as Process
oPro = Process.Start("..\..\a.bat")
oPro.WaitForExit()
MessageBox.Show("Hello")

といった具合です

QCloseとDisposeの違い

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、タイマーコントロールのイベントに記述していますと、それは実行され続けます。

これを防ぐために、Me.Dispose() を使います。すると、きれいにプロセスは終了し、イベントは発生しない模様です。

そこで、「フォームを閉じる」意味のMe.Close() をすべてMe.Dispose() に変えてしまいました。確実にプロセスを破棄出来ると思ったからです。Webで調べると、違いは「再利用できる、できないの違い」という答えがありましたが、それはきっと、ファイルやオブジェクトのことで、フォームの場合は、再びShowまたはShowDialogで表示させることは可能でしたので、特に問題は感じていませんでした。

ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。Me.Close() に変えるとうまくいきました。

わけわからなくなってきました。。。

ちなみに、その残ったフォームは、スタートアップフォームであり、別のフォームからShowまたはShowDialogメソッドで呼び出したものではありません。

ここで4つの仮説を立ててみました。

1. ShowDialogで呼び出したフォームは、Me.Dispose()、Showで呼び出した、あるいは、スタートアップフォームは、Me.Close() すれば破棄できる

2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

3. 呼び出し方ではなく、別の要因が存在する

4. 併記する必要がある場合がある

Me.Close()
Me.Dispose()

または、

Me.Dispose()
Me.Close()



どれが正しいのでしょうか?どなたがご存じの方がいらっしゃいましたら、ご教授いただけませんでしょうか? どうぞよろしくお願い申し上げます。ありがとうございました。

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、...続きを読む

Aベストアンサー

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。
Me.Close() に変えるとうまくいきました。

通常はどちらでもうまくいきます。

>2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

ShowDialogの場合は、メソッド内部で、ハンドルが破棄されているため、Close()メソッドの際にDispose()メソッドが呼び出されます。

>3. 呼び出し方ではなく、別の要因が存在する

そう思います。

>4. 併記する必要がある場合がある

インスタンスを明示的に破棄したほうがよい場合は多く存在します。
Disposeが使えるメンバはIDisposableをインターフェースとして持っているメンバです。
これらのメンバは、外部とのやり取りを行うものが多くあります。
たとえばSQLClientに含まれるようなメンバです。

外部とのコネクションを確実に破棄を保障してほしいなどという場合がありますよね、このようなときに使用します。

Using構文を使用するのとまったく同じ理由になります。
正確にはUsing構文を使用できるメンバには条件があります、IDisposableをインターフェースとして持っているメンバに限るというものです。

ほかにもガーベージコレクタによるファイナライズを伴うかどうかという違いがあります。
Disposeの場合はファイナライズが同時に行われるため、使用していたメモリ空間を開放することができます。

上記のような理由により、
Me.Close()
Me.Dispose()
は両方書いたほうがよいと思います。

蛇足ですが、
Me.Dispose()
Me.Close()
はエラーになります。
Me.Dispose()により、Me本体(インスタンス)は削除されてしまいます。
存在しないMeに対してCloseメソッドを要求することはできないためです。

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリ...続きを読む

QVBプログラムから「管理者として実行」したい

コマンドプロンプトで実行したいコマンドが
「route add ***.***.***.*** mask 255.255.255.255 ***.***.***.***」 (*は、任意のIP)
だとします。

XPでは問題ないですが、Vista以降だと、管理者権限が必要なコマンドのため、
そもそもコマンドプロンプト自体を「管理者として実行」モードで起動する必要があります。

上記を、手作業で行う場合は、それで解決しますが、
同じ事を、VBのコードから実行したい場合、
System.Diagnostics.Process.Start
を使い、(以下サンプルコード)
---------------------------
Dim psi As New System.Diagnostics.ProcessStartInfo()

psi.FileName = System.Environment.GetEnvironmentVariable("ComSpec")
psi.UseShellExecute = False
psi.CreateNoWindow = True
psi.Arguments = "/c route add ***.***.***.*** mask 255.255.255.255 ***.***.***.***"

Dim p As System.Diagnostics.Process = System.Diagnostics.Process.Start(psi)
p.WaitForExit()

-----------------------------------------------------------

とすると、XPでは、管理者権限を問われないので実行できますが、
Vista以降だと、コマンドが管理者権限で実行されていないためか実行が完了せず、コマンドの内容も行われていません。(route addコマンドの記述にミスは無いとします。)

Vista以降の場合、手作業で、コマンドプロンプトを右クリックして「管理者として実行」を選んで起動し、コマンドを実行するのと同じ事を、
VBのコードから行うには、どうしたらいいのでしょうか?
分かる方、教えてください。お願いします。

コマンドプロンプトで実行したいコマンドが
「route add ***.***.***.*** mask 255.255.255.255 ***.***.***.***」 (*は、任意のIP)
だとします。

XPでは問題ないですが、Vista以降だと、管理者権限が必要なコマンドのため、
そもそもコマンドプロンプト自体を「管理者として実行」モードで起動する必要があります。

上記を、手作業で行う場合は、それで解決しますが、
同じ事を、VBのコードから実行したい場合、
System.Diagnostics.Process.Start
を使い、(以下サンプルコード)
---------------------------...続きを読む

Aベストアンサー

http://www.atmarkit.co.jp/fdotnet/dotnettips/954uacrunas/uacrunas.html


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング