web-dev-qa-db-ja.com

VBScript内からネットワーク共有にアクセス(例:FileSystemObject)

VBSスクリプトを実行している資格情報ではなく、別の資格情報を使用して、VBSスクリプト内からネットワーク共有にアクセスする良い方法はありますか?

その目的は、次の2つのタスクを実行することです。

  1. プログラムでリモート共有ファイル構造をナビゲートして、いくつかのリモートファイルが存在することを確認し、1つのファイルを他のファイル(両方のリモート)にコピーする
  2. ローカルドライブ(ローカルのユーザー名/権限でアクセス)からリモートドライブ(代替の資格情報でアクセス)にファイルをコピーする

FSO(Scripting.FileSystemObject)は、それを使用するアプリケーションの資格情報(ローカルマシンのユーザー)で常に実行されるので、私が知る限り、この問題は解決していません。(?)

「ネット使用」を使用してリモート共有認証情報を提供し、robocopyなどでファイルをコピーするバッチファイル(または「cmd.exe」への拡張呼び出し)を準備するためにグーグルで見つけた唯一の実行可能な方法のアプローチ、同じコマンドシェル「セッション」内から。これは、ローカルドライブからリモート共有にファイルをコピー/展開する場合は問題なく機能しますが、この方法で(FSOの場合と同様に)あらゆる種類のファイルシステムの参照を行うのは非常に複雑で脆弱です。

私が検討したもう1つの可能性は、2つのスクリプトセッションを使用することです。スクリプトを呼び出し(コマンドラインで代替の資格情報を提供します)、cmd.exeセッションを実行します。最初に "Net Use"を実行して、リモート共有を一時的にマップしますローカルドライブは、それ自体を「実際に何かを行う」モードで実行し、FSOを使用します。それが完了すると(cmd.exeシェルに戻って)、一時的なドライブを「Net Use」で再び切断します。これは不格好(複数のウィンドウ、一時ドライブなど)であり、動作するかどうかさえわかりません。

誰かがどちらかの方法を知っているか、または実行可能な代替案を知っていますか? (Windows 2000マシンのVBScript/WScriptに固執-PowerShellなし!)

19
Tao

OK、私はFSOが "Net Use"(またはWscript.Network "MapNetworkDrive")で確立されたネットワーク資格情報を "取得"しないという誤解の下で働いていました。

次のサンプルコードは非常に適切に機能します(一時的なネットワークドライブを設定する必要はありません)。

ServerShare = "\\192.168.3.56\d$"
UserName = "domain\username"
Password = "password"

Set NetworkObject = CreateObject("WScript.Network")
Set FSO = CreateObject("Scripting.FileSystemObject")

NetworkObject.MapNetworkDrive "", ServerShare, False, UserName, Password

Set Directory = FSO.GetFolder(ServerShare)
For Each FileName In Directory.Files
    WScript.Echo FileName.Name
Next

Set FileName = Nothing
Set Directory = Nothing
Set FSO = Nothing

NetworkObject.RemoveNetworkDrive ServerShare, True, False

Set ShellObject = Nothing
Set NetworkObject = Nothing
33
Tao