SSブログ

1.13 IISでpywin32を動作させる方法(DJango 2.2.7) [Django]

訂正事項:2020年10月

Windows Updateでセキュリティが厳しくなったかで
うまく動作しなくなったので訂正。

1. 下記説明に出てくるIUSRユーザ、 IIS_IUSRSユーザ箇所を
通常ユーザのAdministrator権限ユーザ指定に置き換える
2.IISのコネクションプール詳細設定画面で、アプリケーションプールIDを
  ビルトインアカウントのユーザ指定を、カスタムアカウント指定にし
  1で指定した同じユーザアカウントを指定する作業を追加する。
3.祈りながら、IIS再起動

---------------------------------------------------------------------------------------------------------------

Pywin32をIIS上で動作させようとしたら、エラーとなった。
意外とネット上に方法が記載されていなくて苦労したので
自分の備忘録としても記載。

Django付属のAPPではうまく動作していたのに、
IIS上では動作しなかった。
Pywin32は、COMを利用しているため、
IISからこいつを動かそうとなるとセキュリティ周りの設定が必要。
ちょっと作業的に蛇足もあると思うがとりあえず下記設定で動いた。

【動作確認済み(2020年07月頃環境】
Windwos10(64bit) + Django2.2 + Excel2016(64bit) + Python3.7.5(64bit)
Windwos2019 Server(64bit) + Django2.2 + Excel2016(32bit) + Python3.7.5(32bit)
Windwos2012R2 Server(64bit) + Django2.2 + Excel2016(32bit) + Python3.7.5(32bit)
Windwos2019 Server(64bit) + Django2.2 + Excel2016(64bit) + Python3.7.5(64bit)
Pythonと Excelのbit は合わせておいた方が良いはず。
(違うパターンは確認してない)
※Office365のExcel(64bit)でも動作しました。設定方法はだいたい同じ。



【前提】
IIS+Djangoの連携は出来ている状態

【作業1】
ディレクトリの作成
Excel2016の場合、ユーザが利用するフォルダが作成されていないらしくそれを作成する。
Excel64bit と 32bitで異なるらしいが面倒なので両方作っとく。

C:\Windows\System32\config\systemprofile\Desktop\
C:\Windows\SysWOW64\config\systemprofile\Desktop\

【作業2】
上記作成したフォルダに下記ユーザのアクセス権限をフルコントロールに設定する
1. IUSRユーザ
2. IIS_IUSRSユーザ

【作業3】
DCOMレジストリアクセス権限設定

1. コンポーネントサービスを起動する
 「ファイル名を指定して実行」
  mmc.exe comexp.msc /32
  参考

2.ExcelのDCOMセキュリティを変更する

 (1) DCOMの構成配下のMicrosoft Excel Application を選択する
WS000052.JPG

 (2) 右クリックでプロパティを表示、セキュリティタブを選択する

  A. 起動とアクティブ化のアクセス許可変更
    カスタマイズを選択し、編集ボタンをクリック
    追加ボタンクリックして、下記ユーザを追加

    a. IUSRユーザ
    b. IIS_IUSRSユーザ

    アクセス許可は、下記を許可する
    a. ローカルからの起動
    b. ローカルからのアクティブ化

  WS000056.JPG


  B. アクセス許可変更
    A.と同じようなことをやる
  C. 構成のアクセス許可
    A.と同じようなことをやる


(3)もしうまく行かなかった場合は、2(1)(2)の作業を下記(4)(5)(6)に切替える
(4) コンピュータのマイコンピュータを右クリックしてプロパティを表示し、
  COMセキュリティタブを選択する

WS000057.JPG


(5) アクセス許可の変更を行う
  A. 制限の編集ボタンクリックし、追加ボタンクリックし
    下記ユーザを追加する。
    a. IUSRユーザ
    b. IIS_IUSRSユーザ

  B. 上記方法だと全てのWebアプリからアクセス出来るようになり、
    セキュリティ上あまり良くないと思われる場合は、Excelを利用する
    IISのアプリケーションプールを限定として指定する事も可能
    例えば、DefaultAppPoolを指定したい場合は、下記のようにしていする。

    IIS APPPOOL\DefaultAppPool

    アクセス許可は、下記を許可する
    a. ローカルアクセス

WS000058.JPG


 (6) 起動とアクティブ化のアクセス許可の変更を行う
   (5) を参考に同じように設定する。

3.IISのアプリケーションプール設定変更
 (1) 今回Excelを利用するサイトのアプリケーションプールを選択し詳細設定を表示する
   A. 32ビットアプリケーションの有効化
     お約束で、自分の環境(PythonとかExcelとか)が32bitであれば、Trueに設定する
   B. ユーザプロファイルの読み込み
     Trueに設定する*ここポイント

WS000059.JPG


IISを再起動すれば、IIS+Django+Pywin経由でExcel操作が可能となります。

【最後に】
Excelって複数のVBAが同時に動作するとあまりうまく動作しないのは
みなさん経験があると思います。
Web経由でExcelを動作させるという事は、マルチスレッド起動される可能性が
あるため当然正しく動作しない。
なので、Excel動作する部分は、シングルスレッドで動作するような工夫が必要です。

まぁそもそも、Microsoft自体が、DCOMをIIS上で利用するのは保証していませんので、
Pywinではなく、openpyxlや他のライブラリを利用した方が無難です。
自分は、画像ファイルが貼り付けられているExcelを操作したり、
ExcelをPDF化したかったのでPywinを利用したけど。。。
もし同じような事で困っている方の助けになれば幸い。
だけど保証はしないです。












タグ:Django IIS Pywin
nice!(0)  コメント(0) 
共通テーマ:パソコン・インターネット

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。