Windows10のプロキシ（Proxy）設定を完全削除する為の設定箇所一覧

# はじめに
Windows10でしてない筈だったプロキシ設定でハマり、プロキシ設定はどこにあるのか調べても、一覧的なものが見当たらなかったので備忘として記します。

※2024/12追記
Microsoft公式からブログが出ていたので、こちらも併せてご参照ください。
[Windows の機能が利用するプロキシ設定とは？ | Microsoft Japan Windows Technology Support Blog](https://jpwinsup.github.io/blog/2024/12/04/Networking/Proxy/Proxy-settings-used-by-Windows-features/)

# バージョン情報
Windows 10 Pro バージョン 1909

# システムのプロキシ設定
## WinInet
Internet Explorerとその関連するコンポーネントでWindows内において共通で使われているもので、どれか一つ設定すれば全て同じ設定になります。

- （windows自体の）スタートメニュー＞設定＞ネットワークとインターネット＞プロキシ
- Google Chrome＞Google Chromeの設定＞設定＞詳細設定＞システム＞パソコンのプロキシ設定を開く
- Microsoft Edge(Chromium)＞設定など＞設定＞システム＞コンピューターのプロキシ設定を開く
- Internet Exploror(11)＞ツール＞インターネットオプション＞接続＞LAN の設定＞プロキシ サーバー
- レジストリ エディター＞[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
※レジストリ設定はログオフ＆ログオン等しないと即時反映はされないようです。

### 参考
[Microsoft Windows Internet - Wikipedia](https://ja.wikipedia.org/wiki/Microsoft_Windows_Internet)
[レジストリ ファイルを使用してクライアントのプロキシ サーバー設定を構成する方法](https://support.microsoft.com/ja-jp/help/819961/how-to-configure-client-proxy-server-settings-by-using-a-registry-file)

## WinHTTP
WinInetからサーバとしての利用を考慮したHTTP専用のコンポーネントで、Windows Update等で利用されています。

コマンドプロンプトを管理者として実行して、以下のコマンドで設定します。

```console:コマンドプロンプト
C:\Windows\system32>netsh
netsh>winhttp

# 現在の設定内容を表示
netsh winhttp>show proxy

現在の WinHTTP プロキシ設定:

    直接アクセス (プロキシ サーバーなし)。

# プロキシ設定を行う
netsh winhttp>set proxy http://192.168.0.1:80

現在の WinHTTP プロキシ設定:

    プロキシ サーバー:  http://192.168.0.1:80
    バイパス一覧     : (なし)

# プロキシ設定をリセットする
netsh winhttp>reset proxy

現在の WinHTTP プロキシ設定:

    直接アクセス (プロキシ サーバーなし)。

```

### 参考
[winhttp proxyの設定とその周辺事情](https://kojikoji75.hatenablog.com/entry/2018/04/21/112920)
[WinHTTP（Windows HTTP Services）とは - IT用語辞典 e-Words](http://e-words.jp/w/WinHTTP.html)
[グループ ポリシーを使用して、WinHTTP プロキシ設定を Windows クライアントに適用する](https://support.microsoft.com/ja-jp/help/4494447/use-group-policy-to-apply-winhttp-proxy-settings-to-clients)
[WinHTTPプロキシの設定方法](http://www.maruko2.com/mw/WinHTTP%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E3%81%AE%E8%A8%AD%E5%AE%9A%E6%96%B9%E6%B3%95)

# 環境変数
環境変数にプロキシ設定をしておくと、デフォルトで環境変数を参照するソフト等にて共通の設定が適用できます。

コントロール パネル＞システムとセキュリティ＞システム＞システムの詳細設定＞詳細設定＞環境変数

CUIで設定する場合、Windows PowerShellを管理者として実行して、以下のコマンドで設定します。


```powershell:PowerShell
# システム環境変数のhttps_proxy変数の設定内容を取得
PS C:\Windows\system32> [Environment]::GetEnvironmentVariable("https_proxy","Machine")
https://192.168.0.1:80/

# ユーザー環境変数のhttps_proxy変数の設定内容を取得
PS C:\Windows\system32> [Environment]::GetEnvironmentVariable("https_proxy","User")
# 未設定の場合は何も出力されない

# システム環境変数のhttps_proxy変数を削除する
PS C:\Windows\system32> [Environment]::SetEnvironmentVariable("https_proxy", "", [System.EnvironmentVariableTarget]::Machine)

# ユーザー環境変数のhttps_proxy変数に値を設定する
PS C:\Windows\system32> [Environment]::SetEnvironmentVariable("https_proxy", "https://192.168.0.1:80/", [System.EnvironmentVariableTarget]::User)
```

### 参考
[環境変数を取得する](https://dobon.net/vb/dotnet/system/getenvironmentvariable.html)

# 各使用ソフトウェアの設定
ここはwindowsの設定ではないのでおまけです。以下にも色々纏まってました。
[日々プロキシで苦しむ人の為のプロキシ設定まとめ](https://qiita.com/uzresk/items/bc7c4a9dc764390cd5ce)

### PowerShell
PowerShellでHttpやFtpのWebリクエストを行う際にIEエンジンを使用する為、デフォルトではWinInetを参照します。
ただし、[WebRequest クラス](https://docs.microsoft.com/ja-jp/dotnet/api/system.net.webrequest?view=net-5.0)の[DefaultWebProxy プロパティ](https://docs.microsoft.com/ja-jp/dotnet/api/system.net.webrequest.defaultwebproxy?view=net-5.0)にProxyを設定すると、WinInetの設定より優先して参照します。
この設定はPowerShellのウィンドウを閉じると初期化されます。

```powershell:PowerShell
PS C:\Windows\system32> Invoke-WebRequest https://www.google.com -UseBasicParsing


StatusCode        : 200
StatusDescription : OK
Content           : <!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="ja"><head><meta conten
                    t="世界中のあらゆる情報を検索するためのツールを提供しています。さまざまな検索機能を活用して、お探し
                    の情報を見つけてください。" name="description"><meta content="n...
~(中略)~
ParsedHtml        :
RawContentLength  : 48411


# 現在の設定を表示
PS C:\Windows\system32> [System.Net.WebRequest]::DefaultWebProxy

Credentials
-----------


# プロキシホストの設定（認証情報無し）
PS C:\Windows\system32> [System.Net.WebRequest]::DefaultWebProxy = New-Object System.Net.WebProxy "http://192.168.0.1:80"
PS C:\Windows\system32> [System.Net.WebRequest]::DefaultWebProxy


Address               : http://192.168.0.1/
BypassProxyOnLocal    : False
BypassList            : {}
Credentials           :
UseDefaultCredentials : False
BypassArrayList       : {}

# 存在しないプロキシなので疎通できなくなる
PS C:\Windows\system32> Invoke-WebRequest https://www.google.com -UseBasicParsing
Invoke-WebRequest : リモート サーバーに接続できません。
発生場所 行:1 文字:1
+ Invoke-WebRequest https://www.google.com -UseBasicParsing
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest]、WebExce
    ption
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

PS C:\Windows\system32> curl https://www.google.com -UseBasicParsing
curl : リモート サーバーに接続できません。
発生場所 行:1 文字:1
+ curl https://www.google.com -UseBasicParsing
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest]、WebExce
    ption
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

```

>なお、PowerShell 7.0以降では[HttpClient.DefaultProxy](https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclient.defaultproxy?view=netcore-3.1) プロパティを使用してプロキシ構成を決定します。
このプロパティの値は、プラットフォームによって決まります。

> - Windowsの場合：環境変数からプロキシ構成を読み取ります。これらの変数が定義されていない場合、プロパティはユーザーのプロキシ設定から取得されます。

#### 参考
[PowerShellでInternet Explorerエンジンエラーが発生する](https://news.mynavi.jp/article/win10tips-492/)
[Invoke-WebRequest（Microsoft.PowerShell.Utility）-PowerShell |  Microsoft Docs](https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.utility/invoke-webrequest?view=powershell-5.1)
[Invoke-WebRequest（Microsoft.PowerShell.Utility）-PowerShell 7 |  Microsoft Docs](https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.utility/invoke-webrequest?view=powershell-7)

### Firefox
Firefox＞メニュー＞オプション＞ネットワーク設定＞接続設定
Firefoxは他ブラウザと異なり、システムから独立したプロキシ設定も可能です。

### Visual Studio Code
http.proxySupportキーがoverrideの時は環境変数のhttps_proxyを参照します。（デフォルト設定）
※システムのプロキシ設定は参照しません。

1. `Ctrl`+`,` もしくは Manage＞Settingsで設定画面を開く
2. 右上タブのOpen Settings(JSON)でjsonを開くか、`proxy`と検索し、以下設定を追加or削除

```json:settings.json
{
    "http.proxy": "https://192.168.0.1:80/",
    "http.proxyAuthorization": null
    "http.proxyStrictSSL": false,
    "http.proxySupport": "on",
}
```

設定が誤っているとExtensionsで以下警告が表示されて拡張機能の検索やお勧めが出なくなります。
`We cannot connect to the Extensions Marketplace at this time, please try again later.`

#### 参考
[Visual Studio Code のプロキシ設定](https://scrapbox.io/craftmemo/Visual_Studio_Code_%E3%81%AE%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E8%A8%AD%E5%AE%9A)

### npm
デフォルト設定では環境変数のhttps_proxyを参照します。
※以下バージョン`user-agent = "npm/6.14.4 node/v12.17.0 win32 x64"`の場合

```console:コマンドプロンプト
# 現在のプロキシ設定を確認
C:\Users\user>npm config list -l
...
https-proxy = null
...
proxy = null
...

# proxyを設定
C:\Users\user>npm config set proxy https://192.168.0.1:80

# https-proxyを設定
C:\Users\user>npm config set https-proxy https://192.168.0.1:80

# proxy設定を削除
npm config delete proxy

# https-proxy設定を削除
npm config delete https-proxy
```

実設定ファイルが`C:\Users\user\.npmrc`等に配置されている（環境によって異なります）ので、こちらでも設定は可能です。

#### 参考
[proxy配下のnpm設定](https://qiita.com/aoi_snow/items/45d6ef03d509fc103ba7)
[[Node.js] npm の proxy と registry 設定](https://qiita.com/LightSpeedC/items/b273735e909bd381bcf1)
[Windows10でnode/npm周りにproxy設定する備忘録](https://qiita.com/flat-8-kiki/items/f71f5375a053fab01033)

# 何にハマったか？
`npm install`を実行すると、以下エラーが発生しました。

```shell-session
C:\Users\user>npm install -g serverless
npm ERR! code ETIMEDOUT
npm ERR! errno ETIMEDOUT
npm ERR! network request to https://registry.npmjs.org/serverless failed, reason: connect ETIMEDOUT 192.168.0.1:80
npm ERR! network This is a problem related to network connectivity.
npm ERR! network In most cases you are behind a proxy or have bad network settings.
npm ERR! network
npm ERR! network If you are behind a proxy, please make sure that the
npm ERR! network 'proxy' config is set properly.  See: 'npm help config'
```

いつどこで設定したか記憶は定かではないのですが、昔必要があって`server：192.168.0.1`の`port：80`（そんなプロキシサーバーは実際には存在しません）を一度WinInetに設定してすぐ削除した覚えがありました。
ただ、上項目「システムのプロキシ設定」が全て未設定な事と、`npm config`が未設定な事を確認して、
念の為`npm config delete`もしてみましたがエラーが解消できなかったので、どこにプロキシ設定が隠れているんだ...と頭を悩ませていたら、
何故か環境変数に設定が残っていたので、削除したところ無事解決できました！

# まとめ
- プロキシ設定箇所は1つではない。
- ソフトによって参照しているプロキシ設定箇所は異なる。

他にも設定する場所あるよ！とかあれば是非コメントください。