Home Windows PowerShell y Active Directory

PowerShell y Active Directory

by José Luis Sánchez Borque

Vamos a tratar en este POST la creación mediante PowerShell de toda una estructura de OUs, Grupos, Usuarios y carpetas en nuestro Active Directory.  Toda la estructura la leeremos de un fichero EXCEL que contiene toda la información que tenemos que crear.

Os adjunto el fichero alumnos-escuela.zip con la siguiente información:

  • alumnos-escuela.xlsx:  Fichero excel original con todos los datos de los alumnos a tratar (no está en el fichero .zip)
  • alumnos-escuela.csv: Fichero exportado a formato csv con codificación UTF8
  • Crea-Estructura.ps1: Script PowerShell que crea toda la estructura
  • Borra-Estructura.ps1: Script PowerShell que borra toda la estrucura.

Al final de POST encontraréis un video de mi canal con las explicaciones más detalladas.

Un dato importante es que no he pretendido crear un Script optimizado al máximo. He preferido dar un enfoque docente que mejora la claridad y entendimiento del Script.  Detallar también que habría que mejorar el script controlando posibles repeticiones de nombres de usuarios…. Lo dejo en tus sabias manos 🙂

Importante instalar el módulo Windows PowerShell Module for managing file and folder security on NTFS volumes antes de ejectuar el Script. Dicho módulo añade varios command lets que permiten administrar permisos NTFS directamente tales como: add-NTFSAccess.

Os dejo al final del POST un video donde os explico el funcionamiento de todo esto. 

El funcionamiento es muy sencillo. En primer lugar tenemos un EXCEL que contiene los datos de alumnos de una escuela imaginaria. Dichos alumnos pertenecen a un determinado ciclo formativo, y dentro de este a un grupo en concreto.  Podemos verlo en la imagen adjunta. 

Por ejemplo el alumno Caldwell Waldren está cursando el ciclo formativo ICA0 Administració de Sistemes Informàtics en Xarxa, y es alumno de primer curso, en concreto del grupo S1SX. El resto de datos son obvios: calle, ciudad, etc.

Es muy importante que prestéis atención en el vídeo a la estructura que pretendemos crear, es decir, el final de la «película». Con eso daremos sentido a todas y cada una de las líneas del Script.

Como en el videos ya os explico todo, solo comentar el comand let Import-Csv. Permite crear objetos personalizados en forma de tabla a partir de los elementos en un archivo de valores separados por comas (CSV). Examinemos la siguiente orden:

$usuarios = Import-Csv -Path C:\alumnos-escuela.csv -Delimiter ";" -Encoding UTF8

Crea el objeto $usuarios, que contiene todas las filas del archivo alumnos-escuela.csv. Importante tener presente que la primera fila debe contener los nombres de cada campo: nombre, apellido, ciudad, etc. Igualmente importante exportar con formato UTF8, o tendremos problemas con los acentos, etc.

A partir de aquí si visualizamos el objeto en formato tabla veremos su contenido:

PS C:\> $usuarios = Import-Csv -Path C:\alumnos-escuela.csv -Delimiter ";" -Encoding UTF8
PS C:\> $usuarios | Format-Table nombre,apellido,ciclo,grupo

nombre      apellido        ciclo                                               grupo
------      --------        -----                                               -----
Caldwell    Waldren         ICA0 Administració de Sistemes Informàtics en Xarxa S1SX
Crawford    Cocher          ICA0 Administració de Sistemes Informàtics en Xarxa S1SX
Donnie      Briscam         ICA0 Administració de Sistemes Informàtics en Xarxa S1SX
Fayina      Diggens         ICA0 Administració de Sistemes Informàtics en Xarxa S1SX
Benedicta   Rimes           ICA0 Administració de Sistemes Informàtics en Xarxa S1SX
Elvera      Sinnatt         ICA0 Administració de Sistemes Informàtics en Xarxa S1SX
Valina      Quinsee         ICA0 Administració de Sistemes Informàtics en Xarxa S1SX

Bien os dejo tanto el script de crear la estructura como el de borrarla. Atentos a los comentarios del video donde se os justifican las diferentes opciones.

Crear-estructura.ps1

# 
Antes de ejecutar el script debes instalar el módulo NTFSSecurity 4.2.4
# https://www.powershellgallery.com/packages/NTFSSecurity/4.2.4
#
# PS> Install-Module -Name NTFSSecurity -RequiredVersion 4.2.4
#
# La versión podría ser superior a la 4.2.4 que es la última a día de 
# publicación del POST

$ruta = "dc=profe,dc=local"
# Creamos carpeta principal c:\datos que centralizará en 
# el servidor la información de los usuarios vía recursos compartidos
New-Item -Path c:\ -Name Datos -ItemType Directory
Disable-NTFSAccessInheritance -Path c:\Datos
Clear-NTFSAccess -Path c:\Datos
Add-NTFSAccess -Path c:\datos -Account Administradores -AccessRights FullControl
Add-NTFSAccess -Path c:\datos -Account Backup -AccessRights Modify

$usuarios = Import-Csv -Path C:\Pwshell\alumnos-escuela\alumnos-escuela.csv -Delimiter ";" -Encoding UTF8
New-ADOrganizationalUnit -Name ESCOLA -Path "dc=profe,dc=local" -ProtectedFromAccidentalDeletion $false
New-ADGroup -Name ("Grupo ESCOLA") -Path ("ou=escola," + $ruta) -GroupScope Global -GroupCategory Security 
$ciclos = $usuarios | Group-Object -Property ciclo -NoElement
foreach ($ciclo in $ciclos) { 
    Write-Output ("Creando CICLO " + $ciclo.name)
    New-ADOrganizationalUnit -Name $ciclo.name -Path "ou=escola,dc=profe,dc=local" -ProtectedFromAccidentalDeletion $false
    New-ADGroup -Name ("Grupo " + $ciclo.Name) -Path ("ou=" + $ciclo.name + ",ou=escola," + $ruta) -GroupScope Global -GroupCategory Security 
    Add-ADGroupMember -Identity "Grupo ESCOLA" -Members ("Grupo " + $ciclo.Name)
    $usuariosCiclo = $usuarios | Where-Object {$_.ciclo -eq $ciclo.name}
    $grupos = $usuariosCiclo | Group-Object -Property grupo -NoElement
    New-Item -Path "C:\Datos" -Name $ciclo.Name -ItemType Directory 
    foreach ($grupo in  $grupos) {
        Write-Output ("   Creando GRUPO " + $grupo.name)
        New-ADOrganizationalUnit -Name $grupo.name -Path ("ou=" + $ciclo.name + ",ou=escola,dc=profe,dc=local") -ProtectedFromAccidentalDeletion $false
        New-ADGroup -Name ("Grupo " + $grupo.name) -Path ("ou=" + $grupo.name + ",ou=" + $ciclo.name + ",ou=escola," + $ruta) -GroupScope Global -GroupCategory Security 
        Add-ADGroupMember -Identity ("Grupo " + $ciclo.Name) -Members ("Grupo " + $grupo.Name)
        $usuariosgrupo = $usuarios | Where-Object {$_.grupo -eq $grupo.Name}
        New-Item -Path ("C:\Datos\" + $ciclo.Name) -Name $grupo.Name -ItemType Directory 
        New-Item -Path ("C:\Datos\" + $ciclo.Name + "\" + $grupo.Name) -Name comun -ItemType Directory 
        New-Item -Path ("C:\Datos\" + $ciclo.Name + "\" + $grupo.Name) -Name usuarios -ItemType Directory 
        Add-NTFSAccess -Path ("C:\Datos\" + $ciclo.Name + "\" + $grupo.Name + "\comun") -Account ("Grupo " + $grupo.name) -AccessRights Modify
        New-SmbShare -name ("_" + $grupo.Name) -Path ("C:\Datos\" + $ciclo.Name + "\" + $grupo.Name + "\comun") -ChangeAccess todos
        foreach($usuario in $usuariosgrupo) {
            $nombrecompleto = ($usuario.nombre + " " + $usuario.apellido)
            $loginusuario   = $($usuario.nombre).Substring(0,2) + "." + $usuario.apellido
            Write-Output ("         Creando usuario " + $nombrecompleto)
            New-ADUser `
                 -Name $nombrecompleto `
                 -GivenName $usuario.nombre `
                 -Surname $usuario.apellido `
                 -DisplayName $nombrecompleto `
                 -Path  ("ou=" + $grupo.name + ",ou=" + $ciclo.name + ",ou=escola," + $ruta) `
                 -SamAccountName $loginusuario.ToLower() `
                 -UserPrincipalName ($loginusuario + "@profe.local") `
                 -AccountPassword (ConvertTo-SecureString "123-user!" -AsPlainText -Force) `
                 -EmailAddress ($loginusuario + "@profe.local") `
                 -MobilePhone $usuario.telèfon `
                 -State $usuario.estados `
                 -EmployeeID $usuario.EmployeeNumber `
                 -PostalCode $usuario.cp `
                 -City $usuario.ciudad `
                 -StreetAddress $usuario.calle `
                 -Department $ciclo.name `
                 -Enabled $true `
                 -ScriptPath ini.vbs
            Add-ADGroupMember -Identity ("Grupo " + $grupo.Name) -Members $loginusuario.ToLower()
            New-Item -Path ("C:\Datos\" + $ciclo.Name + "\" + $grupo.Name + "\usuarios" ) -Name $loginusuario.ToLower() -ItemType Directory 
            Add-NTFSAccess -Path ("C:\Datos\" + $ciclo.Name + "\" + $grupo.Name + "\usuarios\" + $loginusuario.ToLower()) -Account $loginusuario.ToLower() -AccessRights Modify
            New-SmbShare -name ("_" + $loginusuario.ToLower()) -Path ("C:\Datos\" + $ciclo.Name + "\" + $grupo.Name + "\usuarios\" + $loginusuario.ToLower()) -ChangeAccess todos
        }
    }
}

Borrar-Estructura.ps1

Get-SmbShare -name _* | Remove-SmbShare -force
Remove-Item -Path C:\Datos  -Recurse -Force
Remove-ADOrganizationalUnit -Identity "ou=escola,dc=profe,dc=local" -Recursive -Confirm:$false

Os adjunto el video de mi canal MYTCPIP para que podáis seguir las explicaciones con más detenimiento:

You may also like

Leave a Comment