Sandbox を有効活用しよう

# Sandbox を有効活用しよう
Windows 10 Pro で使えるSandbox。皆さん使ってますか？
Sandbox の使用目的としてよく上げられるのが**得体のしれないソフトとか試すときに、安全に試せるよ～**というモノですが、それだけじゃなくて他にも便利な使い方がありそうです。
## Sandbox の使い道
怪しいソフトを検証する以外にも、以下の様な使い道が考えられます。
* Python のコードを複数のバージョンで検証<br />仮想環境を作るのも良いかもですが、Sandboxで完全に分離した環境で試せます
* ライセンスサーバの更新後に、アプリが起動するかの確認<br />複数のバージョンに対応したライセンスサーバの場合、それぞれのバージョンで確認するため、環境を揃えるの大変

というシチュエーションの時に便利です。
## Sandbox で、ホストからファイルを受け取りたい
得体のしれないソフトを試す、という目的の為か、Sandbox は通常下記の様な形で動作します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2555080/09f97fa0-9718-12a0-34f2-cb808b07ae39.png)
インターネット上に落ちてるツールを試したいという事なら良いでしょうが
* ツールが外部ネットから自由にダウンロード出来るものではない
* ツール自体は外部ネットから落とせるが、検証したいファイルはホストPC、又はイントラ上にある

ということも良くある話です。
そういった場合は、下記の様なファイルを用意すると便利です。
```xml:wsb ファイル
<Configuration><VGpu>Default</VGpu>
    <MappedFolders>
        <MappedFolder>
            <HostFolder>ホストPC側の共有したいフォルダ</HostFolder>
            <ReadOnly>true</ReadOnly>
        </MappedFolder>
    </MappedFolders>
    <LogonCommand>
        <Command></Command>
    </LogonCommand>
</Configuration>
```
`<ReadOnly>true</ReadOnly>`を`<ReadOnly>false</ReadOnly>`に変える事で、Sandbox側から書き込み可能な状態になります。
怪しいソフトを確認する場合は`true`にすべきですが、素性の分かっているソフトの動作確認なら`false`でもよいでしょう。
例えば、画像加工ツールなどの動作確認で、加工結果の確認はホスト側のアプリで行いたい、という事もあるでしょう。

この内容のテキストファイルを、拡張子「wsb」で保存し、そのファイルをダブルクリックする事で、`ホストPC側の共有したいフォルダ`がSandbox 仮想PCのデスクトップに現れます。
これで、Sandbox PC ⇔ ホストPC のファイル共有が出来ました。先の図で言うと、右側の「**<font color="red">×</font>**」が無くなった状態です。
## イントラ上のライセンスサーバにアクセスしたい
イントラネット上にあるライセンスサーバにアクセスして、ソフトの動作確認を行いたいという事もあるでしょう。
あるいは、イントラ上のNASにあるファイルにアクセスしたいとか。
そういった場合は、下記の様に`<Networking>Enable</Networking>`を加えると良いです。
```xml:wsb ファイル
<Configuration><VGpu>Default</VGpu>
    <Networking>Enable</Networking>
    <MappedFolders>
        <MappedFolder>
            <HostFolder>ホストPC側の共有したいフォルダ</HostFolder>
            <ReadOnly>true</ReadOnly>
        </MappedFolder>
    </MappedFolders>
    <LogonCommand>
        <Command></Command>
    </LogonCommand>
</Configuration>
```
これで、Sandbox PC ⇔ イントラネット 間の接続が可能になります。最初の図で言うと、左側の「**<font color="red">×</font>**」が無くなった状態です。
## 番外編(大きな声じゃ言えないけれど)
出先のネットワークに接続した状態で、家のVPNに接続すると、下図の様に出先のイントラネットに接続できなくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2555080/daeb3bc9-10a5-a620-14e4-47e274e9e184.png)
そこで、Sandboxを起ち上げて、Sandboxから自宅にVPNを張れば、下図ののような形になりホストPCからイントラにアクセスできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2555080/4ddd14d9-749e-9198-a84b-2d3a877f2116.png)
ただし、Sandbox は起ち上げる度に初期化された状態で立ち上がるため、VPN接続設定を毎回しなければなりません。
## VPN接続設定を、バッチ(&PowerShell)で作成する
Sandbox 直接関係ないじゃん、という突込みは無しで
VPN接続設定をPowerShell & バッチファイルで作成しちゃおうという話
接続方法は、L2TP/IPSec です。
```powershell:VPN 接続設定を作成
$VpnName = "接続設定名"
$VpnUrl = "VPN接続先のURL(IPアドレスでも可)"
$PreKey = "事前共有キー"

$RasExec = "C:\windows\system32\rasdial.exe"
$VpnUser = "サインインユーザー名"
$VpnPass = "サインインパスワード"

#Remove Vpn Adaptor
#Remove-VpnConnection -Name $VpnName -Force -PassThru

#Create VPN Adaptor
Add-VpnConnection -Name $VpnName `
                  -ServerAddress $VpnUrl `
                  -RememberCredential -L2tpPsk $PreKey `
                  -AuthenticationMethod CHAP,MSChapv2 `
                  -EncryptionLevel Optional `
                  -TunnelType L2tp `
                  -Force

#Add User & Pass
cmd.exe /c $RasExec $VpnName $VpnUser $VpnPass

#Disconnect
cmd.exe /c $RasExec /Disconnect
```
`-EncryptionLevel Optional`の部分は
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2555080/c6dcb7d0-31db-cf2d-a3fd-e099bc1d8a66.png)
の指定箇所です。
* 暗号化しない → NoEncryption
* 暗号化は省略可能 → Optional
* 暗号化が必要 → Required
* 最強の暗号化 → Maximum

を指定します。

`-AuthenticationMethod CHAP,MSChapv2`は、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2555080/b6e8452d-cc27-3efb-ba0b-3a130c5d6b51.png)
の箇所です。
* Pap
* Chap
* MSChapv2
* Eap
* MachineCertificate

を指定できます。複数指定する場合は、前述の記載の様に、カンマで区切ります。
この辺の設定は、VPN接続先の設定に合わせて下さい。

上記の様にして作成したシェルスクリプトファイルを、下記の様なバッチで実行します。

```dosbatch:PowerShell のシェルスクリプト？を起動するバッチ
powershell -NoProfile -ExecutionPolicy Unrestricted シェルスクリプトファイルパス
```
これで、VPN接続設定が作成されます。
Sandbox を起動した後、このバッチを動かせば、VPN接続設定が作成されるので、それを使用してVPN接続すればOK。
# Hyper-V の仮想環境で良いんじゃね？
ちょっと試すためだけに、OSのライセンスを用意するのは、どうかと思う訳ですよ。
開発環境でSDKマンセーの人には、関係ないかもですが。