Windows Azure で Application Pool の動作アカウントを変更したい

結論から書きます。

Windows AzureのWebRoleでFull IIS利用時、Application Poolの動作アカウントを変更したい場合ロールが起動してIISの構成が終わった後で設定しないと変更したように見えません。

例えば!こんな感じのスタートアップタスクを用意してアイドルタイムアウトを無期限にするとします。

%windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.processModel.idleTimeout:00:00:00

何してるかというと、アプリケーションプールの既定値の設定を変更してますね。(applicationPoolDefaultsに対して設定してる)
SMarxもやってる安心・信頼の方法(大げさ

このタスクをSimple等でロール起動前に実行されるようにしておけば、この後構成されるWebアプリケーションは既定値を使用して構成されるので、うまく動作するという塩梅です。

でここでのポイントですがApplication Poolの動作アカウントです。この値は既定値を変更しても必ず「Network Service」になります。

なぜか。

Role起動時に、Windows Azure側が明示的にNetwork Serviceに設定してるから。
Role起動時にどんなIISの設定が行われているかはログ見れば載ってます。

ログファイルは Windows Azure上の C:\Resources\temp\<GUID>.<Role名>\RoleTemp\IISConfigurator.log です。

ログ例:
<省略>
IISConfigurator Information: 0 : [04/11/11 09:21:42.03] Added app pool e1b2840a-aae4-4348-a153-b5431ef16442 with process identity NetworkService
IISConfigurator Information: 0 : [04/11/11 09:21:42.12] Created sites and app pools
IISConfigurator Information: 0 : [04/11/11 09:21:42.15] Setting up directory C:\Resources\directory\<GUID>.<RoleName>.DiagnosticStore\LogFiles for site Web with site id 1273337584.
IISConfigurator Information: 0 : [04/11/11 09:21:42.15] Acling directory C:\Resources\directory\<GUID>.<RoleName>.DiagnosticStore\LogFiles sid S-1-5-85-991122651-1783296284-173557618-3891677893-4285667009.
IISConfigurator Information: 0 : [04/11/11 09:21:42.15] Preventing directory C:\Resources\directory\<GUID>.<RoleName>.DiagnosticStore\LogFiles from deletion by S-1-5-85-991122651-1783296284-173557618-3891677893-4285667009.
IISConfigurator Information: 0 : [04/11/11 09:21:42.15] Setting up iis logs folder under root folder C:\Resources\directory\<GUID>.<RoleName>.DiagnosticStore\LogFiles\Web
IISConfigurator Information: 0 : [04/11/11 09:21:42.15] Setting up directory C:\Resources\directory\<GUID>.<RoleName>.DiagnosticStore\FailedReqLogFiles for site Web with site id 1273337584.
IISConfigurator Information: 0 : [04/11/11 09:21:42.15] Acling directory C:\Resources\directory\<GUID>.<RoleName>.DiagnosticStore\FailedReqLogFiles sid S-1-5-85-991122651-1783296284-173557618-3891677893-4285667009.
IISConfigurator Information: 0 : [04/11/11 09:21:42.15] Preventing directory C:\Resources\directory\<GUID>.<RoleName>.DiagnosticStore\FailedReqLogFiles from deletion by S-1-5-85-991122651-1783296284-173557618-3891677893-4285667009.
IISConfigurator Information: 0 : [04/11/11 09:21:42.15] Setting up failed request logs under folder C:\Resources\directory\<GUID>.<RoleName>.DiagnosticStore\FailedReqLogFiles\Web
IISConfigurator Information: 0 : [04/11/11 09:21:42.21] Setting up machine keys for site <RoleName>_IN_0_Web
IISConfigurator Information: 0 : [04/11/11 09:21:42.36] Add access for appPool e1b2840a-aae4-4348-a153-b5431ef16442 to runtime api instance <RoleName>_IN_0 for SID
IISConfigurator Information: 0 : [04/11/11 09:21:42.50] Add access for appPool e1b2840a-aae4-4348-a153-b5431ef16442 to site directory E:\approot for SID
IISConfigurator Information: 0 : [04/11/11 09:21:42.50] Adding access to IUSR to path E:\approot
IISConfigurator Information: 0 : [04/11/11 09:21:42.62] Added access to account IUSR to phyiscal path: E:\approot
IISConfigurator Information: 0 : [04/11/11 09:21:42.62] Adding access to App Pool account:S-1-5-20
IISConfigurator Information: 0 : [04/11/11 09:21:42.67] Added access to account S-1-5-20 to phyiscal path: E:\approot
IISConfigurator Information: 0 : [04/11/11 09:21:42.67] Add access to NetworkService to web.config
IISConfigurator Information: 0 : [04/11/11 09:21:42.67] Deploy Complete
IISConfigurator Information: 0 : [04/11/11 09:21:42.67] Add read access to runtime base dir
IISConfigurator Information: 0 : [04/11/11 09:21:42.67] Adding access to IIS_IUSRS to E:\base
IISConfigurator Information: 0 : [04/11/11 09:21:42.67] Added access to IIS_IUSRS to physical path E:\base
IISConfigurator Information: 0 : [04/11/11 09:21:42.67] Wait for all sites to be setup in IIS
IISConfigurator Information: 0 : [04/11/11 09:21:42.70] Wait for all sites and apppools to be ready
IISConfigurator Information: 0 : [04/11/11 09:21:42.76] Site <RoleName>_IN_0_Web found with state Started
IISConfigurator Information: 0 : [04/11/11 09:21:42.76] AppPool e1b2840a-aae4-4348-a153-b5431ef16442 found with state Started
IISConfigurator Information: 0 : [04/11/11 09:21:42.76] AppPool e1b2840a-aae4-4348-a153-b5431ef16442 ready
IISConfigurator Information: 0 : [04/11/11 09:21:42.78] All sites and appPools ready
[EOF]

まぁセキュリティ的にはそうしたほうがいいし、理屈はわかりますが困るケースもあります。
(例えばWindows Azure Connectを使ってIntranet上のリソースにネットワークアクセスしたい場合とかKerberos認証したい場合とか他いろいろ)

えーじゃぁどうするんだよーという話ですが、簡単にいうと、Role起動後に(NetworkServiceにされた後に)上書きしちゃえばいいわけですね。

スタートアップタスクの動作モードをbackgroundにして処理が止まらないようにしておいて、以下のようなコマンドを実行させます。

@echo off

:SETAPPPOOL
%windir%\system32\inetsrv\appcmd.exe list apppool > apppoollist.txt
FOR /f "tokens=2 delims= " %%a in (apppoollist.txt) DO (
    IF %%a==^"Classic (
        echo %%a
    ) ELSE IF %%a==^"ASP.NET (
        echo %%a
    ) ELSE (
		%windir%\system32\inetsrv\appcmd.exe set apppool %%a /processModel.identityType:SpecificUser /processModel.userName:youraccount /processModel.password:yourpassword
        goto END
    )
)
ping localhost -n 10 > nul
goto SETAPPPOOL
:END

Application Poolの名称がClassicだったりASP.NETじゃない奴を無条件で上書きしてます。
※Web RoleはGUIDで毎回異なる名前でApplication Poolを作成します。
※設定が完了するまで無駄にPing打って間隔あけて延々ループさせてます\(^o^)/オワタ
※もちろんこのコマンドの前に動作対象のユーザーアカウントは作成しておいてください。またログやTempフォルダ等、通常IISConfiguratorが行ってる権限回りの設定等もクリアする必要があります。
※ちなみにRDP用のユーザーを指定するとAdministratorなので権限まわりはクリアできますが。。。

なんという無理やり感!美しくないバッチ!ほんとはちゃんとアプリ組んで、そのアプリを動かしたほうがいいのでしょうけど。

まぁ、何かの参考にでもなれば。というか誰得なネタですねぇ。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中