こんにちは。sinyです。
この記事では、Django+IISでWorker Processの実行ユーザを変更した方法についてまとめました。
そもそもIISのWorker Processって何?
Worker Processというのは、簡単に言ってしまうとIISのウェブアプリケーションが実行されるプロセスのことです。
具体的には以下の「w3wp.exe」というやつですね。
デフォルトだと、ApplicationPoolldentityというビルトインアカウントで実行されるようになっているらしく、おそらくIISのサイト名と同じユーザ名としてw3wp.exeが実行される動きになっているっぽいです。
Django+IISで今回困ったこと
上記のとおり、デフォルトのIIS設定だとIISのサイト名と同じユーザ名(仮にAAAとする)としてIISのWorker Processが動くようです。
今回Django+IIS環境で実現しようとしたのは、「WEB画面から実行ボタンを押す⇒Djangoカスタムコマンド発動⇒カスタムコマンド内でPowerShellをCALL⇒PowerShell内で特定のOSユーザ(仮にBBBとする)でないと動かないコマンドがあった」という事例です。
上記の通り、Powershell内で動かしたいコマンドはユーザBBBでないと動かないのですが、IISを介してWEBから処理を投げた場合、IISのデフォルトの設定でユーザAAAとしてWorker Processが動いてしまいます。
つまり、サーバサイドで生成されるw3wp.exeやpython.exeなども同様にユーザAAAとして起動してしまうため、当然Djangoのカスタムコマンドのみならず、PowerShell等のプロセスもユーザAAAとして動いてしまい処理がエラーとなってしまう問題が発生しました。
解決策
根本原因を突き止めるのに時間がかかってしまいましたが、上記の通り、プロセスの実行ユーザの問題であることが判明したためIISのWorker Processの実行ユーザを明示的に指定することで問題解消することができました。
具体的には、以下の手順でIISのWorker Process実行ユーザを変更しました。
①IISマネージャ→アプリケーションプール→プールを選択→詳細設定
プロセスモデルのIDにユーザ名を指定します。
カスタムアカウントを選択してユーザを指定
ユーザ名とパスワードを指定する画面が表示されるので、Worker Processを実行させたいOSのユーザ名、パスワードを指定します。
以上で、IISの再起動後からIISのWorker Processが指定したユーザ名で起動するようになります。
今回はIISのケースでしたが、他のWEBサーバでも同じような問題が発生する可能性がゼロではないかもしれませんので、参考になれば幸いです。