IISのインストールとARRのセットアップ


これも理解できない人間がわざわざ理解する必要のないもの
IIS入れてARR入れてルール設定してIP許可設定する一連動作
まあ独自にやる人は理解する必要があるし必要あれば勝手に覚える。

GUIの方法なんてググればいくらでも出てくるが手順書作るよりバッチのが楽。

Microsoft.Web.AdministrationのC#部分は他にいい方法ないか?
まあ楽だし、Powershellは大体使えるだろうしいいか。

これ系では、Windows Management Framework 5.0 OneGetに期待してる。

バッチ部分

@echo off

::バッチの実行パス
cd %~dp0

powershell -NoProfile -ExecutionPolicy Bypass -Command "Add-WindowsFeature Web-Server,Web-IP-Security,Web-Stat-Compression,Web-Dyn-Compression,Web-Http-Logging,Web-Mgmt-Console,Web-Mgmt-Service"

::Web Platform Installerを落とす (MSのURL変わりそうなので注意)
SET webpi=http://download.microsoft.com/download/C/F/F/CFF3A0B8-99D4-41A2-AE1A-496C08BEB904/WebPlatformInstaller_amd64_en-US.msi

powershell -NoProfile -ExecutionPolicy Bypass -Command "Invoke-WebRequest '%webpi%' -OutFile 'WebPI.msi'"

WebPI.msi /quiet

::パスをWeb Platform Installerに回す
cd "C:\Program Files\Microsoft\Web Platform Installer"

WebpiCmd.exe /Install /Products:ARRv3_0 /AcceptEula

::バッチの実行パス
cd %~dp0

@powershell -NoProfile -ExecutionPolicy Bypass -Command "iex -Command ((gc 'ARR設定.ps1') -join \"`n\")"

pause

ARR設定.ps1


$assemblies = (
 'System', 'C:\Windows\System32\inetsrv\Microsoft.Web.Administration.dll'
)

$source = @"
using System;
using Microsoft.Web.Administration;

public static class MyWebAdmin
{
  public static void SetupProxy()
  {
    using (var manager = new ServerManager())
    {
        Console.WriteLine("start setup");
      // ApplicationHostの設定を取得
      Configuration appHostConfig = manager.GetApplicationHostConfiguration();
      // ARRの設定セクションを取得
      ConfigurationSection proxy = appHostConfig.GetSection("system.webServer/proxy");
      // 属性値を設定c1-248?リバース・プロキシ有効化、タイムアウト5秒
      proxy["enabled"] = true;

      // 子要素のcache要素を取得
      ConfigurationElement cache = proxy.GetChildElement("cache");
      // キャッシュを無効化
      cache["enabled"] = false;

      // 設定を有効化
      manager.CommitChanges();
    }//end using
  }//end method

  public static void AddRule(string name, string refRule, string rewriteRule)
  {
    using (ServerManager serverManager = new ServerManager())
    {
      // Default Web Siteの設定を取得
      Configuration config = serverManager.GetWebConfiguration("Default Web Site");

      // URL書き換えルールの設定を取得
      ConfigurationSection rulesSection = config.GetSection("system.webServer/rewrite/rules");
      ConfigurationElementCollection rulesCollection = rulesSection.GetCollection();

      // ルール要素を作成
      ConfigurationElement rule = rulesCollection.CreateElement("rule");
      rule["name"] = name;
      rule["stopProcessing"] = true;

      // どのリクエストURLにマッチさせるかのmatch要素を設定
      ConfigurationElement match = rule.GetChildElement("match");
      match["url"] = refRule;

      // どのURLに書き換えるかのaction要素を設定
      ConfigurationElement actionElement = rule.GetChildElement("action");
      actionElement["type"] = "Rewrite";
      actionElement["url"] = rewriteRule;
      rulesCollection.Add(rule);

      serverManager.CommitChanges();
    }//end using
  }//end method

  public static void AddIpSecurity(string ip)
  {
    using (ServerManager serverManager = new ServerManager())
    {
      // ApplicationHostの設定を取得
      Configuration appHostConfig = serverManager.GetApplicationHostConfiguration();

      // IPセキュリティ設定をDefault Web Siteから取得
      ConfigurationSection section = appHostConfig.GetSection("system.webServer/security/ipSecurity", "Default Web Site");

      // リストにないIPアドレスからのアクセスを拒否
      section["allowUnlisted"] = false;

      //許可ルールを追加
      var elements = section.GetCollection();
      var element = elements.CreateElement("add");
      element["allowed"] = true;
      element["ipAddress"] = ip;
      elements.Add(element);

      //設定を適用
      serverManager.CommitChanges();
    }//end using
  }//end method

}//end class
"@

Add-Type -ReferencedAssemblies $assemblies -TypeDefinition $source -Language CSharp

#プロキシの有効化
[MyWebAdmin]::SetupProxy()
#ARRルールのセット
[MyWebAdmin]::AddRule("aaa", "^aaa/(.*)", "http://localhost:8080/aaa/{R:1}")
#IP許可設定の追加
[MyWebAdmin]::AddIpSecurity("127.0.0.1")
カテゴリー: 運用 タグ: , パーマリンク