Alberto Robledo Cotrina – Windows Tools and Tips

Consejos y Herramientas sobre Tecnologías Microsoft

Gestión de Salida en Scripts VBS (StdOut) y PSExec 1.72+

Posted by Alberto Robledo en noviembre 7, 2008

Imagino que en alguna ocasión os habréis encontrado con la necesidad de diseñar Scripts que ejecutan una serie de comandos y gestionan su salida.

En primer lugar, y para ejecutar un comando desde un script VBS se precisa generar un objeto de Shell y otro de Ejecución. Por ejemplo, las siguientes líneas efectúan un IPConfig:

  • strCmd = «C:\Windows\System32\IPConfig.exe /all»
  • set objShell = CreateObject («Wscript.Shell»)
  • set objExec = objShell.Exec(strCmd)

Una vez ejecutada la tercera línea, se puede gestionar cada una de las líneas de la salida del comando anterior, por ejemplo, mediante un bucle While:

  • While Not objExec.StdOut.AtEndOfStream
    • strLine = objExec.StdOut.ReadLine
  • Wend

En el ejemplo anterior se puede trabajar perfectamente con el contenido de cada línea para tratar de localizar cualquier cadena de texto a tratar posteriormente (siguiendo con el ejemplo anterior, se puede detectar la dirección MAC de una tarjeta que disponga de una IP concreta).

Ahora bien… ¿que ocurre con la utilidad PSExec? ¿También permite redirigir su salida como cualquier otro comando?

Desafortunadamente, a partir de la versión 1.72, esto no es así… ya que Microsoft rediseñó dicha utilidad para solventar otros problemas. Por tanto, a raiz de dicha modificación, ya no es posible gestionar la salida StdOut del objeto de ejecución PSExec…

Ahora bien, si aún tenéis la necesidad de ejecutar desde VBS un comando en remoto y tratar su salida debidamente… ¿cual sería la solución?

Lamentablemente la solución pasa por hacer uso del método objShell.Run redirigiendo la salida del comando hacia un fichero de texto, y abriendo el fichero a posteriori para tratar su contenido. En nuestro ejemplo anterior las líneas a ejecutar serían las siguientes:

strCmd = «C:\Temp\PsTools\PSexec.exe \\%Computername% C:\Windows\System32\ipconfig.exe /all > C:\Temp\IPResult.txt»
Set objShell = CreateObject («Wscript.Shell»)
set objFso = CreateObject («Scripting.FileSystemObject»)

objShell.Run(strCmd)

Wscript.Sleep 2000

set objFile = objFso.OpenTextFile(«C:\Temp\IPResult.txt»)

While Not objFile.AtEndOfStream
    strLine = objFile.ReadLine
Wend

De este modo se puede generar un script que ejecute cierto comando en remoto (cambiando el nombre de equipo), y volcar la salida a un fichero para tratarla posteriormente de modo oportuno.

Un saludo,

Alberto Robledo

Deja un comentario