以前、Windowsでインターネットからダウンロードしたファイルのブロックについてについて記事を書きました。
WindowsのEdgeなどでインターネットからダウンロードしたファイルには、代替データストリームが追加され外部から取得したファイルとして判別されます
PowerShellでは、ps1スクリプトファイルにこの代替データストリームがついている場合。
実行ポリシーによってスクリプト実行時の動作が変わるため説明します。
代替データストリームがついているps1ファイルを用意する
どこか外部にps1ファイルを配置して、ブラウザでダウンロードして用意する方法もありますが。
ローカル端末のみで下記コマンドを実行すると、代替データストリームが付与されているファイルを生成できます。
New-Item -Value "Write-Host HelloWorld" -Path Helloworld.ps1 | Set-Content -Stream "Zone.Identifier" -Value @("[ZoneTransfer]","ZoneId=3")
上記コマンドを実行すると下記ファイルが作成されます。
今回はこのファイルをWindows環境のPowerSHellに用意されている、実行ポリシーで実行して動作を確認します。
実行環境
- Windows 10 21H2
- PowerShell 7.4.0-preview.1
- Windows PowerShell 5.1.19041.2364
実行環境のスコープについて
今回、実行している端末の実行ポリシー設定については下記となります。
Scope | ExecutionPolicy |
---|---|
MachinePolicy | Undefined |
UserPolicy | Undefined |
Process | UndefinedD |
CurrentUser | RemoteSigned |
LocalMachine | RemoteSigned |
PowerShellの実行ポリシーについて
Windows環境ではPowerShellの実行ポリシーは下記の種類があります。
- AllSigned
- Bypass
- Default
- RemoteSigned
- Restricted
- Undefined
- Unrestricted
今回は下記のように、プロセススコープを対象にして実行ポリシーを設定してスクリプトを実行します。
Set-ExecutionPolicy -ExecutionPolicy AllSigned -Scope Process
./Helloworld.ps1
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process
./Helloworld.ps1
Set-ExecutionPolicy -ExecutionPolicy Default -Scope Process
./Helloworld.ps1
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process
./Helloworld.ps1
Set-ExecutionPolicy -ExecutionPolicy Restricted -Scope Process
./Helloworld.ps1
Set-ExecutionPolicy -ExecutionPolicy Undefined -Scope Process
./Helloworld.ps1
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope Process
./Helloworld.ps1
実行結果画像を確認すると、Bypass
とUnrestricted
除いて他の実行ポリシーでは代替データストリームが付与されたスクリプトファイル(外部から取得したスクリプト)は実行失敗していることがわかります。
Bypass
については無条件でスクリプトが実行されていますが、Unrestricted
については警告が表示され、実行前に確認が入ります。
またWindows PowreShellでも同様の結果となります。
気をつけたいこと
PowerShellスクリプトをWindows端末やサーバーに配置する際。
実行ポリシーとスクリプトファイルの状態によっては、実行が失敗してしまうことがあります。
意図しないエラーを防ぐためにも、環境を準備する際には確認したいポイントです。
総評
PowerShellの実行ポリシーについては、過去苦しめられた人も多く。
PowerShellが嫌われる要因の一つな気もします。
実行ポリシーはWindows以外の環境の場合は、Unrestricted
しかありませんが。Windows環境の場合は色々と選択肢があるので適切に設定して利用したい所です。