2009-03-10 16 views
18

¿Existe una buena forma de acceder a los recursos compartidos de red desde un script VBS, con credenciales alternativas (no las credenciales con las que se ejecuta el script VBS)?Acceda a la red compartida desde VBScript, por ejemplo, FileSystemObject

La intención es llevar a cabo dos tareas:

  1. navegar programación una estructura de archivos compartido remoto, con el fin de confirmar que existe un par de archivos remotos, y copiar un archivo sobre el otro (tanto a distancia)
  2. copiar archivos desde una unidad local (acceso con nombre de usuario locales/permisos) a una unidad remota (se accede con las credenciales alternativas)

por lo que yo puedo decir FSO (Scripting.FileSystemObject) es fuera de la foto porque siempre se ejecuta con las credenciales de la aplicación que lo usa, que sería el usuario de la máquina local. (?)

El único enfoque viable que he encontrado al buscar en Google para preparar un archivo por lotes (o llamada extendida a "cmd.exe") que usa "uso de red" para proporcionar las credenciales de recurso compartido remoto, y luego copia los archivos con robocopy o similar, desde dentro de la misma "sesión" de comando-shell. Esto funcionaría bien para copiar/desplegar archivos desde la unidad local al recurso compartido remoto, pero sería muy complicado y frágil hacer cualquier tipo de exploración del sistema de archivos (como lo haría con FSO) de esta manera.

Otra posibilidad que he considerado implica tener dos sesiones de scripting: llama al script (proporciona las credenciales alternativas en la línea de comandos) y ejecuta una sesión cmd.exe, que primero hace un "uso de red" para asignar el control remoto compartir en una unidad local temporal, luego se ejecuta en un modo "realmente hacer cosas" y utiliza FSO, luego cuando está hecho (de vuelta en el shell cmd.exe) desconecta la unidad temporal con "uso de red" de nuevo. Esto es torpe (ventanas múltiples, unidad temporal ...) y ni siquiera estoy seguro de que funcione.

¿Alguien sabe de alguna manera, o sabe de una alternativa viable? (apegándose a VBScript/WScript en una máquina Windows 2000 - ¡no PowerShell!)

Respuesta

31

OK, estaba trabajando bajo un concepto erróneo - que FSO no "captaría" las credenciales de red establecidas con "NET USE" (o Wscript. Red "MapNetworkDrive").

Resulta que lo hace, y el código de ejemplo funciona muy bien (sin necesidad de configurar las unidades de red temporales):

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 
+0

Muy útil, gracias – Zsolti

+0

general a un lado: el otro día me encontré con otra pregunta que aborda el mismo problema con "NET USE" directamente: http://stackoverflow.com/questions/3716422/how-can-i-map-a-network-drive-without-hardcoding-a-drive-letter- como un archivo por lotes – Tao

Cuestiones relacionadas