Home Windows AD: Scripts de inicio en PowerShell y BAT para mapear unidades de red

AD: Scripts de inicio en PowerShell y BAT para mapear unidades de red

by José Luis Sánchez Borque

En el siguiente POST os voy a mostrar como de forma sencilla, se pueden crear scripts de inicio de sesión de usuarios en Active Directory,. El objetivo será mapear carpetas de RED de un File Server en los equipos de clientes en el inicio de sesión. De esta forma se pueden centralizar los Backups corporativos, al estar toda la información en un servidor de archivos (File Server)

Os lo mostraré con el tradicional BAT de nuestro antiguo y querido DOS, y en PowerShell.

Planteemos el típico caso de una empresa con dos departamentos, Marketing y RRHH. Dentro de cada departamento hay varios usuarios (en nuestro escenario solo uno por comodidad).

La estructura lógica del dominio queda de la siguiente manera:

Interfaz de usuario gráfica, Texto, Aplicación Descripción generada automáticamente

Interfaz de usuario gráfica, Texto, Aplicación, Chat o mensaje de texto Descripción generada automáticamente

Interfaz de usuario gráfica, Texto, Aplicación, Chat o mensaje de texto Descripción generada automáticamente

Importante destacar lo siguiente:

  • El grupo gTodosUsuarios contiene los grupos gMarketing y gRRHH (anidación de grupos)
  • Así mismo Joan Serradell es miembro de gMarketing, y Agustí Martorell de gRRHH

Desde «dirección» nos han propuesto las siguientes especificaciones a la hora de almacenar la información en el Servidor de Archivos:

  • Cada Departamento debe tener una carpeta común en el servidor de archivos donde trabajar de forma colaborativa (Unidad mapeada Q:)
  • Cada Usuario debe tener una carpeta privada en el servidor de archivos donde almacenar sus documentos personales (Unidad mapeada P:)
  • El grupo de Administradores debe tener permiso sobre toda la estructura, y un usuario denominado Backup permisos de lectura para poder hacer copias.

Los datos de usuario nunca habría que mezclarlos con el disco de sistema. En mi caso, y por comodidad me salto la regla a la torera y creo toda la estructura de carpetas en la unidad C:, bajo la carpeta «Datos Escenarios»

La estructura puede variar, no es única. Cómo siempre digo, hasta unos meses después no sabrás si “has acertado”. Si cuando hay algún cambio tienes que hacer el “pino puente” es que la estructura, quizá,s no era la más adecuada.

Veamos como quedan los permisos NFTF, que recodemos cuentan tanto si accedes a la carpeta de forma local o de forma remota.

Tabla Descripción generada automáticamente

IMPORTANTE: hemos quitado la herencia en la carpeta C:\Datos escenario. No queremos que los permisos de la unidad C: se propaguen sobre toda la estructura. A partir de aquí, si añadimos el grupo Administradores y el usuario BackUp con los permisos adecuados, no hará falta añadirlos a TODAS las demás, pues en estas si actuará la herencia que en este caso nos va bien. En la tabla superior podéis ver los permisos NTFS asignados.

Ahora queda compartir las carpetas, pues recordemos que los clientes se conectan al Servidor de Archivos a través de la red.

MUY IMPORTANTE ver que hemos puesto el grupo TODOS con el permiso de Cambiar y lectura al compartir las carpetas.. Alguno se puede “tirar de los pelos” pensando que todos tendrán acceso. Nada más lejos de la realidad. Si que es cierto que cuando te conectas por la red, sobre el recurso compartido se podrían llegar a modificar cosas, pero……..RECORDAD que hemos limitado el acceso por permisos NTFS, y que SIEMPRE CUENTAN LOS MÁS RECTRICTIVOS.

De esta forma, solo tendré que pensar en los permisos NTFS. Pero para gustos los colores, quien se quiera complicar la vida tiene mi bendición…

Tabla Descripción generada automáticamente

METODO 1 – Fichero BAT de toda la vida.

En la ficha de los usuarios (todos) añadimos el script que queremos se ejecute de forma automática cuando estos inicien sesión en el dominio.

Interfaz de usuario gráfica, Aplicación Descripción generada automáticamente

Solo nos queda crear el archivo en la ruta adecuada. Os lo adjunto a continuación. No he optimizado el código con estructuras IF-ELSE por claridad de código.

Archivo: inicio.bat

Ruta: C:\Windows\SYSVOL\sysvol\mytcpip.loc\SCRIPTS

REM *******************************
REM *  Script inico dominio       *
REM * Ver: 1.0                    *
REM * Autor: José Luis Sánchez    *
REM *******************************

@echo off
cls

REM ****************************
REM * Borramos mapeo si existe *
REM ****************************

IF exist q:\nul (net use q: /d)
IF exist p:\nul (net use p: /d)

REM ********************************
REM * Miramos si es del grupo RRHH *
REM * Mapeamos unidad -> Q:        *
REM ********************************

net user %username% /domain | find /i "gRRHH" > NUL
IF %ERRORLEVEL% EQU 0 (
  net use q: \\dc01\rrhh
)

REM *******************************
REM * Miramos si es del grupo MKT *
REM * Mapeamos unidad -> Q:       *
REM *******************************

net user %username% /domain | find /i "gMarketing" > NUL
IF %ERRORLEVEL% EQU 0 (
  net use q: \\dc01\marketing
)

REM *********************************
REM * Mapeamos unidad privada -> P: *
REM *********************************

net use p: \\dc01\%username%$

El archivo lo tenemos que almacenar en la carpeta:

C:\Windows\SYSVOL\sysvol\mytcpip.loc\SCRIPTS

Esta carpeta es el recurso compartido NETLOGON, dónde el sistema por defecto busca los script que añadimos en la ficha de usuario como habéis visto en la imagen anterior del usuario A. Martorell.

PS C:\Users\Administrador> get-smbshare netlogon

Name       ScopeName Path 
----       --------- -----
NETLOGON       *     C:\Windows\SYSVOL\sysvol\mytcpip.loc\SCRIPTS

Al iniciar la sesión con el usuario A. Martorell las dos unidades mapeadas aparecen en el sistema:

Interfaz de usuario gráfica Descripción generada automáticamente con confianza media

Cómo podéis comprobar, no hemos puesto cuotas, es decir, si nos despistamos pueden llenar el disco duro del servidor. En otro POST ya os enseñaré como se gestionan las cuotas.

METODO 2 – PowerShell, ya algo más actual…

Aquí el proceso no es tan sencillo. Primero has de saber Powershell 😊, y luego saber cómo ejecutarlo cuando un usuario se valide en el sistema, e instalar RSAT, y …. Vamos que es un poco más complicado.

En primer lugar nos validamos en la máquina cliente con la cuenta del administrador del dominio para hacer dos procesos:

  1. Instalar las herramientas RSAT vía características opcionales del cliente
  2. Permitir la ejecución de cualquier tipo de script PowerShell

Lo primero es fácil, desde panel de control buscamos características opciones de nuestro equipo y se instala el paquete de la imagen adjunto. Ojo, si tu Windows es una versión más antigua, tendrás que buscar en Internet cómo hacerlo… Suerte!!!

Interfaz de usuario gráfica, Texto, Aplicación, Correo electrónico Descripción generada automáticamente

Esto nos permitirá ejecutar Comand-Lets desde los clientes. Una vez instalado, y validados como administradores en la máquina clientes debemos ejecutar bajo una terminal de PowerShell la orden:

PS C:\Users\Administrador> Import-Module activedirectory

El segundo punto abrimos un terminal de Powershell como administrador y ejecutamos el comando:

PS C:\Users\Administrador> Set-ExecutionPolicy Unrestricted

Esto lo tendríamos que hacer en cada equipo cliente del domino. Está claro que existen mecanismos vía GPO para automatizar este proceso. Esto queda fuera de este POST.

Una vez hemos hecho los dos pasos anteriores escribimos el script con nuestra aplicación favorita: Visual Studio Code, Notepad++, etc.

Os lo adjunto aquí:

Nombre: inicio.ps1

$Usuario = $env:UserName

# Borramos unidades si están mapeadas

if (Get-SmbMapping -LocalPath P: -ErrorAction SilentlyContinue) {
  Remove-SmbMapping -LocalPath P: -Force
}

if (Get-SmbMapping -LocalPath Q: -ErrorAction SilentlyContinue) {
  Remove-SmbMapping -LocalPath Q: -Force
}

# Mapeamos carpeta de Usuario si está dentro de la OU ESCENARIO.
# Resto usuarios NO mapeamos

$ADUser = Get-ADUser -Filter "SamAccountName -eq '$Usuario'" -SearchBase "OU=ESCENARIO,DC=mytcpip,DC=loc"

if ($ADUser) {
  New-SmbMapping -LocalPath 'P:' -RemotePath "\\dc01\$Usuario$"
}

$ADUser = Get-ADUser -Filter "SamAccountName -eq '$Usuario'" -SearchBase "OU=Dpto. Marketing,OU=ESCENARIO,DC=mytcpip,DC=loc" -SearchScope OneLevel

if ($ADUser) {
  New-SmbMapping -LocalPath 'Q:' -RemotePath "\\dc01\Marketing"
} else {
  $ADUser = Get-ADUser -Filter "SamAccountName -eq '$Usuario'" -SearchBase "OU=Dpto. RRHH,OU=ESCENARIO,DC=mytcpip,DC=loc" -SearchScope OneLevel
  if ($ADUser) {
    New-SmbMapping -LocalPath 'Q:' -RemotePath "\\dc01\RRHH"
  }
}

Recordad si estáis siguiendo este POST, y habéis probado el anterior método con fichero .BATA,  tendréis que quitarlo.

Para que el Script se ejecute al iniciar la sesión, no es tan fácil como con el primer método. Aquí tenemos que crear y vincular una nueva GPO en la OU ESCENARIO, que es donde queremos que se ejecute el script de PowerShell.

Abrimos la consola de directivas de grupo.

Interfaz de usuario gráfica, Texto, Aplicación Descripción generada automáticamente

Sobre la OU ESCENARIO elegimos la opción de crear una GPO y vincularla en la OU.

Interfaz de usuario gráfica, Texto, Aplicación, Correo electrónico Descripción generada automáticamente

En mi caso le he puesto como nombre “GPO ESCENARIO”

Interfaz de usuario gráfica, Texto, Aplicación, Chat o mensaje de texto Descripción generada automáticamente

Con el botón derecho la editamos y buscamos la opción Configuración de Usuario 🡪 Directivas 🡪 Configuración de Widnows 🡪 Scripts 🡪 Iniciar sesión

Interfaz de usuario gráfica, Texto Descripción generada automáticamente

Tendremos que agregar el script con el botón Agregar. Ojo!!!, antes tendremos que poner el script donde toca, es decir, en la carpeta que se ha creado para la GPO dentro del recurso compartido SYSVOL del servidor.

El identificador de la directiva lo encontraras al seleccionar la directiva:

Podemos ver donde el controlador de dominio almacena las GPO, directivas..

Texto Descripción generada automáticamente

Pues dentro de dicha carpeta, en la carpeta que os adjunto se guarda el script.

Interfaz de usuario gráfica, Aplicación, Word Descripción generada automáticamente

Una vez lo tengamos en dicha carpeta, con el botón Agregar como os he comentado lo añadimos. Importante seleccionar la opción Ejecutar los script de Windows PowerShell al principio.

Si no os habéis equivocado en ningún paso, al validarnos con el usuario Agustí Martorell tendremos las unidades mapeadas.

Interfaz de usuario gráfica Descripción generada automáticamente

Ahora ya depende de ti elegir un método u otro, y adaptar los Scripts para realizar más procesos que no solo mapear unidades.

 

You may also like

Leave a Comment