- ベストアンサー
SQLServer2005のストプロでxp_cmdshellを使いvbsファイルを実行できない
ストプロ内でxp_cmdshellを使用し、vbsファイルを実行したいのですが実行できません。 vbsファイルはxp_cmdShellでキックされたらSQLサーバのデータをSELECTし、テキストファイルにSELECTで取得した行数だけ行を追加するという内容です。 vbsファイルはコマンドプロンプトから実行すると動くので正しいと思います。 ストプロにはvbsファイル実行の前後にtableのupdate作業があり、 その2つは行われます。しかし、書き出されるはずのデータがテキストファイルに書き出されません。 vbsファイルは実行されていないようですがエラーは出ず正常終了となり、 xp_cmdshell実行後の戻り値は0で成功となっています。 xp_cmdshellオプションは有効になっており、は混合モードでSysAdminの権限を持つユーザーで処理をしています。 また、ストプロではなく、SQLServerManagementStudioから下記のようにvbsファイル実行しようとした場合、エラーなく正常終了するのですがテキストファイルにデータは追加されていません。 EXEC @result = xp_cmdshell 'Cscript c:\AddRow.vbs' しかし、EXEC xp_cmdshell 'dir *.exe'は実行できます。 vbsファイルをxp_cmdshell で実行するときは何か特殊な記述が必要なのでしょうか。何がいけないのかわからず困っております。お気づきのことがありましたらご指摘いただけますようお願い致します。 以下にストプロの中身をを記述します。 BEGIN SET NOCOUNT ON; -- テーブルのアップデート処理 UPDATE table1 SET Status = 1 WHERE Status = 0 --ファイル書き出しvbsの実行 DECLARE @result int SET @result = 1 EXEC @result = xp_cmdshell 'Cscript c:\AddRow.vbs' --ここは下記のようにCscriptを抜いても試しましたがだめでした。 --EXEC @result = exec master..xp_cmdshell 'c:\AddRow.vbs' IF (@result = 0) BEGIN --xp_cmdshellの実行が成功したときのみこの処理に入る予定。 --実際は実行されていないようだが@result が0なのでこの処理を行っている。 UPDATE table1 SET Status = 2 WHERE Status = 1 END END
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
当たり前ですが、このvbsはSQL Serverのサービスが実行します。 つまりSQL Serverのサービスを動かしているプロセスがvbsを実行出来なければいけません。もちろん、書き込みを行なうテキストファイルに対する権限も必要です。 「SQL Server構成マネージャ」でサービスを動かしているユーザを確認してください。このユーザでvbsが実行できるようにしてください。
その他の回答 (2)
- jamshid6
- ベストアンサー率88% (591/669)
理由は3rd_001さんの書かれた内容だろうと思います。 (追加書きしたいテキストは「My Document」の中、なんてことは。。) 補足として。。。 「SSMSから間違えたコードを含むvbsを実行すると実行のまま止まらなくなる」のは、vbsが返す構文エラーのエラーメッセージのメッセージボックスが内部的に表示されっぱなしになるからです(xp_cmdshellはインタラクティブではないので、そのメッセージを見ることはできず、永遠に実行中になる)。 今回のうまく動かないvbsでは、「On Error Resume Next」が切られているでしょうから、実行時エラーの「書き込みできません」というエラーメッセージは出ず(=実行中のまま止まることなく)、正常終了します。 従って、xp_cmdshellからvbsを実行する際に気をつけることは「エラーログを書くこと」でしょうか。
お礼
「SSMSから間違えたコードを含むvbsを実行すると実行のまま止まらなくなる」のは、 vbsが返す構文エラーのエラーメッセージのメッセージボックスが内部的に表示されっぱなしになるからなんですね。 永遠に終わらないので何でかと思っていました。 実行時のエラーをログに書くようにします。本当にありがとうございます。
- jamshid6
- ベストアンサー率88% (591/669)
特別な書き方は特に必要ないはずです。 EXEC @result = xp_cmdshell 'c:\AddRow.vbs' EXEC @result = xp_cmdshell 'CSCRIPT c:\AddRow.vbs' でも実行できますし、仮にパスが通っていなかったとしたら、エラー(1)が返ります。 どこまで切り分けできているのかわからないのですが、 ・SQL Serverはローカルで接続しているのですか?サーバが別にあってリモート接続ですか? 「vbsファイルはコマンドプロンプトから実行すると動くので正しいと思います。」というのは、SQL Serverがあるマシンで確認した結果ですか? ・例えば、以下のような超シンプルなvbsをSQL Serverのあるマシンに置き、SSMSからEXEC xp_cmdshellを実行するとどうなりますか? Set fso = CreateObject("Scripting.FileSystemObject") Set a = fso.CreateTextFile("c:\testfile.txt", True) a.WriteLine("Test") a.Close Set a = Nothing Set fso = Nothing
お礼
ご回答ありがとうございます。せっかくご回答いただいていたのに、返信が遅くなって申し訳ありません。 説明不足だった点ですが、 >・SQL Serverはローカルで接続しているのですか?サーバが別にあってリモート接続ですか? SQL Serverはローカル接続しています。 >「vbsファイルはコマンドプロンプトから実行すると動くので正しいと思います。」というのは、SQL Serverがあるマシンで確認した結果ですか? SQL Serverがあるマシンで確認しました。正常に動きます。(テキストファイルに行を追加できる) また、シンプルなファイル作成のvbsをSQL Serverのあるマシンに置き、 SSMSからEXEC xp_cmdshellを実行したところ、ファイルに内容を書き込むことができました。 また、実際はテキストファイルに行を追加したいので、CreateFileではなくOpenFileで試しましたがこちらも成功しました。 うまく動かないvbsに間違った文法のコードを書き込みSSMSから実行すると、処理が終わらず実行している状態のままになってしまうので、 実行自体はしているようなのですが、ファイルにデータを書き出すことができません。 状況を整理すると、 質問に貼り付けたコードのvbsファイルがコマンドプロンプトから実行するときちんと動く(ファイルに行を追加できる)が、 SSMSからはできない。しかし、エラーフラグは立たず正常終了となる。 SSMSから間違えたコードを含むvbsを実行すると実行のまま止まらなくなるので、実行処理は行っているようである。 ファイルに行を追加するのみのシンプルなvbsはSSMSからも実行できる。 XP_cmdshellからvbsを実行する際、何か気をつけることがあるのでしょうか?
お礼
ローカルシステムでサービスを動かしたら動きました。ありがとうございます。本当に助かりました。