PowerShell
IIS
WindowsServer
MSDeploy

IISのサイト作成とWebDeployのアクセス許可の自動化

IISは設定をGUIでポチポチ設定できるのは難易度低くて利点ですが、同じ設定を繰り返し行う需要が出てくると面倒臭いです。こんな誰がやっても同じ作業で徒労感は辛いし無用にミスが生まれるし…。

そこでIISの設定を操作できるappcmdを利用し、PowerShellで一発で設定できるようにしましょう。
今回はサイト作成とWebDeployのアクセス許可を一括で行います。

手動での設定はこちらの記事がわかりやすいです。この記事にある「Web 配置による発行の有効化」がアクセス許可の設定で、許可対象のサイトの作成とこれを自動で行うのがこの記事の主旨です。

前提条件

実際に試した環境はIISのバージョンは8。WebDeployはv3.5。
上記の記事と同じくwebdeployという名前の専用ユーザをIIS マネージャー ユーザーから作成しており、これを使用してWebDeployを行います。

基本戦略

  • IISサイトの作成
    • アプリケーションプールを作成
    • サイトを作成
  • webdeployユーザのアクセス許可
    • IISサイトのユーザ許可
    • サイトの物理パスへのフルコントロール付与

コード

# 設定
$sites = @(
    ("site1", "C:\site\site1"),
    ("site2", "C:\site\site2"),
    ("site3", "C:\site\site3")
)
$username = "webdeploy"
foreach($site in $sites) {
    $sitename = "$($site[0]).example.jp"
    $bind = "http://$($site[0]).example.jp:80"
    $dir = $site[1]

    # 物理パスのフォルダ作成
    New-Item $dir -itemType Directory -Force

    # サイト作成
    & "C:\Windows\System32\inetsrv\appcmd.exe" add apppool /name:"$sitename"
    & "C:\Windows\System32\inetsrv\appcmd.exe" add site /name:"$sitename" /bindings:"$bind" /physicalPath:"$dir"
    & "C:\Windows\System32\inetsrv\appcmd.exe" set app "$sitename/" /applicationPool:"$sitename"

    # IISサイトのユーザ許可
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Web.Management")
    [Microsoft.Web.Management.Server.ManagementAuthorization]::Grant($username, $sitename, $FALSE)

    # 物理パスのフォルダのアクセス許可
    $Acl = Get-Acl $dir
    $Ar = New-Object System.Security.AccessControl.FileSystemAccessRule @("LOCAL SERVICE", "FullControl", "ContainerInherit, ObjectInherit", "None", "Allow")
    $Acl.AddAccessRule($Ar)
    Set-ACL $dir -AclObject $Acl
}

細かい点

  • add siteだけだとアプリケーションプールがデフォルトになる
    • 一応「サイトの追加」と動作を揃えるためにアプリケーションプールを別作成
  • 「Web 配置による発行の有効化」は以下の二つをやっているのでそれを再現
    • IISサイトのwebdeployユーザのアクセス許可
    • 物理パスのフォルダのアクセス許可(フルコントロール)
  • 物理パスは/(スラッシュ)で区切るとアクセスできない

参考

https://heavymetaldev.com/iis-web-deploy-permissions
こちらのコードをコピーして動かなかったのでそこを書き直してます。