何回かにわたって特定コンピュータ使用時でのフォルダリダイレクトを実現する方法を調査してきましたが、最終的に WSH でグループポリシーのログインスクリプトで実行することとしました。
下記のようなVBスクリプトで実現可能です。SV1~SV4にログインしたときに、フォルダリダイレクトするようになります。
Option Explicit
Dim objNet
'コンピュータ名取得 対象コンピュータなら処理する
Set objNet = CreateObject("WScript.Network")
IF StrComp(objNet.ComputerName , "SV1" ,1 ) = 0 OR _
StrComp(objNet.ComputerName , "SV2" ,1 ) = 0 OR _
StrComp(objNet.ComputerName , "SV3" ,1 ) = 0 OR _
StrComp(objNet.ComputerName , "SV4" ,1 ) = 0 Then
'リダイレクト設定
Dim strRedirectRegKey
strRedirectRegKey = "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\"
Dim strBasePath
strBasePath = "\\filesv\user\%username%\"
Dim objShell
Set objShell = WScript.CreateObject("WScript.Shell")
Dim nowDesktop , nowPersonal
'デスクトップフォルダ の現在のパスを確認
nowDesktop = objShell.RegRead(strRedirectRegKey & "Desktop")
'マイドキュメントの現在のパスを確認
nowPersonal = objShell.RegRead(strRedirectRegKey & "Personal")
'マイドキュメントリダイレクト
objShell.RegWrite strRedirectRegKey & "Personal", strBasePath & "マイドキュメント" , "REG_EXPAND_SZ"
'デスクトップリダイレクト
objShell.RegWrite strRedirectRegKey & "Desktop", strBasePath & "デスクトップ" , "REG_EXPAND_SZ"
End If
VBScriptでは、On Error Gotoが使えないのはおどろきでした。(参考:VBSでOn Error Goto ラベルは使えない! - x-bakerの試作日記)
まぁ、エラー処理をちょっと考えないといけませんね。
Windows Server 2003 R2 にターミナルサービスでログインして、フォルダリダイレクトされたマイドキュメントのファイルを削除しようとすると、下記のように削除の確認を聞いてきました。
'xxxx'をごみ箱に移しますか?
これで、はい を押下すると、下記のようなエラーになります。
ファイルまたはフォルダの削除エラー
xxxxx を削除できません。指定されたファイルが見つかりません。
パスとファイル名を確認してください。
しかし、ファイルの削除自体はできています。(ごみ箱には移動してません)
ちょうど、MSサポート:Netware サーバーにリダイレクトされた [マイ ドキュメント] フォルダ内のファイルを削除するとエラー メッセージが表示されるに書いてあるような内容と同じ現象です。
ただ、上記のサポートページはWindows2000向けで、SP3で修復されてるというのに、Winodows Server 2003 で発生するのはおかしい話です。
また、デスクトップ もリダイレクトしているんですが、こちらは削除しようとするとごみ箱を経由しない削除になります。(共有フォルダ上のファイル削除と同じ動作ですね。)
試しに、Windows Server 2008 R2 で同じことをやってみました。
すると、驚いたことに、リダイレクトしたデスクトップもマイドキュメントもごみ箱機能がちゃんと正しく動作するのです。
どうやら 2008 では、ネットワーク上にリダイレクトしてもごみ箱を使えるようにしたようですね。
削除したファイルは、リダイレクト先ルートの RECYCLER フォルダ内に置かれるようです。
これは非常に便利ですが、今回は Windows Server 2003 R2 を使うのでこの機能が使えません。
2003の時の削除エラー表示に関しては、ごみ箱機能を無効化することで回避することにしました。
ただし、サーバ側の全体でごみ箱機能を無効にすると全ユーザに影響が出てしまうので、リダイレクトを行うユーザのみ無効にするということにします。
(Windows Server 2003のとき、ごみ箱のプロパティを表示すると各ドライブ以外に マイドキュメント のタブもあるんですよね。ただこの設定もコンピュータ毎のようです。レジストリの HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\BitBucket\@\NukeOnDelete が0だとごみ箱有効のようです。普通 BitBucket の下は各ドライブ文字が入るんですが、なぜにマイドキュメントは @ 何でしょう?)
Dim strRecycleRegKeystrRecycleRegKey = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\NoRecycleFiles"
'ごみ箱使用しない
objShell.RegWrite strRecycleRegKey , 1 , "REG_DWORD"
上記のスクリプトは、グループポリシーで、ユーザの構成 → 管理テンプレート → Windowsコンポーネント → エクスプローラ → 削除されたファイルをごみ箱にいどうさせない を有効にしたとの同じ意味になります。
これで、Windows Server 2003 でのリダイレクト時のファイル削除は解決したように思ったんですが、上記のファイル削除に関するレジストリは一般ユーザでは読み取り専用になっており、書き込みができませんでした。(HKCU\Software\Microsoft\Windows\CurrentVersion\Policies 配下。本来グループポリシーの設定が入るところなので、管理者とシステム以外は書き込み禁止なのでしょうね。。)
管理者権限で実行したスクリプトで上記のレジストリを追加するといいんでしょうが、ログインスクリプトはそのログインしたユーザ権限でしか動きません。
別ユーザ権限でプロセスを実行する RUNAS コマンドもありますが、これは対話式にユーザとパスワードを入力しないといけないので、今回のようにログイン時に実行というのは無理です。
結局、別ユーザで実行するためのアプリケーションを一本作ることにしました。
そのアプリからWSHを管理者権限で動かして、レジストリに値を追加する方法です。
これについてはいずれ書きたいと思います。
参考:
StrComp 関数 | VBScript関数リファレンス WSHでの文字列比較はStrCompを使うようです。
Windows VistaでのWSH(VBScript)の管理者権限への昇格方法, 思うところはあるがここには書かない Shell.ApplicationオブジェクトのShellExecuteメソッドでもユーザ変更できるようですが、RUNAS使うため対話式にユーザとパスワードを入れないといけないようです。