Windows10 Creators Update のvagrant Boxをつくる

# Windows 側の準備をする
## Windows ディスクイメージ の準備
[Windows 10 のディスク イメージ (ISO ファイル) のダウンロード](https://www.microsoft.com/ja-jp/software-download/windows10ISO)から[エディションの選択]で[Windows10]を選択してダウンロードする。
## Windows をインストールする
ライセンスキーを入力する。スキップした場合でもいつでも設定からライセンスキーを入力できます。
Microsoft アカウントのログインを求められた時に、左下のオフラインアカウントでのログインをクリック、Microsoft アカウントでログインすると便利だよと言われるので、後でを押す。
ユーザー名とパスワードに"vagrant"を設定（プライベートユーズの場合、任意の名前とパスワードの方が良いかも）
プライバシー設定を全てオフにする
インストールが完了したらWindows Updateを適用して再起動
guest addition をインストールして再起動
## UAC をオフにする
[Win + I] で Windows の設定画面を表示する。
検索窓に"ユーザー アカウント制御"("ユーザー"の後ろに半角スペース)で検索
一番下の通知しないに設定。
コントロールパネルでオフにした後さらにレジストリでもオフにする必要があるので、
[Win + X] -> [A] で管理者としてPowerShellを起動。以下のコマンドを実行

```Powershell
reg add HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System /v EnableLUA /d 0 /t REG_DWORD /f /reg:64
```

再起動する。


WinRMの設定をする。
PowerShellではquickconfigは動いたがそれ以降の`set`でエラーが出たので、コマンドプロンプトに切り替えて行った。PowerShell上で `cmd` と打てば切り替えられる。
以下の `winrm quickconfig -q` の前にトラブルシューティングも参考のこと。

```cmd
winrm quickconfig -q
winrm set winrm/config/winrs @{MaxMemoryPerShellMB="512"}
winrm set winrm/config @{MaxTimeoutms="1800000"}
winrm set winrm/config/service @{AllowUnencrypted="true"}
winrm set winrm/config/service/auth @{Basic="true"}
sc config WinRM start= auto
```

PowerShellからcmdに入った場合は`exit`でPowerShellに戻ってくる

## PowerShellのExecutionPolicyをUnrestrictedにする
```PowerShell
Set-ExecutionPolicy -ExecutionPolicy Unrestricted 
```
`Get-ExecutionPolicy`を実行して"Unrestricted"が返ってきたらOK

設定の検索窓で"リモート"を検索
"このコンピュータへのリモートアクセスの許可"をクリック
[リモートデスクトップ]の[このコンピュータへのリモートアクセスを許可する]にチェックして[ネットワークレベル認証でリモートデスクトップを実行しているコンピュータからのみ接続を許可する]のチェックを外す。

## パフォーマンスの設定
### 視覚効果について設定
[システムのプロパティ]ウィンドウのまま、[システムの保護]タブにアクセス
保護設定が無効になっていることを確認
[詳細設定]タブに切り替え、[パフォーマンス]の[設定]をクリックすると[パフォーマンスオプション]ダイアログが開く
その[視覚効果]タブのチェックボックスでオンにしたりオフにしたり好きなように設定する。
パフォーマンスが気になる場合はアニメーションや影の項目のチェックを外すと良い
私は"コンピュータに応じて最適なものを自動的に選択する"の状態から以下のもののチェックを外した。

- ウィンドウの下に影を表示する
- ウィンドウを最大化や最小化するときにアニメーションで表示する
- コンボボックスをスライドして開く
- デスクトップのアイコン名に影をつける
- ヒントをフェードまたはスライドして表示する
- メニューをフェードまたはスライドして表示する
- メニュー項目をクリック後フェードアウトする

### 仮想メモリについて設定
その[パフォーマンスオプション]ダイアログの[詳細設定]タブに移動し、[仮想メモリ]の[変更]をクリック
※既にダイアログを閉じている場合は設定の検索窓から検索すればすぐに開けるはず
[仮想メモリ]ダイアログが開く
[すべてのドライブのページングファイルのサイズを自動的に管理する]のチェックを外す
[カスタムサイズ]にチェックを入れ、[初期サイズ] [最大サイズ]を共に"1024MB"にして[設定]をクリック[OK]をクリック
再起動

### 拡張子の表示
エクスプローラの[表示] [オプション]から[隠しファイル、隠しフォルダー、および隠しドライブを表示する]にチェック[登録されている拡張子は表示しない]からチェックを外す。

## 容量軽減のための作業
### スタートメニューの整理
スタートメニューにあるタイルを右クリックしてはアンインストールできるものはアンインストールし、できないものはスタートからピン留めを外すをひたすら繰り返す作業
必要に応じてコルタナさんもオフにしましょう。

### ディスククリーンアップを実行する
[SDelete](http://qiita.com/mizutoki79/items/9abc330007a43665670b#sdelete-%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6) をダウンロードして展開しておく（備考を参考のこと）

```cmd
C:\Windows\System32\cleanmgr.exe /d c:
C:\path\to\sdelete64.exe -z C:
```
クリーンアップでは全部選択して削除

## シャットダウンする
光学ドライブや共有フォルダが接続されていないこと、最新のWindows Updateが適用されていることを確認したらゲストOSをシャットダウンする。
以降ホストOSでの作業になる。

# Vagrantfile の作成
```Ruby
# -*- mode: ruby -*-
# vi: set ft=ruby :
 
Vagrant.configure(2) do |config|
  config.vm.box = "Windows10-1703"
  config.vm.guest = :windows
  config.vm.communicator = "winrm"
  config.vm.boot_timeout = 600
  config.vm.graceful_halt_timeout = 600
 
  config.vm.network :forwarded_port, guest: 3389, host: 3389, id: "rdp", auto_correct:true
  config.vm.network :forwarded_port, guest: 5985, host: 5985, id: "winrm", auto_correct: true
  # Port forward SSH
  # config.vm.network :forwarded_port, guest: 22, host: 2222, id: "ssh", auto_correct:true

  config.vm.provider "virtualbox" do |vb, override|
    vb.gui = true
    vb.customize ["modifyvm", :id, "--memory", 2048]
    vb.customize ["modifyvm", :id, "--cpus", 1]
    vb.customize ["modifyvm", :id, "--vram", "256"]
    vb.customize ["setextradata", "global", "GUI/MaxGuestResolution", "any"]
    vb.customize ["setextradata", :id, "CustomVideoMode1", "1024x768x32"]
    # vb.customize ["modifyvm", :id, "--paravirtprovider", "hyperv"]
  end
end
```

# パッケージング
ホストOSにて

```Bash
vagrant package --base VirtualBoxVMName --output /path/to/output/windows10CU.box --vagrantfile /path/to/initial/Vagrantfile
```

`--output`に渡すものはフルパスでも良いがBox名だけでも良い。その場合はカレントディレクトリに生成される。
ディレクトリは勝手に作ってくれないっぽいので、指定したい場合は事前に作ってから実行した方が良い。

# Boxを利用する

```Bash
vagrant box add yourBoxName /path/to/windows10CU.box
```

`vagrant box list`で追加されたことを確認したら、いつも通り利用するディレクトリに移動して

```Bash
vagrant init yourBoxName
vagrant up
```
を実行。VMが追加されて、毎回VirtualBoxのGUIが起動する。
`vagrant rdp`や`vagrant powershell`で接続する。
windows 以外ではrdpクライアントをインストールしておかないと駄目かも。

# 備考
## トラブルシューティング
- はじめ日本語入力が使えなかったので設定の"時刻と言語"→"地域と言語"から日本語のキーボードにMicrosoft IMEを追加し直した。

- `winrm quickconfig` を行った時に
  > このコンピューターのネットワーク接続の種類の 1 つが Public に設定されているため、WinRM ファイアウォール例外は機能しません。 ネットワーク接続の種類を Domain または Private に変更して、やり直してください。

と言われたので
設定から[ネットワークとインターネット]→[イーサネット]→[ネットワーク]→[このPCを検出可能にする]をON

## SDelete について
[SDelete v2.0](https://docs.microsoft.com/ja-jp/sysinternals/downloads/sdelete)

```
使用法: sdelete [-p <回数>] [-s] [-q] <ファイルまたはディレクトリ> ...
sdelete [-p <回数>] [-z|-c] [<ドライブ文字>] ...
-a         読み取り専用の属性を削除します。
-c         空き領域から不要なものを除去します。
-p <回数>  上書きの回数を指定します (既定値は 1 です)。
-q         エラーを出力しないようにします (Quiet モードで実行します)。
-s または -r   サブディレクトリを再起処理します。
-z         空き領域に 0 を設定します (仮想ディスクの最適化に適しています)。
```

# 参考
- [Creating a Windows 10 Base Box for Vagrant with VirtualBox](http://huestones.co.uk/node/305)
- [Creating a Base Box](https://www.vagrantup.com/docs/boxes/base.html)
- [boxcutter/windows](https://github.com/boxcutter/windows)
- [WindowsでVagrantを扱う私的まとめ (運用編)](http://blog.shibata.tech/entry/2015/01/24/134353)