1

現状

Windows上のブラウザ(特にChrome系)でファイルをダウンロードして、そのファイルのプロパティを見ると、
「このファイルは他のコンピューターから取得したものです。このコンピューターを保護するため、このファイルへのアクセスはブロックされる可能性があります。 [許可する(&K)]」
といった注釈がついていることがあります。

もちろん「許可する(&K)」にチェックを入れてOKボタンを押せば当該ファイルからはフラグが落ちますし、放置しておいても特に何か実害があるわけではなさそうなのですが、何となくムズ痒い気分なので、できれば手元の大量のファイルぜんぶについて、このフラグを洗いざらい落としてしまいたいと考えています。

質問

このフラグについて、「立っているかどうか確認する」「立っていたら落とす」ためにはどんなコードを書けばいいでしょうか?どこかにサンプルコードなどがありましたらご教示ください。参照すべきAPIへのポインタだけでも助かります。

今回の用途で当方が使えそうな言語は大体このくらいです:

  • WSHでScripting.FileSystemObject等を使う。
  • MinGW-w64でコンソールアプリを書いて、その中からWin32APIを呼び出す。
  • ActivePerlで書いて、標準ライブラリとWin32APIを使う。

とはいえ、それ以外でも汎用言語ならコードを読めば大体理解できるつもりです。
(PowerShellなどはさすがにチンプンカンプンですが…)

以上、よろしくお願いします。

P.S.
当座はWindows10で作業する予定ですが、WindowsXPマシンもまだファイルサーバー・プリンタサーバーとして運用中なので、XPでも動くコードになれば嬉しいです。

cubick
  • 20,987
  • 5
  • 25
  • 64

2 Answers2

4

ブロックの解除(立っていたら落とす)については、powershell で Unblock-Fileコマンドレットを使うのが一番楽で愛用しています。
コマンドプロンプトと同様に使えますので試してみてはいかがでしょうか。

payaneco
  • 12,323
  • 21
  • 57
3

それはNTFSファイルシステムの「代替データストリーム(ADS:Alternate Data Stream)」という領域に中身があります
https://atmarkit.itmedia.co.jp/ait/articles/1407/11/news111.html

利用するツールによりますが、例えばa.exe というファイルのフラグが立っているかを調べるには
a.exe:Zone.Identifier をcatなりすれば中身を見れます。

ほぼファイルと同様に扱えるので、削除するには
del a.exe:Zone.Identifier で消えます。
コマンドプロンプトのdelコマンドで消える事を確認しました。

Fushihara
  • 540
  • 1
  • 6
  • 22
  • ありがとうございます。試してみましたが残念ながら「ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。」と言われてしまいました。PowerShellを使う方法はうまくいきましたので、こちらで何とかやってみようと思います。 – でるもんた・いいじま Jul 01 '22 at 03:07
  • 追記です。ご提示いただいた@ITの記事から、最終的にSysInternalのstreamsコマンドに落ち着きそうです。レジストリをいじれば最初からADSがつかないようにできる、という情報にも辿り付けましたので、これから試してみようかと思います。 – でるもんた・いいじま Jul 01 '22 at 03:17