Windows UpdateフィルタやWindows Privacyフィルタで提供しているWindowsファイアウォール設定用PowerShellスクリプトの使い方。
WindowsのPowerShellは馴染みが薄いという人も多いだろうけど最も基本的な部分の使い方自体はコマンドプロンプトとそれほど大きく違わない。ただし、コマンドプロンプト用のバッチファイル(拡張子: bat)はエクスプローラー上でファイルをダブルクリックで実行できるのに対し、PowerShellのスクリプトファイル(拡張子: ps1)はダブルクリックでは実行できないので使おうと思ったら嫌でも黒画面(PowerShellは紺画面だけど)でコマンドを打たなければならない。そして、コマンドプロンプトと同じく文字の選択やコピー貼り付けは使いにくい。
コマンド入力は面倒だけどWindowsのファイアウォールを手動で設定するのはもっと面倒なので少しだけガマン。
スクリプトのダウンロード
まずはWindows UpdateフィルタやWindows PrivacyフィルタからWindowsファイアウォール設定用PowerShellスクリプトをダウンロードする。ブラウザによってはリンクをクリックした際に「開く」と「ダウンロード」を選択する画面が出るけど開くではなくダウンロードを選択。
通常はオペレーション中のユーザーの「ダウンロード」フォルダにダウンロードされる筈(という前提で以下の説明に続く)。
Windows PowerShell画面を開く
スタートボタンを「左クリック」し、最下部の「全てのアプリ」を「左クリック」。
Wまでスクロールして「Windows PowerShell」を「左クリック」する。ネストされたメニュー内の「Windows PowerShell」を「右クリック」し、ポップアップしたメニューで「管理者として実行する」を「左クリック」する。
一見コマンドプロンプトに似た風なPowerShellの画面。
現在のスクリプトの実行ポリシーを確認する
Windowsの初期状態ではPowerShellのスクリプトが実行不可になっている筈だが、一応確認する。(必須ではない)
PS C:\WINDOWS/system32> Get-ExecutionPolicy
Restricted
Get-ExecutionPolicy(全部小文字でも構わない。以下入力時は同じ)と入力して[Enter]でRestrictedと表示されたらスクリプトは実行できない状態。Unrestrictedなら制限が解除された状態。AllSigned やRemoteSignedなら既に何らかでPowerShellを触っていて理由があって変更している筈。
スクリプトの実行ポリシーの変更
PS C:\WINDOWS/system32> Set-ExecutionPolicy Unrestricted 実行ポリシーの変更 実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを 変更すると、about_Execution_Policiesのヘルプ トピック (http://go.microsoft.com/fwlink/?LinkID=135170) で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを 変更しますか? [Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ (既定値は "N"): y PS C:\WINDOWS/system32>
ポリシーがUnrestrictedでない場合(通常)はPowerShellスクリプトを実行できるように制限を解除する。Set-ExecutionPolicy Unrestricted と入力して[Enter]。
ポリシー変更の確認メッセージと選択が表示されるので[y]を押して[Enter]。
エラーにならなければ解除完了。または1つ前の手順で状態を確認。
ダウンロードしたスクリプトの実行
ダウンロードしたスクリプト(この記事の趣旨ではwinfirewall_windows_update.ps1またはwinfirewall_windows_privacy.ps1)を実行する。この記事でやりたいメインはこれ。
PS C:\WINDOWS/system32> ~\downloads\winfirewall_windows_update.ps1 または PS C:\WINDOWS/system32> ~\downloads\winfirewall_windows_privacy.ps1 セキュリティ警告 信頼するスクリプトのみを実行してください。インターネットから入手したスクリプトは 便利ですが、コンピューターに危害を及ぼす可能性があります。このスクリプトを信頼 する場合は、この警告メッセージが表示されないように、Unblock-Fileコマンドレットを 使用して、スクリプトの実行を許可してください。 C:\User\Foobar\downloads\winfirewall_windows_update.ps1を実行しますか? [D] 実行しない(D) [R] 一度だけ実行する(R) [S] 中断(S) [?] ヘルプ (既定値は "D"): r
~\downloads\winfirewall_windows_update.ps1 と入力して[Enter]
または
~\downloads\winfirewall_windows_privacy.ps1 と入力して[Enter]
コマンドのどちらかを実行する。(2つダウンロードして両方のコマンド実行もモチロンあり)
~\downloadは実行中のユーザーの「ダウンロード」フォルダのこと。「~」であって「^」ではないので注意。「\」(バックスラッシュ)は日本語環境では¥(半角の円マーク)。
セキュリティ警告が出るので「一度だけ実行する」の「r」を押して[Enter]。
備考: PowerShellではコマンドプロンプトと違いカレントディレクトリ(カレントフォルダ)要するに現在のフォルダにあるスクリプトファイル名を指定しても実行できないのでその点だけ注意。コマンドプロンプトならc:\example\file.batを実行したい場合は cd \example[enter]でc:\exampleに移動してファイル名直指定 file.bat[enter] で実行できるけどPowerShellだと必ずスクリプトファイルのパスを指定しなければダメ。だからc:\example\file.ps1を実行したくてcd \example[enter]でc:\exampleに移動したとしても \example\file.ps1みたいにフルパスで指定するか.\file.ps1のように相対パスで指定するなどが必要。
ちなみにファイル名リストを表示したいときはコマンドプロンプトと同じく dir コマンドが使えるが Unix系と同じく ls も使える。 いろんな部分でUnix系シェルの作法に近い。
スクリプトの実行結果
Name : {68f4d025-50ab-4a30-a843-2642af4595a8} DisplayName : Windows10Privacy_inbound Description : https://gato.intaa.net/net/windows_update_filter DisplayGroup : Group : Enabled : True Profile : Any Platform : {} Direction : Inbound Action : Allow EdgeTraversalPolicy : Block LooseSourceMapping : False LocalOnlyMapping : False Owner : PrimaryStatus : OK Status : 規則は、ストアから正常に解析されました。 (65536) EnforcementStatus : NotApplicable PolicyStoreSource : PersistentStore PolicyStoreSourceType : Local Name : {5c5a97a3-ccf9-4958-856f-0ca832c81322} DisplayName : Windows10Privacy_outbound Description : https://gato.intaa.net/net/windows_privacy_filter DisplayGroup : Group : Enabled : True Profile : Any Platform : {} Direction : Inbound Action : Allow EdgeTraversalPolicy : Block LooseSourceMapping : False LocalOnlyMapping : False Owner : PrimaryStatus : OK Status : 規則は、ストアから正常に解析されました。 (65536) EnforcementStatus : NotApplicable PolicyStoreSource : PersistentStore PolicyStoreSourceType : Local
こんな感じに2つのルールが読み込まれて「規則は、ストアから正常に解析されました。 (65536)」が2回表示されれば成功。Name行の {ホニャララ} の部分は固有の値になるので気にしない。
スクリプトの実行ポリシーを戻す
PS C:\WINDOWS/system32> Set-ExecutionPolicy Restricted 実行ポリシーの変更 実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを 変更すると、about_Execution_Policiesのヘルプ トピック (http://go.microsoft.com/fwlink/?LinkID=135170) で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを 変更しますか? [Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ (既定値は "N"): y PS C:\WINDOWS/system32>
スクリプトの実行ポリシーがUnrestrictedのままで放置するのは危険。このポリシーは手動で変更するまでPowerShellを終了してもPCを再起動してもそのままなのでRestricted (または正当な理由があればAllSigned, RemoteSigned)に戻すことを忘れないよう十分に注意。
Set-ExecutionPolicy Restricted と入力して[Enter]。
ポリシー変更の確認メッセージと選択が表示されるので[y]を押して[Enter]。
エラーにならなければ戻し完了。
ここまで問題なければ exit [Enter]でPowerShell画面を終了する。
まとめ
以上、ごちゃごちゃ書いたけどやったことはこんだけ。
- スクリプトのダウンロード
- Windows PowerShellの画面を開く
- スクリプトの実行ポリシー変更
- ダウンロードしたスクリプトを実行
- スクリプトの実行ポリシーを戻す
この記事の目的であるMicrosoftの更新系や情報収集系サーバへの接続停止はこの時点で実現している筈。
フィルタを更新をしたい場合もここまでの手順を再度実行するだけ。この記事で実行したファイアウォールの設定スクリプトは設定を上書きする仕様なので先に古い設定を消すなどの必要ない。
以下はこの記事で追加したファイアウォールのルールの存在確認と停止/削除方法。
スタートボタンを「右クリック」し、「コントロールパネル」を「左クリック」。
コントロールパネルで「Windows ファイアウォール」を「左クリック」。
Windows ファイアウォールで左メニューから「詳細設定」を「左クリック」。
左ペインの「受信の規則」を選択。中央のペインをスクロールし「Windows10Update_Inbound」または「Windows10Privacy_Inbound」(または両方)を探し、左に道路標識の「駐車禁止」に似たマークが付いていれば「ブロック」ルールとして機能していることがわかる。
左ペインの「送信の規則」を選択。中央のペインをスクロールし「Windows10Update_Outbound」または「Windows10Privacy_Outbound」(または両方)を探し、左に道路標識の「駐車禁止」に似たマークが付いていれば「ブロック」ルールとして機能していることがわかる。
ルールを削除したい場合は中央のペインで削除したいルールを選択した状態で右ペインの「削除」を「左クリック」。中央ペインからそのルールが消えれば完了。
FAQ
Q: Hostsファイルを触れば簡単じゃない?
A: Microsoftの幾つかのホストへはHostsファイルの設定を無視して強制的に名前解決して接続するのでHostsファイルの変更では通信を阻止できない。
Q. これは何がしたいの?
A. Windows10の更新不具合を避ける或いはWindows10が勝手にPCや個人の情報をMicrosoftに送信するのを防ぐためにMicrosoftの一部のサーバに接続させない(通信をブロックする)ことが主目的。「がとらぼ」ではこれまでFreeBSD/OpenBSDあるいはLinuxなどをファイアウォールとして利用している所謂「ものずきな人」向けに通信ブロック用IPアドレスリストを提供してきたが、家庭用ブロードバンドルーターなどを利用している普通の人は使えなかった。Windowsに標準で備わっているファイアウォールを簡単に設定できれば多くの人が利用できるんじゃね?と考えて作ったのがこれ。
Q. 効果ある?
A. わからん、けどパケットキャプチャしてみた限りでは意図通り機能してる。
Q. ファイアウォールのルールは更新しなくて良い?
A.ブロック対象ホスト数やIPアドレスの追加変更は意外と少ないようなので頻繁な更新は要らないと思われる。
関連記事:
- Tiny 11をMicrosoftと通信させない名前解決変更
- マイクロソフト PCマネージャというアプリを触ってみた
- Windows 11のシステム要件を満たさないPCでWindows11の大型アップデートを適用
- Windows 11でWindows Updateの自動更新を停止する
- Windows 11でWindows Updateによる更新を手動で停める (後編)
- Windows 11でWindows Updateによる更新を手動で停める (前編)
- Windows 11のシステム要件を満たさないPCでWindows10からWindows11にアップグレード
- WindowsでもUnbound (Remote controlの準備)
- Windows 11リリース (例のごとくシステム要件を満たさないPCにインストール)
- Androidスマホ画面をWindowsで表示 (ワイヤレスディスプレイ プロジェクション)
- Windows 11上で「このPCは現在、Windows 11システム要件を満たしていません」
- MS公式誰でもDLできるWindows 11 インサイダー版を古いPCにインストールと休止無効化設定
- Windows IMEで半角/全角キーの割り当てをIMEオフだけに変更(Linuxも)
- Windows 11システム要件に満たないPCにISOファイル無改造でインストール
- Windows 11上で「このPCではWindows 11を実行できません」
- Windows 11を9年前の超非力なノートPCにインストールしてみた
- 情報セキュリティ Windows 10でUSBメモリの自動実行を不可にする
- 情報セキュリティ Windows 10でUSBメモリの読み書きを不可にする
- Windows 10を旧型ノートPCにクリーンインストールしてみた
- DVDFab 11がリリースされた
- WinlogbeatでWindowsイベントログを可視化 後編
- WinlogbeatでWindowsイベントログを可視化 中編
- WinlogbeatでWindowsイベントログを可視化 前編
- Windows 10のメールでZ-Push (Exchange)を利用する
- Chrome OS (Chromium OS)を触ってみた
- Windows 10の時刻同期設定
- Windowsで写真現像 darktable 2.4
- 音楽プレーヤー Plexamp
- どうしてもWindowsの共有フォルダが見えない対処
- Windows 10 Fall Creators Update
いつも記事を参考にさせていただいています。
Windows7環境でPowerShell 5.0をインストールし後、コマンド入力してみましたが下記のようなメッセージが表示されてルール追加ができませんでした。
Windows7では無理あるいは追加しても意味がないのでしょうか?
NetFirewallRule : The term 'Get-NetFirewallRule' is not recognized as the name of a cmdlet, function, script file,
perable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try
in.
:\Users\USER\Desktop\winfirewall_windows_privacy.ps1:3 char:10
(-not(Get-NetFirewallRule | where DisplayName -eq Windows10Privacy ...
~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (Get-NetFirewallRule:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
NetFirewallRule : The term 'Get-NetFirewallRule' is not recognized as the name of a cmdlet, function, script file,
perable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try
in.
:\Users\USER\Desktop\winfirewall_windows_privacy.ps1:6 char:10
(-not(Get-NetFirewallRule | where DisplayName -eq Windows10Privacy ...
~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (Get-NetFirewallRule:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
NetFirewallRule : The term 'Set-NetFirewallRule' is not recognized as the name of a cmdlet, function, script file,
perable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try
in.
:\Users\USER\Desktop\winfirewall_windows_privacy.ps1:9 char:1
t-NetFirewallRule -DisplayName "Windows10Privacy_Inbound" -Directio ...
~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (Set-NetFirewallRule:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
NetFirewallRule : The term 'Set-NetFirewallRule' is not recognized as the name of a cmdlet, function, script file,
perable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try
in.
:\Users\USER\Desktop\winfirewall_windows_privacy.ps1:11 char:1
t-NetFirewallRule -DisplayName "Windows10Privacy_Outbound" -Directi ...
~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (Set-NetFirewallRule:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Windows8以降は使えると思うけど7は解らないですね。Windows Management Frameworkと.NET Frameworkの新しいのを入れてもダメならWindows7では使えないということかも。
コメントありがとうございました。
WMI 5.1もインストールしてみましたが、やはり同じエラーがでます。
そもそもWindows 7はGet-NetFirewallRule コマンドレットが使用できないようですので無理そうですね。
http://nasunoblog.blogspot.jp/2016/03/how-to-setup-remote-desktop-connection-using-powershell-and-netsh-advfirewall.html
将来的にWindows10をインストールしたときに使わせていただきます。