PowerShellでIISの操作をしていたらサイトの自動開始設定がちょっとめんどくさかった。
環境は Windows 7, PowerShell 4.0 です。
Web Administration モジュールだとうまくいかない......
Web Administration モジュールにあるコマンドレットを使えばIISの操作は何でもできるもんだと……そう思ってました。
とりあえずWebサイトのプロパティとメソッドを見てみると
PS > Get-Website -Name "Default Web Site" | Get-Member
TypeName: Microsoft.IIs.PowerShell.Framework.ConfigurationElement#site
Name MemberType Definition
---- ---------- ----------
Start CodeMethod void Start()
Stop CodeMethod void Stop()
...
GetAttributeValue Method System.Object GetAttributeValue(string attributeName)
...
SetAttributeValue Method void SetAttributeValue(string attributeName, System.Object value)
...
serverAutoStart NoteProperty System.Boolean serverAutoStart=False
...
なんだか "serverAutoStart" とかいうそれっぽいのがいるけど "NoteProperty" なので直接設定するのはダメそう。
でも "SetAttributeValue" があるじゃん! と嬉しくなりやってみると怒られる。
PS > (Get-Website -Name "Default Web Site").SetAttributeValue("serverAutoStart", $True)
"2" 個の引数を指定して "SetAttributeValue" を呼び出し中に例外が発生しました: "構成オブジェクトは、ServerManager.CommitChanges() の呼び出しによってコミットされたため、読み取り専用になっています。書き込みアクセスが必要な場合は、ServerManager を使用して新しい参照を取得してください。"
発生場所 行:1 文字:1
+ (Get-Website -Name "Default Web Site").SetAttributeValue("serverAutoStart", $True)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : InvalidOperationException
"ServerManager" を使えとのことだ。
ServerManager で設定する
ServerManager はデフォルトでは使えないのでアセンブリをインポートする。
PS > [System.Reflection.Assembly]::LoadFrom("$env:systemroot\system32\inetsrv\Microsoft.Web.Administration.dll")
PS > $sm = New-Object Microsoft.Web.Administration.ServerManager
PS > $sm.Sites["Default Web Site"].ServerAutoStart = $True
PS > $sm.CommitChanges()
このとき注意しなくてはいけないのは、
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Web.Administration")
のように名前の部分一致でインポートすると IIS Express の ServerManager をインポートしてしまうことがあるので、上記のようにフルパスで指定してあげたほうが安全。
最後のCommitChanges()
も忘れずに。
これでIISのサイトの自動開始設定をPowerShellで変更できました。
んー、なんかせっかく Web Administration モジュールあるのにコマンドレットでバシッと設定できないのだろうか……。