Windowsにはネットワークプレースと呼ばれる特殊フォルダあります。
(XPのヘルプを見る限り、マイクロソフトの意図としてはFTPやWEBDavをExplorerで扱いやすくするために作られたようですが、実際は共有フォルダへのリンク先となっているのがほとんどですよね。)
共有フォルダのネットワークプレースを作成すると、何かのアプリケーションでフォルダツリーから共有フォルダを選ばないといけない時でも、いちいちマイネットワークからツリーを展開してホストを指定して共有フォルダを選択して、、といった面倒なことをしなくて済みます。
(XPだとデフォルトでマイネットワーク直下にネットワークプレースが作成されます。また、自動的にできることもあります)
さて、PC台数が多いときにログインスクリプトとかで簡単に任意のネットワークプレースを作成する方法を調査してました。
まずはこのネットワークプレースと呼ばれる特殊フォルダの仕組みについてです。
ネットワークプレースの構成は通常のフォルダ配下に desktop.ini と target.link というショートカットがあるだけです。
target.linkはネットワークプレースのリンク先へのショートカットとなっています。
desktop.iniは下記のような内容となっています。
[.ShellClassInfo]
CLSID2={0AFACED1-E828-11D1-9187-B532F1E9575D}
Flags=2
上記の0AFACED1-E828-11D1-9187-B532F1E9575Dは「フォルダショートカット」と呼ばれる COM クラスで、通常のショートカットをフォルダとして名前空間の一部に割り付ける機能があるようですね。
この機能を使って、ネットワークプレースはフォルダツリー可能なショートカットとなっているわけですね。
(ただあくまでショートカットなので、シンボリックリンク(ジャンクション)と異なり、リンク先のアドレスは、実際の共有フォルダのUNCとなります。)
これで、desktop.ini のファイル属性をシステムファイルかつ隠しファイルにし、desktop.iniの親フォルダの属性を読取専用にすると、あら不思議、エクスプローラから見るとネットワークプレースとして見えるわけです。
構造さえ分かれば作成するのは簡単ですね。
本題のネットワークプレースを作成するVBScript(WSH)は下記のような感じとなります。(文字数の制限でハイライトはOFFです。)
'ネットワークプレース名
NetPlaceName = "給与_共有フォルダ"
'ネットワークプレースのリンク先共有フォルダ
NetPlacePath = "\\サーバ名\共有フォルダ名"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set oWSHShell = CreateObject("Wscript.Shell")
'-------フォルダ作成(ネットワークプレースになるフォルダ)-------
'このスクリプトを実行したパスに、ネットワークプレースを追加する。
ShPath = objFSO.CreateFolder(".\" & NetPlaceName)
'例えばデスクトップ上に作りたい時とかはこうする
'DeskTop = oWSHShell.SpecialFolders("Desktop")
'ShPath = objFSO.CreateFolder(DeskTop & "\" & NetPlaceName)
'-------Desktop.iniの作成-------
'Desktop.iniファイル作成しネットワークプレース用のCOMクラス定義
Set oLog = objFSO.CreateTextFile( ShPath & "\Desktop.ini" )
'Desktop.iniファイルのCOMクラス定義文字列
strCOM = "[.ShellClassInfo]" & vbCrLf & _
"CLSID2={0AFACED1-E828-11D1-9187-B532F1E9575D}" & vbCrLf & _
"Flags=2"
'Desktop.iniにCOMクラス定義文字列出力
oLog.WriteLine(strCOM)
oLog.Close()
Set oLog = Nothing
'-------ショートカット(target.link)の作成-------
Set oShell = CreateObject("Shell.Application")
Set oShortcut = oWSHShell.CreateShortcut(ShPath & "\target.lnk")
'ショートカット先を指定
oShortcut.TargetPath = NetPlacePath
'ショートカット保存
oShortcut.Save
Set oShell = Nothing
'-------Desktop.iniとフォルダの属性変更-------
'Desktop.iniのファイル取得
Set file = objFSO.GetFile(ShPath & "\Desktop.ini")
'Desktop.iniが隠しファイルじゃないなら隠しファイル属性付与
If file.Attributes = file.Attributes AND 2 Then
file.Attributes = file.Attributes XOR 2
End If
'Desktop.iniがシステムファイルじゃないならシステムファイル属性付与
If file.Attributes = file.Attributes AND 4 Then
file.Attributes = file.Attributes XOR 4
End If
'フォルダ取得(ネットワークプレースになるフォルダ)
Set folder = objFSO.GetFolder(ShPath)
'フォルダ自身が読み取り専用じゃないなら読取専用属性付与
If folder.Attributes = folder.Attributes AND 1 Then
folder.Attributes = folder.Attributes XOR 1
End If
Set objFSO = Nothing
参考:
フォルダリンクを利用する - Entering Passive Mode ネットワークプレースをはじめとした特殊フォルダの説明です。
Ken's Memo: Windows のネットワークプレースを複数マシンで共有する ネットワークプレースを複数PCでコピーした後、一気にファイル属性を変更しネットワークプレース化するスクリプトが載せられています。