認証proxyを用いる環境設定（Windows PowerShell）

こんにちは。
認証proxyを用いる環境下で、下記向けの各種設定を行う PowerShell 用実行スクリプトを作りました[^0]。

[^0]: なお前もって、PowerShell コマンドライン（管理者権限）上で ExecutionPolicy を設定し、スクリプトを実行可能とする必要があります： ```PS> Set-ExecutionPolicy RemoteSigned```

- System.Net.WebClient 向けの DefaultWebProxy （Invoke-WebRequest コマンドなどが利用）
- 環境変数 $env:http_proxy（wget.exe コマンドなどが利用）
- Chocolatey の動作で用いる環境変数

これを使って今回 [Chocolatey](https://chocolatey.org/packages) をインストールし[^1]、さらに応用例として Tex Live のインストールにも使いました。

内部の ```"<USERNAME>"```, ```"<PASSWORD>"```, ```"<HOSTNAME>:<PORTNUMBER>"``` は書き換えてください。


[^1]: 今回の方法は、前回の「[System.Net.WebClient の認証proxy経由対応（環境変数設定）](http://qiita.com/kkdd/items/e9f0c2961b362fd75a8c)」とは方法を変えました。また、参考：「[認証Proxy経由でのChocolateyの利用](https://qiita.com/tsukamoto/items/099fe6375c3c34404b5b)。

```powershell
PS> .\Set-Proxy
```

```Set-Proxy.ps1
# Encoding::Shift-JIS
$user = "<USERNAME>"
$password = "<PASSWORD>"
$proxyhost = "<HOSTNAME>:<PORTNUMBER>"
$proxyaddress = "http://$($proxyhost)/"
$proxyaddress_with_authenticattion = "http://$($user):$($password)@$($proxyhost)"
$env:http_proxy = $proxyaddress_with_authenticattion
$env:https_proxy = $proxyaddress_with_authenticattion
$env:ftp_proxy = $proxyaddress_with_authenticattion
$password_secure = ConvertTo-SecureString $password -AsPlainText -Force
$creds = New-Object System.Management.Automation.PSCredential $user, $password_secure
$proxy = New-Object System.Net.WebProxy $proxyaddress
$proxy.Credentials = $creds
[System.Net.WebRequest]::DefaultWebProxy = $proxy
```

###### 起動時に自動実行させる

なおこの```Set-Proxy.ps1```の内容を ```$profile``` ファイル内へ書き込めば、PowerShell 起動時に自動実行されます。

```powershell
PS> if (-Not(test-path $profile)) {New-Item -Path $profile -ItemType "file" -Force}
PS> Get-Content Set-Proxy.ps1 | Add-Content $profile -Encoding Default
```

#### Chocolatey インストール
下記の使用例では、Chocolatey を認証proxyを通してインストールしています（PowerShell を管理者権限で実行[^2]）。

[^2]: Windows PowerShell の管理者権限での起動方法は、Windows ボタン（タスクバーの左端）をマウスで右クリックし、起動用メニューから選択し起動する方法がなどがあるようですが、実際に動く方法を見つける必要があるようです（「[PowerShell を管理者権限で起動する方法](https://qiita.com/kkdd/items/f58481debef56d44048d)」）。


```powershell
PS> .\Set-Proxy
PS> .\Install-Chocolatey
PS> choco list -lo
Chocolatey v0.10.3
```

```Install-Chocolatey.ps1
# Encoding::Shift-JIS
set ChocolateyInstall=C:\ProgramData\chocolatey
Invoke-Expression ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))
choco config set proxyUser $user
choco config set proxyPassword $password
choco config set proxy $proxyhost
```

##### 各種プログラム（コマンド）のインストール例

そしてインストールされた Chocolatey を使って、wget （認証proxyに対応）, unzip をインストールしました。

```powershell
PS> choco install -y wget unzip
PS> choco upgrade -y all
```

##### wget コマンド等の確認
インストールした wget, unzip コマンドを確認すると、

```powershell
PS> get-command wget, unzip
CommandType     Name          Definition
-----------     ----          ----------
Application     wget.exe      C:\ProgramData\chocolatey\bin\wget.exe
Application     unzip.exe     C:\ProgramData\chocolatey\bin\unzip.exe
```

#### Tex Live インストール(wget を利用）
下記例では wget と unzip を使って [Tex Live](https://www.tug.org/texlive/acquire-netinstall.html) (installing over the Internet) のインストーラを動かしています[^3]。

[^3]: 参考：「[各種コマンド（wget など）およびアプリケーションソフトを、Chocolatey を利用しインストール（PowerShell）](https://qiita.com/kkdd/items/8e63c45043db313c4389)」

```powershell
PS> wget http://mirror.ctan.org/systems/texlive/tlnet/install-tl.zip
PS> unzip install-tl.zip
PS> .\install-tl-20170618\install-tl-windows.bat -no-gui --no-persistent-downloads
PS> tlmgr update --self --all --no-persistent-downloads
```

#### Invoke-WebRequest, Install-Module などを動かす
Invoke-WebRequest や Install-Module なども、```System.Net.WebClient``` 準拠です。したがって事前に ```.\Set-Proxy``` を動かせば良いです。

##### 明示的に -Proxy で指定 #####
もしくは下記のように明示的に引数で ```-Proxy $proxyaddress -proxyCredential $creds``` を指定しても良いです[^4]。下記は NuGet, PowerShellGet をインストールする使用例です。

```powershell
PS> Invoke-WebRequest -Uri 対象url -OutFile 保存先パス -Proxy $proxyaddress -proxyCredential $creds
PS> Install-PackageProvider -Name NuGet -Proxy $proxyaddress -proxyCredential $creds
PS> Install-Module –Name PowerShellGet  -Proxy $proxyaddress -proxyCredential $creds
PS> Find-Package -Name ... -Proxy $proxyaddress -proxyCredential $creds
```
[^4]: 参考： 「[proxy環境下で、Powershellからwgetする](https://qiita.com/taku_ymgm/items/484de53e6d3e71b8c61e)」 。

#### システム設定（WinInet）による proxy 設定 ####

コマンドによっては、システム（WinInet） の proxy 設定[^5]の方が優先される作りになっています。例えば、

* ```winget``` コマンド

[^5]: これは、いわゆる IE インターネットオプション設定とも呼ばれている設定です。参考：「[Windows10のプロキシ（Proxy）設定を完全削除する為の設定箇所一覧](https://qiita.com/hiren/items/01a26d5a47ff13d623fa)」