ルドルフもわたるふもいろいろあってな

Microsoft 365、Power Platform、PowerShellについて調べたことや検証したことなどを投稿します。技術の話は面白い。

ダウンロードしたファイルの「ブロックの解除」を一括で行う方法 2つ

主旨

Webサイトなどからダウンロードしたファイルのプロパティを開くと表示される「ブロックの解除」を、複数ファイルに対して一括で実行する方法を説明します。

f:id:wataruf01:20220327124802p:plain:h480

背景

そもそも「ブロックの解除」とは何か?

Webサイトからダウンロードしたファイルには、代替データストリーム(Alternate Data Stream)の機能によってPCが「お、このファイルはWebサイトからダウンロードしたファイルだ。(=゚ω゚= )」と認識できる情報が付加されます。外部から入手したファイルからPCを保護するために、PCはそれらのファイルへ行える操作を制限します。
この制限を解除するのが、「ブロックの解除」です。

代替データストリーム(Alternate Data Stream)とは何か?

代替データストリーム(Alternate Data Stream)とは、Windows の主要なファイルシステム形式であるNTFS ファイルシステムが持つ機能のひとつです。この機能はファイルに通常使用されるストリーム(メインストリーム)に加えて、異なるデータストリームを保持する機能です。この機能はファイルやフォルダに関する様々な情報を保持するために用いられています。

代替データストリームが保持する情報のひとつが、ファイルのダウンロード元のゾーンを示すテキスト情報(Zone.Identifier)です。

ブロックされると何が困るのか?

ブロックが有効になっているファイルは、そのファイルに対する操作が一部制限されます。ファイルを移動したり開いたりするのは問題なく行えますが、以下のような操作が行えなくなります。

  • exeファイルやps1ファイルの実行
  • 実行ファイルからのdllファイルの参照

ブロックされて困る場面の例

これらの操作が行えなくて困るのは、以下のような場面です。

  • 開発環境で作成したスクリプトを運用環境に移送したが、スクリプト本体がブロックされたため実行するとエラーになる
  • 通信が制限されていてGet-InstallModule が使えない環境でPowerShellスクリプトを使う際に、別環境から持ち込んだモジュール(例:PnP.PowerShellモジュール)がブロックされてモジュールの参照がエラーになる

ファイル単体の「ブロックの解除」を行う方法

ブロックを解除する方法は以下の通りです。

ファイルを右クリックして「プロパティ」を選択します。
f:id:wataruf01:20220327133126p:plain:h300

「許可する」をオンにして、OKをクリックします。これで以上です。
f:id:wataruf01:20220327133325p:plain:h480

ブロックの解除を「一括」で行いたい理由

ダウンロードしたファイルがzipなどの圧縮ファイルである場合は、そのzipファイルの中にある各ファイルがブロック対象になります。つまり、zipファイルの中にあるファイルにそれぞれブロックの解除を行う必要があります。

ブロックされて困る場面の例に挙げた「PnP.PowerShellモジュール」の場合はファイルが数百個あるため、個別に解除を行うのは現実的ではないです。そのため、一括で解除を行う方法を知っておく必要があります。

「ブロックの解除」を一括で行う方法

方法その1:対象ファイルを格納したフォルダを1度zipで圧縮する

ブロックの解除を行いたいファイルを格納したフォルダを、圧縮します。
f:id:wataruf01:20220327134502p:plain:h480

圧縮したフォルダを解凍します。すると、フォルダの中にあるファイルが下層のフォルダにあるファイルも含めてブロックが解除されます。

こちらの方法は操作方法はわかりやすいので活用できる場面は多いです。
ダウンロードしたファイルがもともとzipの場合は「zipを解凍する」→「解凍したフォルダをzip圧縮する」→「圧縮したzipを解凍する」という手順になる点が要注意です。

その2:PowerShellコマンド「Unblock-File」を使う

ブロックの解除を行いたいファイルを格納したフォルダを開き、アドレスバーに「powershell」と入力してEnterを押下します。
f:id:wataruf01:20220327134927p:plain

PowerShellのコンソールが開き、対象のフォルダが自動でカレントフォルダになります。
f:id:wataruf01:20220327135104p:plain

以下のコマンドを実行します。これで以上です。

Get-ChildItem -Recurse | Unblock-File

f:id:wataruf01:20220327135356p:plain

コマンドの解説
Get-ChildItem -Recurse | Unblock-File

コマンドの内容は以下の通りです。

  • 「Get-ChildItem -Recurse」:カレントフォルダの配下にあるすべてのファイル・フォルダを取得する。
  • 「Unblock-File」:ブロックの解除を行う。

入力補完を使えば暗記も難しくない程度の文字数なので、PowerShellを使い慣れているかたはこちらのほうが簡単だと思います。

以上です。