3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援→開発戻り浦島太郎状態の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。

特殊フォルダリダイレクトのレジストリ操作 by コマンドプロンプト(バッチ)

(ActiveDirectory)グループポリシーのセキュリティフィルタとWMIフィルタで、リダイレクト設定をしたグループポリシーのフィルタについて取り上げました。WMIフィルタがよさげだけど、Windows 2000の存在する環境じゃダメということで、直接レジストリを操作するバッチファイルを作成し、ログインスクリプトで動かしてやろうと思いつきました。

具体的に、バッチファイルで、リダイレクト対象端末稼働のかチェック → 対象端末ならレジストリ直接変更 という流れです。

まず、特殊フォルダのリダイレクトについてですが、これらの設定はレジストリで各ユーザのレジストリで持っているようです。

場所は、下記の場所となります。

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders

(HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders ってのもありますが、Shell Folders の内容は、ユーザーがログオンするたびに User Shell Folders の内容で上書きされるようです。従って、変更するのは User Shell Folders の内容だけでよいとのことです。

参考:Windows Tip - Customize the Registory Keys for User Folders:)

ここに、マイドキュメントを表す Personal や、デスクトップを表す Desktop など、多数のユーザ毎に持つ特殊フォルダのパスが設定されています。

ちなみに、データ型は REG_EXPAND_SZ なので、環境変数を指定してもちゃんと展開して理解してくれそうです。

(レジストリのデータ型については、@IT:.NET TIPS レジストリの値のデータ型を判別するには?参照。)

また、コマンドプロンプトからのレジストリ操作は、 reg.exe を使ったら容易にできるようです。

(これについては、@IT:Windows TIPS -- Tips:コマンド・プロンプトでレジストリを操作する参照。)

今回のフォルダリダイレクトを実現するためには下記のようにレジストリを設定したらいいようです。

reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v "Desktop" /d "\\sv1\user\%username%\デスクトップ"

reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v "Personal" /d "\\sv1\user\%username%\マイドキュメント"

%username% 環境変数を使えるので、これでログインアカウント名のフォルダにリダイレクトできますね。

あとは、対象となるコンピュータでのみこのバッチファイルを実行するようにして、グループポリシーのログインスクリプトで流せばいいのですが、ここで詰まりました。

対象となるコンピュータかどうかは下記のコマンドで判断できるのですが。。。

if not /i "%HOSTNAME%" == "testsv1" (

EXIT

)

問題はこのバッチファイル内での IF 文で論理演算ができないことです。

今回対象となるコンピュータが複数台あるので、論理演算で OR や AND が使えないと意味がありません。

ということで、この方法も没ですが、コマンドプロンプトからレジストリ操作できるのと、バッチのIF文のダメダメな仕様に気付けてよかったです。

参考:

フォルダー リダイレクトでは、Windows のレジストリ設定