Buscar

Llamar un VBS desde un BAT

En el siguiente enlace vimos como mapear una unidad de red según el grupo de seguridad al que pertenece el usuario:


y en este enlace vimos como mapear una unidad de red sin que le aparezca al usuario la ruta UNC, solo la letra de unidad y una descripción:


Mientras que el primer enlace es un BAT el segundo enlace es un script VBS.

Nos preguntan como poder combinar ambos sistemas, es decir llamar un VBS desde un BAT.

Para ejecutar ficheros VBS desde un fichero BAT basta con llamar al interprete de ficheros VBS: cscript.

Encontramos este interprete en todos los sistemas Windows cliente y servidor.

Ejemplo en Windows Server 2000:

Llamar un VBS desde un BAT

A continuación veremos como desde el fichero BAT que realiza el mapa de unidad de red según el grupo de seguridad al que pertenece el usuario se realiza el mapa de la unidad desde un fichero VBS.

Dispondremos de 3 ficheros ubicados en el mismo directorio:

ESTBOOT.bat: Se encarga de averiguar a que grupo de seguridad pertenece el usuario.
Mapa-Unidad-P.vbs: Realiza el mapa de la unidad de red P:
Mapa-Unidad-L.vbs: Realiza el mapa de la unidad de red L:

El contenido de los ficheros es el siguiente:

---------------- ESTBOOT.bat ---------------------

@Echo Off

Rem ------------------------------------------
Rem - Script para realizar mapa de red según -
Rem - grupo de seguridad                     -
Rem ------------------------------------------
Rem


Net User /domain %username% | find /i "Grupo-Seguridad-1"
If Not Errorlevel 1 Goto Grupo-Seguridad-1
:End-Grupo-Seguridad-1

Net User /domain %username% | find /i "Grupo-Seguridad-2"
If Not Errorlevel 1 Goto Grupo-Seguridad-2
:End-Grupo-Seguridad-2

Goto Fin

:Grupo-Seguridad-1
Echo Cargando Grupo-Seguridad-1 ...
Net Use P: /D /Y
cscript Mapa-Unidad-P.vbs

Goto End-Grupo-Seguridad-1

:Grupo-Seguridad-2
Echo Cargando Grupo-Seguridad-2 ...
Net Use L: /D /Y
cscript Mapa-Unidad-L.vbs

Goto End-Grupo-Seguridad-2

:Fin


---------------- Mapa-Unidad-P.vbs ---------------------

'Mapa unidad P:

Set oWshNet = CreateObject("Wscript.Network")
Set oShellApp = CreateObject("Shell.Application")

sDriveLetter = "P:"
sDriveDesc = "GSEC1"
sShare = "\\SERVER01\Share-GSEC1"

' Mapeo de la unidad de red
On Error Resume Next
oWshNet.RemoveNetworkDrive sDriveLetter, True, True
On Error Goto 0
oWshNet.MapNetworkDrive sDriveLetter, sShare

' Establece la descripcion
oShellApp.NameSpace(sDriveLetter & "\").Self.Name = sDriveDesc


---------------- Mapa-Unidad-L.vbs ---------------------

'Mapa unidad L:

Set oWshNet = CreateObject("Wscript.Network")
Set oShellApp = CreateObject("Shell.Application")

sDriveLetter = "L:"
sDriveDesc = "GSEC2"
sShare = "\\SERVER01\Share-GSEC2"

' Mapeo de la unidad de red
On Error Resume Next
oWshNet.RemoveNetworkDrive sDriveLetter, True, True
On Error Goto 0
oWshNet.MapNetworkDrive sDriveLetter, sShare

' Establece la descripcion
oShellApp.NameSpace(sDriveLetter & "\").Self.Name = sDriveDesc


También podemos utilizar variables de entorno del sistema en los scripts VBS y concatenar la variable de entorno para realizar el mapa de la unidad de red.

Aquí tenéis un ejemplo:

Llamar un VBS desde un BAT


En el primer recuadro azul situamos el contenido de la variable de entorno username en la variable user.

En el segundo recuadro concatenamos la cadena "\\SERVER01\" con la variable user.

4 comentarios:

  1. Excelente Xavi por este post, en la empresa donde laboro tengo archivo .bat:
    net use U: /delete
    mkdir \\servidor\Usuario\%username%
    net use U: \\servidor\Usuario\%username%

    Lo que hace es crear la carpeta del usuario y luego le mapea su carpeta personal y hasta el momento me ha funcionado, pero viendo tus post me gustaria implementarlo con tus script e intente de hacerlo de esta forma:

    --Archivo.bat
    net use U: /delete
    mkdir \\ppsfpctg\Usuario\%username%
    cscript Archivo.vbs

    ---Archivo.vbs

    'Mapa unidad U:

    Set oWshNet = CreateObject("Wscript.Network")
    Set oShellApp = CreateObject("Shell.Application")

    sDriveLetter = "U:"
    sDriveDesc = "Usuario"
    sShare = "\\ppsfpctg\Usuario\%username%"

    ' Mapeo de la unidad de red
    On Error Resume Next
    oWshNet.RemoveNetworkDrive sDriveLetter, True, True
    On Error Goto 0
    oWshNet.MapNetworkDrive sDriveLetter, sShare

    ' Establece la descripcion
    oShellApp.NameSpace(sDriveLetter & "\").Self.Name = sDriveDesc

    Pero no me esta conectado a su carpeta personal, no se en que estoy fallando. Adema de esto me gustaria que cuando cree su carpeta personal le asigne permisos de seguridad (control total para el usuario y administrador y acceso denegados para los demás usuarios)

    ¿Hay alguna forma de hacerlo? Te agradezco de antemano tu valiosa ayuda.

    Saludos

    ResponderEliminar
    Respuestas
    1. Creo que el problema esta en la forma en que lees una variable de entorno en el script VBS.

      Desde un BAT llamas a la variable de entorno con %nombrevariable%.

      En un script VBS se hace de forma distinta.

      Aquí tienes un ejemplo:

      Set oShell = CreateObject( "WScript.Shell" )
      user=oShell.ExpandEnvironmentStrings("%UserName%")
      comp=oShell.ExpandEnvironmentStrings("%ComputerName%")
      WScript.Echo user & " " & comp

      Por otro lado sobre los permisos NTFS se pueden asignar con un BAT por ejemplo con el comando CACLS, pero como solo lo harás una vez puedes hacerlo utilizando entorno gráfico.

      No es buena idea que cada vez que el usuario inicia sesión asignes los permisos.

      Eliminar
  2. Gracias Xavi por tu respuesta.. siguiendo tus instrucciones lo hice de esta manera el archivo.vbs:

    'Mapa unidad U:

    Set oWshNet = CreateObject("Wscript.Network")
    Set oShellApp = CreateObject("Shell.Application")

    Set oShell = CreateObject( "WScript.Shell" )
    user=oShell.ExpandEnvironmentStrings("%UserName%")
    WScript.Echo user & " " & comp

    sDriveLetter = "U:"
    sDriveDesc = "Usuario"
    sShare = "\\servidor\Usuario"

    ' Mapeo de la unidad de red
    On Error Resume Next
    oWshNet.RemoveNetworkDrive sDriveLetter, True, True
    On Error Goto 0
    oWshNet.MapNetworkDrive sDriveLetter, sShare

    ' Establece la descripcion
    oShellApp.NameSpace(sDriveLetter & "\").Self.Name = sDriveDesc

    Hasta ahi bien porque me conecta la carpeta usuario pero me hace falta el parametro de "user" que no se como ingresarlo en el codigo para que enseguida relacione su carpeta por el nombre de usuario:

    sShare = "\\ppsfpctg\Usuario\%user%"

    Intento de hacerlo asi pero no conecta que es el resultado que obtiene del siguiente codigo:
    user=oShell.ExpandEnvironmentStrings("%UserName%")

    Me hace falta esa partecita y listo. Con los permisos estoy pensando de hacerlo manualmente por carpeta y porque usted recomienda de no hacerlo por codigo?

    Gracias

    ResponderEliminar
    Respuestas
    1. Hola John,

      Sobre tu primera pregunta: he modificado el post con la respuesta. La idea es que sitúes primero el contenido de la variable de entorno en una variable del VBS y luego concatenes. Verás en el ejemplo que he preparado que queda muy claro.

      Sobre la segunda cuestión: que tareas realizar desde entorno gráfico y cuales desde scripts, la respuesta es: depende del número de veces que tengas que hacer algo y modificar algo.

      Normalmente todas las cosas que configuras desde el lado cliente vale la pena automatizarlas con scripts o GPOs o GPOs que lancen scripts.

      Te pongo dos ejemplos:

      Ejemplo1: Instalar impresoras en los equipos. Si instalamos manualmente las impresoras, ¿que ocurrirá el día que quiera añadir una nueva impresora? Que tendré que ir equipo por equipo. Mejor automatizar con un script o con una GPO. En el libro GPOIT tienes un ejemplo de como desplegar impresoras por GPO.

      Ejemplo2: Unidades de red, lo mismo que el ejemplo1, para añadir una unidad nueva, tienes que ir equipo por equipo a hacerlo, mejor automatizar con un script.

      Los permisos NTFS, los configuras desde el propio servidor una sola vez, utilizando la herencia, toda la estructura tiene los mismos permisos. Es por este motivo que cuando entre un nuevo usuario, serán pocos clicks a configurar, tan solo el directorio particular del usuario, el resto simplemente será añadir el usuario a los grupos de seguridad, no tendrás de cambiar los permisos de unidades comunes o departamentales de forma habitual.

      ¡Espero que te haya sido de ayuda!

      Eliminar