IISのWebDAV設定をpowershellでやってみた

# はじめに
IISのWebDAVの設定をGUIを使用せずにスクリプトで自動化できないかというお話があり、私が調査することになりました。
そのときの調査結果を載せておきます。
※**「WebDAV 発行」**のWindows機能が有効化されている前提でのお話となります。
※実行環境は**Windows Server 2012 R2**です。

# WebDAVの設定スクリプト
お急ぎの方を考慮し、先にスクリプト載せておきます。
powershellを管理者権限で起動し、以下のスクリプトを流せばOKです。
**※変数の設定値は環境等に合わせて変更してください。**

```powershell:SetWebDAV.ps1
# WebDAVを設定したいIIS上のWebSite名
$webSiteName = "Default Web Site"
# 仮想ディレクトリ名
$virtualDirName = "webDAVTest"
# 仮想ディレクトリの物理パス
$virtualDirPath = "C:\test\$virtualDirName"

# WebDAV オーサリング規則の設定値
# 「アクセスの許可」
# すべてのコンテンツは「*」、指定する場合は「*.bas」等
$wdPath = "*"

# 「このコンテンツへのアクセスを許可する」
# すべてのユーザーは「*」、指定されたユーザーは任意のユーザーアカウントを入力
$wdUser = "testUser"

# 「アクセス許可」
# 読み取り：Read、ソース：Source、書き込み：Write
# 複数指定する場合は、以下のようにカンマ区切りとします
$wdAccess = "Read,Source,Write"

# WebDAV用の物理フォルダ作成
if(!(Test-Path $virtualDirPath)){
    New-Item -Path $virtualDirPath -ItemType Directory
}

# IISに仮想ディレクトリの作成
New-WebVirtualDirectory -Name $virtualDirName -PhysicalPath $virtualDirPath -Site $webSiteName

# WebDAVの有効化
Set-WebConfigurationProperty -Filter '/system.webServer/webdav/authoring' -Location $webSiteName -Name enabled -Value True

# WebDAVのオーサリング規則の設定
$accessRule = @{users = $wdUser; roles = $role; path = $wdPath; access = $wdAccess}
Add-WebConfigurationProperty -Filter '/system.webServer/webdav/authoringRules' -Location $webSiteName -Name '.' -Value $accessRule -Verbose
```

# 仮想ディレクトリの権限変更スクリプト
仮想ディレクトリの権限変更が必要な場合があるかと思います。
その場合のスクリプトも載せておきます。
※例として、Windows認証、基本認証、匿名認証を載せておきます。

```powershell:ChangeAuthentication.ps1
# 対象のIIS上WebSite名
$webSiteName = "Default Web Site"
# 対象の仮想ディレクトリ名
$virtualDirName = "webDAVTest"
# Windows認証　有効化
Set-WebConfigurationProperty -Filter '/system.webServer/security/authentication/windowsAuthentication' -Location "$webSiteName/$virtualDirName" -Name enabled -Value True
# 基本認証 有効化
Set-WebConfigurationProperty -Filter '/system.webServer/security/authentication/basicAuthentication' -Location "$webSiteName/$virtualDirName" -Name enabled -Value True
# 匿名認証 無効化
Set-WebConfigurationProperty -Filter '/system.webServer/security/authentication/anonymousAuthentication' -Location "$webSiteName/$virtualDirName" -Name enabled -Value False
```

# スクリプトの内容説明
せっかくなので、上記スクリプトに登場したコマンドの説明をしてみたいと思います。
この内容が理解できればWebDAVの設定に限らず、IISの設定は基本的にpowershellで行うことが可能であることがおわかりいただけるかと思います。

####・Test-Pathコマンド
ディレクトリの存在確認を行うためのコマンドです。
```Test-Path [存在確認したいディレクトリパス]```

####・New-Itemコマンド
ディレクトリやファイルを新規作成するためのコマンドです。
```New-Item -Path [新規作成したいディレクトリパス] -ItemType Directory```
これでディレクトリを作成できます。
※ディレクトリが既存の場合はエラーとなるため、必ずTest-Pathコマンドと組み合わせて使用すること。

####・New-WebVirtualDirectoryコマンド
IIS上のサイトに仮想ディレクトリを作成するためのコマンドです。
```New-WebVirtualDirectory-Name [仮想ディレクトリ名] -PhysicalPath [仮想ディレクトリとする物理パス] -Site [IIS上のWebサイト名]```
これで仮想ディレクトリが作成できます。

####・Set-WebConfigurationPropertyコマンド
IIS上の機能の詳細設定を行うためのコマンドです。
```Set-WebConfigurationProperty -Filter [対象のFilter] -Location [IIS上のWebサイト名] -Name [プロパティ名] -Value [設定値]```　
これを使いこなすことができれば、大半の設定は行えると思います。
-Location、-Name、-Valueについては大体想像ができると思いますが、-Filterって何ぞや！？ってなりませんか？私はなりました(笑)
-Filterに限らずですが、「Location」とか「Filter」って一体何に合致しているかというと、「applicationHost.config」の中身を見ればわかります。
※「applicationHost.config」は「C:\Windows\System32\inetsrv\config」にあります。

今回のWebDAVの設定の中で、WebDAVを有効にするというコマンドがありました。
```Set-WebConfigurationProperty -Filter '/system.webServer/webdav/authoring' -Location $webSiteName -Name enabled -Value True```
ここで記述している「'/system.webServer/webdav/authoring'」ってどこから来ているかを実際に探してみると、以下のような箇所が見つかると思います。

```applicationHost.config
<location path="Karteless Web Site">
    <system.webServer>
        <webdav>
           <authoring enabled="true" />
        </webdav>
    </system.webServer>
</location>
```

※もし見つからない場合は、GUIで一回実施したい設定を行ってみると良いです。
　該当する項目が出てくるはずです。

これを見れば大体わかると思いますが、

+ -Locationに設定する値はlocationタグのpathプロパティ
+ -Filterはlocationタグ内の対象プロパティまでのルート
+ 
を表していることがわかります。

まとめるとこのようになります。

+ -Locationに設定する値でlocationタグを特定
+ -Filterに設定する値でどのプロパティのタグかを特定
+ -Nameで属性名を特定
+ -Valueで設定値を決定

# おまけ
私の場合は、batファイルを叩けばpowershellのスクリプトを管理者権限で実行してくれるようなツールの作成が求められました。
よって、実際にはps1の拡張子ファイルは用意せず、全てbatファイルに記載する形となりました。
※以下のサイトから引用させていただきました。
■PowerShellをバッチから管理者権限で動かす
https://vogel.at.webry.info/201707/article_9.html

```bat:SetWebDAV.bat
@(echo '> NUL

echo off)

NET SESSION > NUL 2>&1

IF %ERRORLEVEL% neq 0 goto RESTART

setlocal enableextensions

set "THIS_PATH=%~f0"

set "PARAM_1=%~1"

PowerShell.exe -Command "iex -Command ((gc \"%THIS_PATH:`=``%\") -join \"`n\")"

exit /b %errorlevel%

:RESTART

powershell -NoProfile -ExecutionPolicy unrestricted -Command "Start-Process %~f0 -Verb runas"

exit

') | sv -Name TempVar

# 以下にpowershellのスクリプトを記述します
$webSiteName = "Karteless Web Site"

~ 以下省略 ~
```

# おわりに
powershellの知識が乏しく、ネットの情報も少なかったので結構苦労しました。。。
ただ普段の業務では全く触れない領域の知識であったため、調査する機会をいただけてよかったと思っています。

# 参考
■Powershell and IIS - Setting WebDAV rules
https://www.reddit.com/r/PowerShell/comments/57bxzd/powershell_and_iis_setting_webdav_rules/