無限ジャンクション解消

ジャンクションぐっちゃぐちゃ
http://d.hatena.ne.jp/John_Kawanishi/20100610#1276183538
を書いた後「具体的にどうやって直したのか書いて無いよ」とオレ通からツッこまれた訳だが、原因がわかれば直すのはそう難しく無いわけで、管理者権限でコマンドプロンプト開いて、ユーザープロファイルのディレクトリで下記のコマンドを実行しただけだった。

まずいまのジャンクションを削除して

RD "Application Data"
RD "Cookies"
RD "Local Settings"
RD "My Documents"
RD "NetHood"
RD "PrintHood"
RD "Recent"
RD "SendTo"
RD "Templates"
RD "スタート メニュー"
RD "AppData\Local\Application Data"
RD "AppData\Local\History"
RD "AppData\Local\Temporary Internet Files"
RD "AppData\Roaming\Microsoft\Windows\Start Menu\プログラム"
RD "Documents\My Music"
RD "Documents\My Pictures"
RD "Documents\My Videos"

新たにジャンクション張り直す

mklink /j "Application Data" "AppData\Roaming"
mklink /j "Cookies" "AppData\Roaming\Microsoft\Windows\Cookies"
mklink /j "Local Settings" "AppData\Local"
mklink /j "My Documents" "Documents"
mklink /j "NetHood" "AppData\Roaming\Microsoft\Windows\Network Shortcuts"
mklink /j "PrintHood" "AppData\Roaming\Microsoft\Windows\Printer Shortcuts"
mklink /j "Recent" "AppData\Roaming\Microsoft\Windows\Recent"
mklink /j "SendTo" "AppData\Roaming\Microsoft\Windows\SendTo"
mklink /j "Templates" "AppData\Roaming\Microsoft\Windows\Templates"
mklink /j "スタート メニュー" "AppData\Roaming\Microsoft\Windows\Start Menu"
mklink /j "AppData\Local\Application Data" "AppData\Local"
mklink /j "AppData\Local\History" "AppData\Local\Microsoft\Windows\History"
mklink /j "AppData\Local\Temporary Internet Files" "AppData\Local\Microsoft\Windows\Temporary Internet Files"
mklink /j "AppData\Roaming\Microsoft\Windows\Start Menu\プログラム" "AppData\Roaming\Microsoft\Windows\Start Menu\Programs"
mklink /j "Documents\My Music" "Music"
mklink /j "Documents\My Pictures" "Pictures"
mklink /j "Documents\My Videos" "Videos"

ジャンクションにはシステム属性と不可視属性がついてたので、付け直す

attrib +S +H "Application Data" /L
attrib +S +H "Cookies" /L
attrib +S +H "Local Settings" /L
attrib +S +H "My Documents" /L
attrib +S +H "NetHood" /L
attrib +S +H "PrintHood" /L
attrib +S +H "Recent" /L
attrib +S +H "SendTo" /L
attrib +S +H "Templates" /L
attrib +S +H "スタート メニュー" /L
attrib +S +H "AppData\Local\Application Data" /L
attrib +S +H "AppData\Local\History" /L
attrib +S +H "AppData\Local\Temporary Internet Files" /L
attrib +S +H "AppData\Roaming\Microsoft\Windows\Start Menu\プログラム" /L
attrib +S +H "Documents\My Music" /L
attrib +S +H "Documents\My Pictures" /L
attrib +S +H "Documents\My Videos" /L

ここまでやって元通り…と思ったら変なことがまたおきた。

あるファイル「dir /s」コマンドで検索しようとしたら

ディレクトリ名 D:\Users\kawanishi.7\AppData\Local\Application Data\Application Data\Application Data\Application Data\Application Data\Application Data\Application Data\Application Data\Application Data\Application Data\Application Data\Application Data\Broadcom\Bluetooth Software は長すぎます。

という表示が延々出てきてしまう。
張り直したジャンクションの1つが原因だった。

mklink /j "AppData\Local\Application Data" "AppData\Local"

無限ループて怖くね?
おっかしいな…正常なユーザーと同じジャンクション張り直しただけなのに…ほらちゃんとジャンクションが…開けない!?
正常なユーザープロファイルだと、これらのジャンクションへのアクセスが不許可に設定されている!!

このアクセス制御リストもコマンドラインから一括で設定する

icacls "Application Data" /l /deny Everyone:(S,RD)
icacls "Cookies" /l /deny Everyone:(S,RD)
icacls "Local Settings" /l /deny Everyone:(S,RD)
icacls "My Documents" /l /deny Everyone:(S,RD)
icacls "NetHood" /l /deny Everyone:(S,RD)
icacls "PrintHood" /l /deny Everyone:(S,RD)
icacls "Recent" /l /deny Everyone:(S,RD)
icacls "SendTo" /l /deny Everyone:(S,RD)
icacls "Templates" /l /deny Everyone:(S,RD)
icacls "スタート メニュー" /l /deny Everyone:(S,RD)
icacls "AppData\Local\Application Data" /l /deny Everyone:(S,RD)
icacls "AppData\Local\History" /l /deny Everyone:(S,RD)
icacls "AppData\Local\Temporary Internet Files" /l /deny Everyone:(S,RD)
icacls "AppData\Roaming\Microsoft\Windows\Start Menu\プログラム" /l /deny Everyone:(S,RD)
icacls "Documents\My Music" /l /deny Everyone:(S,RD)
icacls "Documents\My Pictures" /l /deny Everyone:(S,RD)
icacls "Documents\My Videos" /l /deny Everyone:(S,RD)

これで無限ループの発生も抑えられた。
しかしなんでだろ…なんで態々誰も使えないジャンクションが設定されているんだ?

Windows XPからWindows 7への移行で考慮が必要な点

 Windows XPからWindows 7への移行に際して留意しなければならない最大のポイントは、プロファイル・フォルダの構成変更だ。Windows Vistaからプロファイル・フォルダの構成が大幅に変わり、Windows 7もそれを引き継いでいる。Windows XPから移行する際にはこのことを念頭に置かないと、手作業でファイルをコピーする際にコピー先を間違えるリスクにつながる。

 変更点の概要について、以下に比較表をまとめた。フォルダ名が変化したケースや、配置場所が変わったケースがある。

Windows XP Windows Vista/7
プロファイル・フォルダ %SystemDrive %\Documents and Settings %SystemDrive%\Users
マイ ドキュメント %UserProfile %\My Documents %UserProfile%\Documents
マイ ピクチャ %UserProfile %\My Pictures %UserProfile%\Pictures
マイ ミュージック %UserProfile %\My Music %UserProfile%\Music
アプリケーション・データ %UserProfile %\Application Data %UserProfile%\AppData\Roaming
ローカル・セッティング %UserProfile%\Local Settings %UserProfile%\AppData\Local、%UserProfile%\AppData\LocalLow
デスクトップ %UserProfile%\デスクトップ %UserProfile%\Desktop
クイック起動バー %UserProfile%\Application Data\Microsoft\Internet Explorer\Quick Launch %UserProfile%\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch
送る %UserProfile%\SendTo %UserProfile%\AppData\Roaming\Microsoft\Windows\SendTo

 このうち、[マイ ドキュメント][マイ ピクチャ][マイ ミュージック]については、話が少々複雑になっている。Windows Vista/7では、互換性維持のため、これらのフォルダにアクセスを試みた際に上表の新しいパスにリダイレクトするため、[マイドキュメント][マイ ピクチャ][マイミュージック]という名前のジャンクションを隠しファイルとして用意している。ところが、これらのジャンクションへのアクセスが拒否される場合がある。筆者の経験では、これらのジャンクションに対応するパス(例えば、「%UserProfile%\My Documents\My Pictures」)をコピー元に指定する、バックアップ用のバッチ・ファイルは動作しなかった。

第2回 XP/Vista→Windows 7 完全移行マニュアル (2/6):Windows 7新時代 - @IT

Windows VistaWindows 7 では、接合ポイントと呼ばれるファイルシステムの機能が利用されており、これを利用するために、レガシ名があるシステムディレクトリに接合ポイントを含めています。しかし、エクスプローラーからこのフォルダーに移動したり、dir コマンドを発行しても、アクセスが拒否されたことを示すエラーが返されます。マイクロソフトが接合ポイントを作成したのは、MSDN ガイダンスを無視して、さまざまな既知のファイルシステムのパスをハードコードしたアプリケーションに互換性を提供するためであることは間違いないでしょう。それでは、なぜ接合ポイントを使用しても機能しないのでしょうか。

実際のところ、接合ポイントは本来の目的どおりに機能します。ですが、コマンドラインエクスプローラーからアクセスされることは、本来の目的ではありません。

中略

接合ポイントでは、互換性に関するシンボリックリンクを使用して十分なアクセス権を与えることで、ディレクトリ名をハードコードするという適切ではない方法で設計された古いアプリケーションに互換性を提供するという目標を達成しています。ただし、このような古いアプリケーションで深刻な自体を引き起こす柔軟性は与えないようにしています。また、内容を一覧表示するアクセス許可を拒否すると、経験の浅いプログラマーが、これまでと同様に古いアプリケーションのしきたりを引き続き使用するという厄介な問題を一掃できるという、すばらしい副作用があります。この手法で経験の浅いプログラマを正しい方向に導くことができたのか、ですって。時がたてばわかるでしょう。

接合ポイントの機能不全 - TechNet Magazine 2009 年 12 月号 | Microsoft Docs

だいだいわかった。ただ過去のとの互換性の為に作ってあるフォルダジャンクション(接合ポイント)じゃないんだ。レジストリだかAPIから参照すれば正しいパスが解るはずなのに、ユーザープロファイルが「C:\Documents and Settings」、マイドキュメント「My Document」にあると未だ信じて疑わない作りをしているオッペケペーなソフトを誘導するために、仕方なく作った仕組みなんだ・・・。