web-dev-qa-db-fra.com

Accéder au partage réseau depuis VBScript, par exemple FileSystemObject

Existe-t-il un bon moyen d'accéder aux partages réseau à partir d'un script VBS, avec des informations d'identification alternatives (pas les informations d'identification avec lesquelles le script VBS s'exécute)?

L'intention est d'effectuer deux tâches:

  1. naviguer par programmation dans une structure de fichiers de partage à distance, afin de confirmer l'existence de deux fichiers distants et de copier un fichier sur l'autre (tous deux distants)
  2. copier des fichiers depuis un lecteur local (accessible avec un nom d'utilisateur/des autorisations locaux) vers un lecteur distant (accessible avec les informations d'identification alternatives)

Autant que je sache, FSO (Scripting.FileSystemObject) est hors de l'image, car il s'exécute toujours avec les informations d'identification de l'application qui l'utilise - qui serait l'utilisateur de la machine locale. (?)

La seule approche d'apparence viable que j'ai trouvée lors de la recherche sur Google pour préparer un fichier batch (ou un appel étendu à "cmd.exe") qui utilise "Net Use" pour fournir les informations d'identification de partage à distance, puis copie les fichiers avec robocopy ou similaire , depuis la même "session" de shell de commande. Cela fonctionnerait bien pour copier/déployer des fichiers du lecteur local vers le partage distant, mais il serait très compliqué et fragile de faire n'importe quel type de navigation dans le système de fichiers (comme vous le feriez avec FSO) de cette manière.

Une autre possibilité que j'ai envisagée consiste à avoir deux sessions de script - vous appelez le script (en fournissant les informations d'identification alternatives dans la ligne de commande) et il exécute une session cmd.exe, qui effectue d'abord une "utilisation nette" pour mapper le partage distant sur un partage temporaire disque local, puis s'exécute en mode "fait vraiment des choses" et utilise FSO, puis quand il est fait (de retour dans le shell cmd.exe) déconnecte à nouveau le lecteur temporaire avec "Net Use". C'est maladroit (plusieurs fenêtres, lecteur temporaire ...) et je ne suis même pas sûr que cela fonctionnerait.

Quelqu'un connaît-il l'une ou l'autre façon ou connaît-il une alternative viable? (coller à VBScript/WScript sur une machine Windows 2000 - pas PowerShell!)

19
Tao

OK, je travaillais sous une idée fausse - que FSO ne "ramasserait" pas les informations d'identification réseau établies avec "Net Use" (ou Wscript.Network "MapNetworkDrive").

Il s'avère que c'est le cas, et l'exemple de code suivant fonctionne très bien (sans avoir besoin de configurer des lecteurs réseau temporaires):

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