Set-ExecutionPolicy RemoteSignedと「インターネットからダウンロードした」…

PowerShell の話ではあるんだけれど、むしろ「Windows System Internals」な話ではある。

MajiでPowerShellる5秒前ではちゃんと説明しなかったけれど、管理者モードで PowerShell 起動して

1 Set-ExecutionPolicy RemoteSigned

すれば「万事オッケーさ」ではないことは、初心者向けサイトに行けば書いてある。たとえばこうなる:

で、

1 Set-ExecutionPolicy Unrestricted

とすればこうなる:

ここまではまぁ PowerShell の「基礎」として、ちゃんとしたサイトにはちゃんと書いてある。

で、本題の話はここから。

「ワタシが本格的職業Windowsプログラマだった頃」には知っていたはずの、でも随分前なので忘れていたこと、そしてその知識は Mark Russinovich の「Sysinternals」がまだ「Winternals Software」だった頃に Mark Russinovich が MSDN Magazine に書いていた記事からだった、と思う。

何か? つまり…「Where Does Windows Keep Track of the Downloaded from the Internet Status?」。なんで Windows はダウンロードしたことを知ってるの? って話。エクスプローラでしか生活しないユーザも、DOS プロンプト中心で生活しているユーザでさえ、まず気付かない隠しファイルがあるの…知ってる? しかもファイル移動に追従します。

正直このサイト読むまでは完全に忘れていたのだけれど、「alternate data stream (ADS)」がこっそり作られてるのだね。そして、「Microsoftに買収されたのちの Sysinternals」で入手できる「streams.exe」は、これを説明するためのプログラム、でした。標準プログラムだと、dir で見ることが出来ます:

(cmd /c は MSYS からやってるから必要なだけで、普通に生 DOS プロンプトの場合は「dir /r」で良いです。)

なお、ストリームの知識がなくとも日常生活に支障はないです:

これは知ってるかもね、皆。

Mark Russinovich の著書は結構新しいのが出てるんだね:

Windows Internals, Part 1 (6th Edition) (Developer Reference)

Windows Internals, Part 2 (6th Edition) (Developer Reference)

インサイドWindows 第6版 上

インサイドWindows 第6版 下

で、ここまでは「Windows 内部(Internal)」な、テクニカルな話、ではある。

実は本題というか、「ネタ」はここから。ヘンな話だけど、要はこのストリームから切り離すのに「移動」「コピー」どれもダメなんだけれど、「中身のコピーで新規作成」なら良いことは理解出来るよね? てことは:

1 me@host: ~$ cat dl_from_internet.ps1 > my_local.ps1

これで「my_local.ps1」は「インターネットからダウンロードしたファイル」でなくなります。当ったり前、ではあるけれど、なんで当たり前なのか、は、ストリームの説明がないと成立しない、とまぁ、そんな話でした。
(レジストリに書き込んでる、とかそんなんじゃないのです。)

2015-03-28 追記:こんな本があることを知った

Windows Sysinternals徹底解説 Windows管理者必携ツールを使い尽くすためのバイブル


Mark本人が書いたものらしい。欲しいな。買うかも。