第8回 WshNetworkオブジェクトの詳細:Windows管理者のためのWindows Script Host入門(2/3 ページ)
ユーザー情報に基づく処理を可能にするユーザー名やコンピュータ名の取得方法と、ネットワーク・ドライブ/プリンタの利用法。
ネットワーク・ドライブの接続 ―― MapNetworkDriveメソッド ――
現在では、より汎用性の高いUNCを使ってネットワーク上の共有フォルダにアクセスできる。例えば“Server”というサーバの“Share”という共有フォルダの“Sample.txt”というファイルなら、「\\Server\Share\Sample.txt」という名前でアクセスが可能である。UNCによる名前はLANの内部で常に一意に決まるから、どのコンピュータからも同じUNC名で同じ共有ファイルにアクセス可能である。
UNC以外では、MS-DOSの時代から慣れ親しんだ「ドライブ名」も使える。例えば前述した「\\Server\Share\Sample.txt」は、「\\Server\Share」をX:ドライブに割り当てれば(「X:ドライブにマップする」ともいう)、「X:\Sample.txt」としてアクセス可能だ。いったんドライブを割り当てれば、「ファイルを開く」ダイアログなどでも通常のドライブと同じようにX:ドライブを表示させることができる。
マイ・コンピュータに表示されたネットワーク・ドライブ
共有フォルダに未使用のドライブ名を割り当てれば、物理ハードディスク・ドライブと同様にドライブ名でファイルにアクセスできるようになる。
(1)ドライブ名を割り当てた共有フォルダ。
特定のコンピュータに依存するドライブ名よりもUNC表記の方が汎用性は高いが、歴史的な経緯からドライブ名表記の方がアプリケーションとの互換性は高い。UNCが利用可能になってから10年近くたっているが、いまなおUNCに対応しておらず、ファイル名指定にはドライブ名しか使えないものも珍しくない。
MapNetworkDriveメソッドは、ネットワーク上の共有フォルダをネットワーク・ドライブとして接続し、ドライブ名を割り当てるメソッドである。次のようにして使う。
objNetwork.MapNetworkDrive ドライブ名, UNC名 [,ユーザー・プロファイルへの記録][,ユーザー名][,パスワード]
パラメータをまとめると次のようになる。
パラメータ | 型 | デフォルト* | 意味 |
---|---|---|---|
第1パラメータ (strLocalName) |
文字列 | − | ネットワーク・ドライブとして割り当てるドライブ名。省略不可 |
第2パラメータ (strRemoteName) |
文字列 | − | 共有フォルダのUNC名。省略不可 |
第3パラメータ (bUpdateProfile) |
Boolean | False | 接続情報のユーザー・プロファイルへの保存とログオン時の自動再接続(True=保存/再接続、False=保存しない) |
第4パラメータ (strUser) |
文字列 | (現在のユーザーを使用) | 接続するユーザーのユーザー名 |
第5パラメータ (strPassword) |
文字列 | (現在のユーザーを使用) | 接続するユーザーのパスワード |
MapNetworkDriveのパラメータ *パラメータ指定を省略した場合の選択肢 |
5つのパラメータがあるが、このうち後半3つは省略可能である。第1パラメータには“X:”のように、設定するドライブ名をアルファベット1文字と「:」(コロン)記号で指定する。
第2パラメータはそのドライブで接続する共有フォルダをUNC形式で指定する。例えば“\\Server\Share”のように指定する。
第3パラメータは、このドライブへの割り当ての設定をユーザー・プロファイルに記録するかどうかをTrueまたはFalseで指定する。省略した場合はFalseとなり、ユーザーがログオフするとネットワーク・ドライブは切断され、再ログオンしてもドライブは自動的には接続されない。一方Trueを指定すると、割り当て情報がユーザー・プロファイルに保存される。ただし筆者が試したところでは、このとき保存される情報は割り当てるドライブ名と接続先の共有フォルダだけで、ユーザー名やパスワード(次に述べる第4、第5パラメータ)の情報は保存されない。従ってこのパラメータを利用して接続情報を記録した場合でも、再接続に当たってユーザー名とパスワードを接続先に送信する必要がある場合(ワークグループ・ネットワークを利用している場合など)は、再接続時にユーザー名とパスワードの入力が求められる。
現在ログオンしているユーザーとは別のユーザー権限で接続する場合には、第4、第5パラメータにユーザー名とパスワードをそれぞれ指定する。これらのパラメータを省略した場合は、ログオン中のユーザーの権限で接続が行われる。
例えば次のスクリプトは、「Server」という名前のサーバに「Share1」「Share2」「Share3」という共有フォルダがあった場合に、これらをそれぞれ「X:」「Y:」「Z:」として、ネットワーク・ドライブに割り当てるものだ。なおX:ドライブは現在のユーザーでの一時的な接続、Y:ドライブは永続的な接続、Z:ドライブはユーザー名とパスワードを指定して、現在とは別のユーザーで接続している。
1: Set objNetwork = WScript.CreateObject("WScript.Network")
2: objNetwork.MapNetworkDrive "X:", "\\Server\Share1"
3: objNetwork.MapNetworkDrive "Y:", "\\Server\Share2", True
4: objNetwork.MapNetworkDrive "Z:", "\\Server\Share3", False, "user01", "password"
4行目のようにユーザー名とパスワードを指定すれば、ワークグループ環境などの場合にも、手作業でパスワードを打ち込む手間を省くことができる。ログオンのたびに自動的に接続するには、上記のようなネットワーク・ドライブ割り当てのスクリプトを[スタートアップ]メニューやタスク・スケジューラに登録しておけばよい(ユーザー・プロファイルへの記録を指定しただけでは、再ログオン後にドライブを割り当てる際、パスワードの再入力が求められる)。ただし、このスクリプトにはパスワードを平文のまま保存することになるので、Windows Script Encoder(スクリプトをコード化して人間が読めなくするツール)でエンコードを行うなど、セキュリティには十分に注意したい。Windows Script Encoderは以下のマイクロソフトのダウンロード・サイトからダウンロードできる。
ネットワーク・ドライブの切断 ―― RemoveNetworkDriveメソッド ――
RemoveNetworkDriveメソッドは、現在接続されているネットワーク・ドライブを切断するメソッドである。次のようにして使う。
objNetwork. RemoveNetworkDrive ドライブ名[,強制切断][,ユーザー・プロファイルの削除]
パラメータをまとめると次のようになる。
パラメータ | 型 | デフォルト* | 意味 |
---|---|---|---|
第1パラメータ (strName) | 文字列 | − | 切断するネットワーク・ドライブのドライブ名(省略不可) |
第2パラメータ (bForce) | Boolean | False | 強制切断の可否(使用中でも強制的に切断するかどうか) |
第3パラメータ (bUpdateProfile) |
Boolean | False | ユーザー・プロファイル情報の削除 |
RemoveNetworkDriveのパラメータ *パラメータ指定を省略した場合の選択肢 |
RemoveNetworkDriveのパラメータは3つであり、うち後半2つは省略可能である。
第1パラメータには、切断するドライブ名を指定する。
第2パラメータには、いずれかのアプリケーションが切断するネットワーク・ドライブを使用中だった場合に、強制的に切断するかどうかを指定する。省略時にはFalseとなり、ネットワーク・ドライブが使用中であればエラー・メッセージが表示され、切断は行われない。一方、明示的にTrueを指定すれば、アプリケーションが使用中でも強制的にネットワーク・ドライブが切断される。
第3パラメータは、保存されているユーザー・プロファイルの情報を削除するかどうかを指定する。省略時はFalseであり、ユーザー・プロファイルに記録されたドライブの接続情報はそのまま残され、再ログオン時には自動的な再接続が行われる。一方ここにTrueを指定すれば、記録は削除され、再ログオン時の再接続は行われなくなる。なお、手元で試した限りでは、ユーザー・プロファイルに接続情報を記録していないドライブに対し、第3パラメータにTrueを指定してRemoveNetworkDriveを実行しても、特にエラーは発生せず、単に現在の接続が切断されるだけのようだ。
MapNetworkDriveメソッドのサンプル・コードで作成したX:、Y:、Z:のネットワーク・ドライブを削除するには、次のスクリプトを実行する。
1: Set objNetwork = WScript.CreateObject("WScript.Network")
2: objNetwork.RemoveNetworkDrive "X:"
3: objNetwork.RemoveNetworkDrive "Y:", True
4: objNetwork.RemoveNetworkDrive "Z:"
ネットワーク・ドライブの一覧の取得 ―― EnumNetworkDrivesメソッド ――
EnumNetworkDrivesメソッドは、ネットワーク・ドライブの一覧を返すメソッドである。一覧はドライブ名とUNC名を交互に格納したコレクションとして返される。0番目、2番目、4番目など偶数番目のアイテムがドライブ名、1番目、3番目、5番目など奇数番目のアイテムがUNC名となる。このコレクションは、WSHのほかのコレクションと同様に、CountメソッドとLengthプロパティで全体の個数を取得できる。ただしこのとき求められる値は、ドライブ名とUNC名を合わせたコレクション全体の個数となるので、存在するネットワーク・ドライブの数の2倍となる。
EnumNetworkDrivesメソッドで返されるコレクション
EnumNetworkDrivesメソッドでは、ドライブ名とUNC名を交互に格納したコレクションとしてネットワーク・ドライブ一覧が返される。0番目、2番目、4番目など偶数番目のアイテムがドライブ名、1番目、3番目、5番目など奇数番目のアイテムがUNC名となる。
VBScriptでEnumNetworkDrivesメソッドを使う場合には、For Each文ではなくFor文を使い、「Step 2」を指定することで、各ドライブについてループ処理を行うことができる。ループ・カウンタを i とすれば、Item(i)にはドライブ名が、Item(i+1)にはUNC名が格納されていることになる。次のサンプルは、現在のネットワーク・ドライブの個数とそれぞれの接続先を表示する。
1: Set objNetwork = WScript.CreateObject("WScript.Network")
2: Set colDrives = objNetwork.EnumNetworkDrives
3: WScript.Echo "ネットワーク・ドライブは" & (colDrives.Count / 2) & "個あります。"
4: WScript.Echo "ネットワーク・ドライブの一覧を表示します:"
5: For i = 0 to colDrives.Count - 1 Step 2
6: Wscript.Echo colDrives.Item(i) & " → " & colDrives.Item (i + 1)
7: Next
これを実行すると次のような出力が表示される。
D:\WSH> cscript enumdrives.vbs
ネットワーク・ドライブは3個あります。
ネットワーク・ドライブの一覧を表示します:
X: → \\Server\Share1
Y: → \\Server\Share2
Z: → \\Server\Share3
D:\WSH>
Copyright© Digital Advantage Corp. All Rights Reserved.