• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:xp_cmdshellについて)

Windows XP ProとSQL Server2005で入力画面のあるプログラムを実行する方法は?

このQ&Aのポイント
  • Windows XP ProとSQL Server2005を使用して、DMLトリガによって入力画面のあるプログラムを実行したい場合、xp_cmdshellを使用する方法があります。
  • しかし、xp_cmdshellでは入力画面を持つプログラムを実行することはできません。
  • 別の方法を探している場合、具体的なソースコードや参考サイトを探すことをおすすめします。

質問者が選んだベストアンサー

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.4

本来の質問からは相当乖離しているような気がしてきましたが。。 コンソールアプリケーションはその環境であれば動くはずです。 ファイルの書き出し先をマイドキュメントにしているようですが、C:\Tempなど普通のフォルダを指定して試してみてください。 SQL Serverがxp_cmdshellを実行するとき、質問者さんのユーザIDの権限で実行すると思っていませんか? 何も考えないでインストールしたのだったら、おそらくローカルシステムアカウントで実行されます。そのフォルダにアクセスする権限がなければファイルは書き出せません。 #念のため、ちなみに書かれていたものをコピペして、フォルダを変更してコンソールアプリケーションにして実行してみたら、ファイルは書き出されました。

spiral1111
質問者

お礼

jamshid6様 当初の質問からかなりずれてしまったにも拘らずご丁寧なアドバイスをありがとうございました。 おっしゃったとおり、フォルダの権限がなかったために書き込まれていないだけでした。 これからはもう少し調べて、どうしても分からなかったら質問しようと思います。 本当に長い間お世話になりました。ありがとうござます。

その他の回答 (3)

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.3

サーバ処理とクライアント処理は別物だと思ってください。 SQL Serverでxp_cmdshellを実行させるということは、当然SQL Serverのあるサーバで処理が走ることになりますから、サーバのローカルドライブを見にいきます。 質問者さんはSQL Serverに接続して実行の指示をしているだけに等しいのです。 やはりEXEは了承を得てサーバに置くか、クライアント処理させたければSQL Serverにやらせるのはあきらめた方がいいです。 そもそもアプローチ的に変なので以下は余談として見てほしいのですが、SQL Serverのあるサーバが質問者さんの端末にドライブマップしてネットワーク経由でexeを叩いたとすれば、そのexeは動くと思います。 しかし、モジュールがどこにあろうが実行はサーバで行われます。 質問者さんのexeがサーバで正常に動くことが確認できていない状態でそれを試すのはやめた方がいいと思いますよ。ハングしてもサーバにアクセスできないんですよね?

spiral1111
質問者

お礼

大変失礼しました。 自分のPCにもDBが作れることを知らなかったので、サーバ処理でストアドを作っていましたが、自分のPCにもDBを作って再度試してみまた。 jamshid6様のおっしゃるEXEファイルをPCに置くことでストアドの処理自体は正常に終了したとでます。(メッセージにSuccess) しかし、肝心のProgram.exeが動いてないようなのです。 Program.exeはVB2005のコンソールアプリケーションとして作成し、下記のようなコードを適当に作ってみました。(VSの方で実行し正しく動くことを確認) Module Module1 Sub Main() Dim FileName As String = "C:\Documents and Settings\***\My Documents\SutoadoTest.CSV" Dim Code As String = "Shift-JIS" Dim Message As String = "テステス" Dim Num As Integer = 1234567890 Dim Join As String Dim Writer As IO.StreamWriter Dim Encode As System.Text.Encoding Join = Message & "," & Num Encode = System.Text.Encoding.GetEncoding(Code) Writer = New IO.StreamWriter(FileName, true, Encode) Writer.WriteLine(Join) Writer.Close() End Sub End Module 入力画面等のないアプリケーションなら動くかと思っていたのですが、コンソールアプリケーションでも動かないのでしょうか? もし、動かないのでしたら、いったい何なら動くのでしょうか? 度々質問ばかりで申し訳ありません。 よろしくお願いいたします。

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.2

Developer Editionということなので、ローカル接続でやっているのかと思っていましたが、もしかしてリモート接続(SQL Serverは別のPCかサーバにある)ですか? そのメッセージは、通常その場所にExeがないときに返されます。 SQL Serverの動いているPCかサーバに「Program.exe」を置いていますか?

spiral1111
質問者

お礼

説明不足ですみません。 SQL Serverは別のサーバにあります。 デスクトップPCの方で、VB2005でProgram.exeを作りCドライブ直下に置きました。 もしかして、ストアドでC:\Program.exeとするとサーバの方のCドライブを見てしまうのでしょうか…? 現在、研修の関係でサーバの中身を見ることが出来ないのですが、ストアドの実行をデスクトップPCの方のCドライブにすることはできないのでしょうか? また、作ったexeファイルの出力先もCドライブ直下にしたのですが、これもサーバ側のCドライブになってしまうのでしょうか? 何度も質問ばかりして申し訳ございません。

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

>DMLトリガによって入力画面のあるプログラム(例えばメモ帳など)を実行したい そこまで考える人がいるとはちょっと感動しました。 結論からいくとできないと思います。 ・SQL Serverから直接他のプログラムを起動する方法はxp_cmdshellとCLRだけですが、いずれもInteractiveな動きはサポートしないようです。xp_cmdshellだとプロセスをKillするまで永遠に待ちに入ってしまいます。CLRでも試してみましたが、NOTEPAD.exeを起動して正常終了はしますが、なにぶん起動しているのがSQL Serverなので自分の画面には帰ってきません。これは偽装しても同じ結果でした(結局、タスクマネージャからKillするしかないのですが) それ以前の問題として、 ・リモートのSQL Serverではそもそもできないアプローチです。 ・更新処理というのはトリガも含めて正常終了したときに初めてCommitがかかるものなので、DMLトリガにこのようなものを仕込むとおそらくトランザクションがロックされてしまうでしょう。 所詮SQL Serverもデータベースですので、この仕組みは更新処理を掛けるアプリケーション側で実装するようお勧めしておきます。

spiral1111
質問者

お礼

早速のご回答ありがとうございます。 やはり、出来ませんか・・・。 これとはまた別の質問になってしまうのですが、PDFを出力するEXEファイル(VB2005で作成)をxp_cmdshellで実行することはできますか? このEXEには入力画面はなくフォームロードに出力をして閉じています。 SQL Serverからストアドプロシージャを通して実行してみたのですがエラーがでてきてしまって、どうしたらいいのか困っています。 EXEファイルは正常に実行できますので、問題はストアドのほうだと思うのですが、よくわかりません。 下記にストアドのソースを載せるので、見てもらえないでしょうか? ALTER PROCEDURE [dbo].[OUTSIDE_PROGRAM] AS BEGIN DECLARE @result int EXEC @result = master.dbo.xp_cmdshell 'C:\Program.exe' IF (@result = 0) PRINT 'Success' ELSE PRINT 'Failure' RETURN @result END これを実行すると、結果欄には 1 'C:\Program.exe' は、内部コマンドまたは外部コマンド、 2 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 3 NULL と表示されてしまい、EXEが実行されていませんでした。 ただ、手動でコマンドプロンプトを開き、C:\Program.exeを実行すると しっかり動いています。

関連するQ&A