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

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

ネットワークプレースを作成するVBScript

Windowsにはネットワークプレースと呼ばれる特殊フォルダあります。

(XPのヘルプを見る限り、マイクロソフトの意図としてはFTPWEBDavExplorerで扱いやすくするために作られたようですが、実際は共有フォルダへのリンク先となっているのがほとんどですよね。)

共有フォルダのネットワークプレースを作成すると、何かのアプリケーションでフォルダツリーから共有フォルダを選ばないといけない時でも、いちいちマイネットワークからツリーを展開してホストを指定して共有フォルダを選択して、、といった面倒なことをしなくて済みます。

(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でコピーした後、一気にファイル属性を変更しネットワークプレース化するスクリプトが載せられています。

謎のフォルダショートカットを調べて - seraphyの日記

VBScript ランゲージ リファレンス - Attributes プロパティ