Windows
PowerShell
Windows10

Windows PowerShell 初回スクリプト実行時に弾かれる問題

問題

Windows 使用時にフォントを一括でインストールしてくれるスクリプトが配布されていたのですが、
実行するときにエラーが出てしまいました。

C:\Users\TestUser\Documents\Project\fonts\install : このシステムではスクリプトの実行が無効になっているため、ファイル
 C:\Users\TestUser\Documents\Project\fonts\install.ps1 を読み込むことができません。詳細については、「about_Execution
_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
発生場所 行:1 文字:1
+ C:\Users\TestUser\Documents\Project\fonts\install
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess

PowerShellは日本語で細かく対処法を記述している他、URL等も提示してくれるなんて、、優しい世界。

解決法

解決した時のコマンドを記載します。

> Get-ExecutionPolicy
Restricted

> Set-ExecutionPolicy -Scope CurrentUser Unrestricted
実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies
のヘルプ トピック (https://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): Y

細かな内容は以下のURLに書いてありますが、せっかくなので簡単に解説していこうと思います。

https://docs.microsoft.com/ja-jp/previous-versions/windows/powershell-scripting/hh847748(v=wps.640)

ポリシー

信頼されているスクリプトしか実行しないようにポリシーが設定されています。
ポリシーには、

  • 署名の有無
  • 署名の信頼度
  • スクリプトファイルの実行可否
  • 実行時の警告の有無

などが定義されています。
適切なポリシーに設定することで悪意あるスクリプトなどの実行を防ぐことができます。
誤ったポリシーに設定してしまったまま放置すると危険なので、行いたいことが終われば元に戻すなど対処しましょう。

ポリシーの設定

ポリシーの設定はコマンドを使用します。
まず、現在のポリシーを確認しましょう。

> Get-ExecutionPolicy
Restricted

Restrictedとなっています。これは、 Windows 8、Windows Server 2012、Windows 8.1 の既定の実行ポリシーです。
これではすべてのスクリプトの実行ができませんので、新たにスクリプトが実行できるように設定を変更します。
変更方法は以下です。

> Set-ExecutionPolicy -Scope CurrentUser AllSigned

AllSignedというのがポリシー名です。
こちらは、説明されているサイトでこう記載されています。

  • スクリプトを実行できます。
  • ローカル コンピューター上で記述されたスクリプトを含むすべてのスクリプトと構成ファイルが、信頼された発行元によって署名されている必要があります。
  • 信頼されているかどうかがまだ分類されていない発行元のスクリプトを実行する前に、確認メッセージが表示されます。
  • 署名されているが悪意のあるスクリプトが実行される危険性があります。

名称一覧

https://docs.microsoft.com/ja-jp/previous-versions/windows/powershell-scripting/hh847748(v=wps.640)#windows-powershell-%E3%81%AE%E5%AE%9F%E8%A1%8C%E3%83%9D%E3%83%AA%E3%82%B7%E3%83%BC

詳しくは上記URLを見ましょう。簡単に文言の一覧だけ以下に記載します。

名称 スクリプトの実行 署名(信頼済み)である 署名(信頼なし)である インターネット上からダウンロードした ローカルで作成した 備考
1 Restricted × × × × × スクリプトの実行が出来ない
2 AllSigned × 信頼された発行元の署名が必要
3 RemoteSigned インターネット上は署名が必要、ローカルはなくてもよい
4 Unrestricted インターネット上のものは警告が表示される
5 Bypass 警告等表示もなし
* Undefined 未定義。すべて定義されていない場合は既定のRestrictedとなる

さいごに

WindowsPowerShellはちゃんと解決方法がシェル上に出てくれるので、ありがたいなと思いました。
最近はUbuntu18もWindowsStoreからダウンロードして、Bash on Ubuntu で起動できるので、使っています。

一応備忘録として書きました。間違ってたらご指摘お願いいたします。