Windows8 の「リフレッシュ」機能を使った後、 IE10 や Silverlight がおかしいときの原因(のその一つ)

一昨日書いた、

IE10 で JavaScript から localStorage を使おうとすると「アクセスが拒否されました( Access is denied )」エラーで実行時エラーになる問題 - oogattaの勉強日記

id:sakurai_youhei さんからコメントいただきました。ファイルの権限の問題なら、 ProcessMonitor でファイル I/O の様子を見てみると良いと。なるほど!!

帰ってきて、壊れてる方のアカウントにログインして、早速見てみました。判明しました。

C:\Users\oogatta\AppData\LocalLow\Microsoft\Internet Explorer\DOMStore

に書き込めてない。 oogatta はユーザ名です。

そもそも、これまでずっと AppData\Local を見ていました。 LocalLow ってなんだ…。と思って検索してみると、

Windows 8 で PC をリフレッシュすると、Silverlight が動作しない場合がある

この Knowledge Base が引っかかりました。これだ…。自分、一度 Windows8Windows8 の「リフレッシュ」機能でリフレッシュしています。

icacls "%USERPROFILE%\AppData\LocalLow\Microsoft" /setintegritylevel (OI)(CI)low 

コマンドプロンプトで実行。治りました。整合性レベルが壊れていたと…(おそらく Medium になってしまった)。保護モードによって、自分ユーザ権限であるけれど一段低い整合性レベルを与えられた IE10 から触れなくなってしまったんですね。

整合性レベル

Windows Vista から導入されていた整合性レベルについては、

Security Professionals Network Inc. - 【SPN通信】Windowsの整合性レベルによるアクセス制御

こちらのページで理解できました。知らなかった。全く知りませんでした。

そういえば、この localStorage が使えなかった IE10 、保護モードは元々デフォルトで有効なんですが、さらに拡張保護モードも有効にすると localStorage が使えていたんですよね。拡張保護モードが有効な IE10 って要するにメトロの IE10 で 64 bit なんですが、試しにこちらの状態で localStorage の読み書きを行ってみたところ、

C:\Users\oogatta\AppData\Local\Packages\windows_ie_ac_001\AC\Microsoft\Internet Explorer\DOMStore 

へアクセスがありました。場所が違います。

ちなみに保護モードも拡張保護モードもオフにすると、

C:\Users\oogatta\AppData\Local\Microsoft\Internet Explorer\DOMStore

でした。

ちなみに IE10 が期待通りに動く状態での整合性レベルは、

C:\Users\oogatta\AppData\Local\Packages\windows_ie_ac_001\AC\
C:\Users\oogatta\AppData\LocalLow\

が "Low Mandatory Level" でした。

IE の「保護モード」ってそういうことだったんですねえ…。いやあ、勉強になりました。