- ベストアンサー
VBAでネットワーク上のバッチジョブを実行したい
クライアントPCのVBAからサーバなどのネットワーク上のバッチジョブを実行するにはどのようにすればよいでしょうか? Dim WshShell Set WshShell = CreateObject("WScript.Shell") WshShell.Run "\\サーバ名\AAAAA\BAT\TEST.bat", , True MsgBox "終了!" Set WshShell = Nothing 上記を参考にしたのですが、どうもうまくいかないのです。 何かが足りないのですか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
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を押すまで止まってしまいますよ。
その他の回答 (4)
- SHIMAPEE
- ベストアンサー率75% (154/203)
ANo.2 補足へのアドバイスです。 WshRemoteでなくてもサーバの何かを起動するためには、ANo.1 yama-takuさんが書かれていますようにかなりの準備が必要になるでしょう。それが面倒でしたら別の方法を考えた方がよいでしょう。例えばサーバ側ではCOBOLのプログラムを定期的に実行し、クライアント側ではその結果のファイルを参照するとか。 情報が小出しになりますけれども、やはりWshRemoteでやってみようという場合のため、Windows XP SP2での設定方法のリンクを書いておきます。タイトルはWMIですがWshRemoteでも同様の設定が必要です。 Windows XP SP2のWMIに関する問題のトラブルシューティング方法 http://support.microsoft.com/kb/875605/ja もしWindows XP SP2でワークグループの場合は下記の設定(ForceGuest=0にする)も必要です。 ワークグループにインストールされているWin XP Proでセキュリティを設定する方法 http://support.microsoft.com/default.aspx?scid=kb;ja;jp290403 面倒ですね。(^^;;;
- SHIMAPEE
- ベストアンサー率75% (154/203)
環境に依存するのでお役に立つかどうかわかりませんけれども、VBAではなくWSH(VBSCriptならVBAと文法は似たようなものです)WshRemoteを使うと他のコンピュータにスクリプトを送って実行できます。スクリプトは他のコンピュータで実行されます。WshRemoteについては下記の@ITのページが詳しいです。 WshControllerオブジェクト、WshRemoteオブジェクト http://www.atmarkit.co.jp/fwin2k/operation/wsh09/wsh09_01.html ドメインでは経験ありませんがワークグループのWindows XP SP2 Pro同士(admin権限の同じユーザ名、同じパスワード)で試したことはあります。Windows XP SP2ではファイアウォール、及びDCOMを設定する必要があります。 ----- ところでサーバ側で実行するバッチジョブは何をするものでしょうか。最終的に行いたいことがコンピュータの情報の取得でしたらWMI(Microsoft Windows Management Instrumentation)の方が簡単だと思います。
補足
>サーバ側で実行するバッチジョブは何をするものでしょうか cobolのプログラムを実行するバッチです。 DCOMとか私には全く理解の範囲を超えています。 また、WshControllerオブジェクト、WshRemoteオブジェクトはレジストリを変更する必要があることが書いてありましたけど、そこまではしたいないですね。
そのバッチに問題があると思います。 クライアントPCからだとフォルダ名が「\\サーバ名\AAAAA\BAT\」になっているように、 バッチの中のコマンドも「dir C:\*.txt」じゃ動きません。なぜならC:が存在しないのです。クライアントからサーバのC:にアクセス権限する権限もないです。バッチの中のコマンドが「dir \\サーバ名\AAAAA\BAT\*.txt」なら動きます。
バッチジョブを「どこで」やりたいかによります。 貴方のソースコードの場合、サーバに存在するバッチファイルを クライアントで実行するソースになっています。 当初の目的がそれでもいいのであれば、ごく単純にサーバログインの アカウントが通っていないだけのような気がします。 サーバ上にクライアントのアカウントと権限を振り、かつ、 フォルダにアクセス権限、実行権限を与えれば上記コマンドが 動くと思います。 この場合は「終了!」メッセージはクライアントに表示され、 コマンドもクライアントで実行されます。 また、別途。 上記の「終了!」というメッセージをサーバで表示したい、つまり、 サーバサイドで実行させたい場合は、上記のソースコードでは 無理です。 基本的にクライアントからサーバ上への実行インスタンスを 作ることは直接は不可能ですので、普通はサーバの「常駐サービス」 を用意します。 簡単にいえば、何らかの常駐してコマンドを実行するサーバの 別プログラムに対し、Socket通信でも、Webでもいいので、クライ アントからトリガとなる「通信」を与えてやる手段をとります。
補足
yamaーtakuさん、早速ありがとうございます。 バッチジョブはサーバに存在し、そこで実行したいのです。 あくまでクライアントはトリガです。 それが前提なんですが、サーバ側で何か用意する必要があるのですか? その辺がよく理解できないところなんです。 実をいうと、VBAに関しても素人同然なんです。
お礼
サーバ側でファイルの常駐監視をして動くしくみを結局つくりました。 皆様ありがとうございました。