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

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

WSHを使って特定コンピュータのみフォルダリダイレクトの設定 Part1

何回かにわたって特定コンピュータ使用時でのフォルダリダイレクトを実現する方法を調査してきましたが、最終的に 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 strRecycleRegKey

strRecycleRegKey = "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を使うようです。

@IT:WSHでのレジストリ書き込み

WSHを始めよう - @IT

ごみ箱のプロパティの設定が淡色表示でクリックできない

Windows VistaでのWSH(VBScript)の管理者権限への昇格方法, 思うところはあるがここには書かない Shell.ApplicationオブジェクトのShellExecuteメソッドでもユーザ変更できるようですが、RUNAS使うため対話式にユーザとパスワードを入れないといけないようです。

ishihara log フォルダのリダイレクト