[これは元々stackoverflow.comに投稿されましたが、ここの方が適している可能性があり、サーバー構成の問題であると確信しています。これが悪い形であると考えられるならば、謝罪します。]
データベースリビジョン管理(および自動インストール)手順の一部として、ASPページ内からさまざまな.sqlファイルに対してsqlcmd.exeを実行できる必要があります。使用しているコードはこれを行うには:
Dim cmd : cmd = "sqlcmd -S " & DATABASE_SERVER & " -U " & DATABASE_UID & " -P " & DATABASE_PWD & " -d " & DATABASE_NAME & " -i """ & scriptPath & """ -b"
Dim wshShell : Set wshShell = Server.CreateObject("WScript.Shell")
Dim return : return = wshShell.Run(cmd, 0, True)
2つの別々の開発マシンでコードが正常に機能しています。これらは両方ともXPを実行しており、コードを機能させるために追加の手順は必要ありません。コードをWindows 2003サーバーに展開すると、問題が発生します。問題は、returnの値が常に1であるということです。これは、バッチファイルやその他の考えられるものを実行しようとした場合にも発生します(cmdの値を存在しないファイルに変更すると、予想どおりに爆破されます)
I_USRとI_WAMを追加して、sqlcmd.exeとcmd.exeの両方に対する実行権限を持たせようとしましたが、それでも1が返されます。サーバーでコマンドプロンプトを開き、「runas/user:servername\i_usrsqlcmd.exe」を実行すると"これは正常に機能しますが、ASPページから実行しても機能しません。
また、.sqlスクリプトを手動で実行すると、すべてがスムーズに実行されるため、問題はありません。
IISまたはWindowsで、サーバーを機能させるために変更するのを忘れたセキュリティ設定はありますか?
別のServer2003マシンでもこれを試しましたが、まったく同じ問題が発生しています。
半分。
問題が何であるかをちょうど見つけました(まあ、私のホスティングプロバイダーはそうしました)。コマンドの前に「%COMSPEC%/ C」(%COMSPEC%はcmd.exeへのパスを保持します)を追加してコードを変更しました。
Dim cmd : cmd = "%COMSPEC% /C sqlcmd -S " & DATABASE_SERVER & " -U " & DATABASE_UID & " -P " & DATABASE_PWD & " -d " & DATABASE_NAME & " -i """ & scriptPath & """ -b"
今ではダンディに動作します。理由/方法がわからないので、可能であれば誰かがより包括的に答えられるように、今のところ質問は未回答のままにしておきます。