bat
IIS
WindowsServer

WEBAPI経由でWindowsサーバ上に配置したBATを実行させようとしたときに想定通りの結果にならなかった話

やりたかったこと

Windowsサーバ上で実行させるpythonの処理をAPI経由で呼び出したい

※PythonじゃなくてもなんかしらのEXEでも同じようなことはできるような仕組みにはしておきたい。

やったこと

C#のWEBAPIをIIS上に配置して、それ経由でBATを実行させようとした。
※BATはpythonの処理を引数指定で呼び出す程度のもの
BATにしたのは引数などの調整をする際にAPIのほうを修正するのがめんどくさそうだったから。

呼び出しとしては以下

//プロセス起動
System.Diagnostics.Process p = System.Diagnostics.Process.Start("BATのフルパス", id);
p.WaitForExit();

どうにも起動しない。

APIを呼び出しても起動しない。

以下の順で解決していった。

1. BAT内でxxx.pyを呼び出していたが、どうもpyがPythonと関連づけられていなかった。

Pythonと関連づけられていなかったので、python xxx.py のように記載したが、Pathも設定されていなかった。

→Pythonについてはフルパスで設定。

※ここまでは手動でBATを実行してもうまくいかないのでWEBAPIとかは直接関係ない単なるショボミスな話

2.Pythonをフルパスにしたことで上手くいくかと思ったが、処理結果が想定通りにならない。

手動起動ではうまくいくのでWEBAPI経由だとうまくいかなかった。

Process.Start()で呼び出しているが、起動されていなさそう。

結論としては

WEBAPI経由だとIISユーザとして起動されることになるのだが、それに対する権限を付与してなかった。

→BAT格納フォルダやログ出力フォルダに対してeveryoneのフルコントロール権限を付与。

※正確に権限を付与するのであれば「IIS_IUSRS」にすべきなんだろうけど、とりあえずeveryoneで実施。

これで動作した。

結論

気が付けばどうってことないが、思いつかないと結構ハマった。