Home Windows Cápsula PowerShell – Crear una estructura AD básica OU/Grupos/Usuarios

Cápsula PowerShell – Crear una estructura AD básica OU/Grupos/Usuarios

by José Luis Sánchez Borque

Utilizaremos Powershell para crear una estructura básica en un dominio Microsoft profe.org creado en un Windows 2012 R2, aunque es válido para un Windows 2016

Veamos la estructura que pretendemos crear, típica de cualquier empresa:

He decidido explicaros dos formas diferentes de trabajar con AD. Una es empleando nomenclatura ADSI, tal como hacíamos con VBS, y la otra con cmdlets específicos para ello.

1) Con cmdLets

En primer lugar utilizaremos New-ADOrganizationalUnit para crear toda la estructura de OU’s:

New-ADOrganizationalUnit -DisplayName "myTCPIP" -Name "myTCPIP" -path "DC=profe,DC=local"

New-ADOrganizationalUnit -DisplayName "Marketing" -Name "Marketing" -path "OU=myTCPIP,DC=profe,DC=local"

Podemos simplificar y acortar algo la sintaxis declarando una variable que apunte al dominio.

$miDominio="DC=profe,DC=local"

New-ADOrganizationalUnit -DisplayName "Administracion" -Name "Administracion" -path ("OU=myTCPIP," + $miDominio)
Podemos ir añadiendo tantas líneas como OU’s tenga nuestra estructura, o lo podemos hacer de una forma algo más elegante con una función que se encargue de crear cada OU, y compruebe en cada caso si existe o no.
Crear el siguiente script PowerShell con vuestro editor favorito
mytcpipOU.ps1
$miDominio="DC=profe,DC=local"

CrearOU "myTCPIP" $miDominio
CrearOU "Marketing" ("OU=myTCPIP,"+$miDominio)
CrearOU "Administracion" ("OU=myTCPIP,"+$miDominio)

function CrearOU
{
   $NombreOU = $args[0]
   $miDominio = $args[1]
   $rutaOU = ("OU="+$NombreOU+","+$miDominio)
   if ([adsi]::Exists(("LDAP://" + $rutaOU))) 
   {
      write-host ("La Unidad Organizativa " + $NombreOU + " ya existe") -ForegroundColor Red
   } 
   else
   {
      write-host ("Creando la OU "+$NombreOU + " en la ruta "+ $miDominio) -ForegroundColor Green
      new-ADOrganizationalUnit -DisplayName $NombreOU -Name $NombreOU -path $miDominio
   }
}
Ahora hacemos lo propio con los grupos  utilizando New-ADGroup. Al igual que antes los podemos crear uno a uno desde la shell de PowerShell
New-ADGroup -DisplayName "gEmpleados" -Name "gEmpleados" -GroupScope Global -GroupCategory Security -Path "ou=mytcpip,DC=profe,DC=local"

New-ADGroup -DisplayName "gVentas" -Name "gVentas" -GroupScope Global -GroupCategory Security -Path "ou=Marketing,ou=mytcpip,DC=profe,DC=local"

New-ADGroup -DisplayName "gMarketing" -Name "gMarketing" -GroupScope Global -GroupCategory Security -Path "ou=Marketing,ou=mytcpip,DC=profe,DC=local"
O podemos elegir hacerlo con funciones
mytcpipGrupos.ps1
$miDominio="DC=profe,DC=local"

CrearGrupoSeguridad "gEmpleados" $miDominio
CrearGrupoSeguridad "gMarketing" ("OU=myTCPIP,"+$miDominio)
CrearGrupoSeguridad "gVentas" ("OU=myTCPIP,"+$miDominio)
function CrearGrupoSeguridad
{
  $NombreGrupo = $Args[0]
  $RutaGrupo = $args[1]
   if (Get-ADGroup -Filter {SamAccountName -eq $NombreGrupo})
   {
     write-host ("El grupo de seguridad " + $NombreGrupo + " ya existe.") -ForegroundColor Red
   }   
   else
   {
     write-host ("Creando el grupo " + $NombreGrupo +" en "+ $rutaGrupo) -ForegroundColor Green
     New-ADGroup -DisplayName $NombreGrupo -Name $NombreGrupo -GroupScope Global -GroupCategory Security -Path $rutaGrupo
   }
}
 Ya tenemos creada la estructura lógica de Ou’s, y los grupos de seguridad. Nos quedan dos pasos importantes:
  1. Creación de Usuarios
  2. Asignación de los usuarios a los grupos.
 Empezaremos creando los usuarios con New-ADUser.  Cómo os podéis imaginar el número de parámetros que podemos especificar es elevado, y corresponde con el número de opciones que podemos observar al entrar en las propiedades de un usuario en entorno gráfico.
Podéis encontrar todas las opciones en el siguiente enlace sobre el cmdLet New-ADUser
Veamos un ejemplo para crear el usuario demo:
New-ADUser -DisplayName "demo" -Name "demo"  -SamAccountName "demo" -UserPrincipalName "demo" -Enabled:$true -Path "OU=USUARIOS,DC=profe,DC=local" -AccountPassword (ConvertTo-SecureString -string "12345aA" -AsPlainText -Force) -ChangePasswordAtLogon:$True -ScriptPath "ini.vbs"
 Casi todas las opciones se explican por si mismas: Enabled, ChangePasswordAtLogon, Name, UserPrincipalName, Path….
Paremos atención en uno de ellos: AccountPassword . Requiere que el passsord sea almacenado como una cadena encriptada. Por eso la utilización
(ConvertTo-SecureString -string "12345aA" -AsPlainText -Force)
Recordaros que para especificar un nuevo password a una cuenta que ya existe debemos utilizar el cmdLet Set-ADAccountPassword

Para añadir el usuario demo a un grupo(s) debemos utilizar el cmdLet Add-ADGroupMember:

Add-ADGroupMember -Identity "Nombre del grupo 1" -Members Demo
Add-ADGroupMember -Identity "Nombre del grupo 2" -Members Demo
Add-ADGroupMember SS64Group User01,User0

Podemos utilizar incluso la instrucción for para la creación de usuarios de forma masiva en caso de requerirlo. Por ejemplo, pensemos en una escuela que quiere crear los logins: alumno01, alumno02, … , alumno99

for ( $i=0; $i -lt 100; $i++)
{
$nombre = "Alumno" + $i.ToString()

New-ADUser -DisplayName $nombre -Name $nombre -SamAccountName $nombre -UserPrincipalName $nombre -Enabled:$true -Path "OU=Alumnos,DC=profe,DC=local" -AccountPassword (ConvertTo-SecureString -string "12345aA" -AsPlainText -Force) -ChangePasswordAtLogon:$True -ScriptPath "ini.vbs"

Add-ADGroupMember gAlumnos $nombre

}

 Podemos intentar lo mismo de otra manera utilizando ForEach. Primero un ejemplo de uso:

foreach($i in 1..10) { $cadena = $cadena + $i.tostring() }
echo $cadena
1234567891

Otro ejemplo:

for ( $i=0; $i -lt 100; $i++)
{
  if ($i –lt 10)
  {
    $usuari=(“user0” + $i)
  }
  Else
  {
    $usuari=(“user” + $i)
  }
  Write-host $usuari
}

Veamos como queda…. , y de paso trabajamos fino. Lo hacemos de otra manera (foreach) y así tenéis dos formas distintas

ForEach($i in 1..40) 
{
 if ( $i -lt 10) 
 { 
 $nombre = "Alumno0" + $i.ToString() 
 } 
 else
 {
 $nombre = "Alumno" + $i.ToString()
 } 
New-ADUser -DisplayName $nombre -Name $nombre -SamAccountName $nombre -UserPrincipalName $nombre -Enabled:$true -Path "OU=Alumnos,DC=profe,DC=local" -AccountPassword (ConvertTo-SecureString -string "12345aA" -AsPlainText -Force) -ChangePasswordAtLogon:$True -ScriptPath "ini.vbs" 

Add-ADGroupMember gAlumnos $nombre 
}

 

2) Nomenclatura ADSI

En primer lugar crearemos el script que genera las Unidades Organizativas: crearOU.ps1.

$dominio = [adsi] "LDAP://localhost:389/dc=profe,dc=local"

$empresa = $dominio.Create("OrganizationalUnit", "OU=myTCPIP") 
$empresa.Put("wwwHomePage", "https://www.mytcpip.com") 
$empresa.SetInfo()

$dominio = [adsi] "LDAP://localhost:389/OU=myTCPIP,dc=profe,dc=local"

$mkt = $dominio.Create("OrganizationalUnit", "OU=MARKETING") 
$mkt.Put("Description", "Departamento de Marketing") 
$mkt.SetInfo()

$vtas = $dominio.Create("OrganizationalUnit", "OU=VENTAS") 
$vtas.Put("Description", "Departamento de Ventas") 
$vtas.SetInfo()

En segundo lugar crearemos los grupos con el script: crearGrupos.ps1

$ADS_GROUP_TYPE_GLOBAL_GROUP = 0x00000002 
$ADS_GROUP_TYPE_DOMAIN_LOCAL_GROUP = 0x00000004 
$ADS_GROUP_TYPE_LOCAL_GROUP = 0x00000004 
$ADS_GROUP_TYPE_UNIVERSAL_GROUP = 0x00000008 
$ADS_GROUP_TYPE_SECURITY_ENABLED = 0x80000000

$mytcpip = [adsi] "LDAP://localhost:389/ou=mytcpip,dc=profe,dc=local"
$groupType = $ADS_GROUP_TYPE_SECURITY_ENABLED -bor $ADS_GROUP_TYPE_GLOBAL_GROUP
$grupo = $mytcpip.Create("Group", "CN=gEmpleados") 
$grupo.Put("sAMAccountName","gEmpleados")
$grupo.Put("groupType", $groupType) 
$grupo.SetInfo()

$ventas = [adsi] "LDAP://localhost:389/ou=ventas,ou=mytcpip,dc=profe,dc=local"
$groupType = $ADS_GROUP_TYPE_SECURITY_ENABLED -bor $ADS_GROUP_TYPE_GLOBAL_GROUP
$grupo = $ventas.Create("Group", "CN=gVentas") 
$grupo.Put("sAMAccountName","gVentas")
$grupo.Put("groupType", $groupType) 
$grupo.SetInfo()

$mkt = [adsi] "LDAP://localhost:389/ou=marketing,ou=mytcpip,dc=profe,dc=local"
$groupType = $ADS_GROUP_TYPE_SECURITY_ENABLED -bor $ADS_GROUP_TYPE_GLOBAL_GROUP
$grupo = $mkt.Create("Group", "CN=gMarketing") 
$grupo.Put("sAMAccountName","gMarketing")
$grupo.Put("groupType", $groupType) 
$grupo.SetInfo()

Y por último crearemos los usuarios, a la vez que los asignamos también a los grupos que les pertoquen: crearUsers.ps1

Import-Module ActiveDirectory

$ou = [adsi] "LDAP://localhost:389/ou=marketing,ou=mytcpip,dc=profe,dc=local"
$user = $ou.Create("User", "CN=a.perez") 
$user.Put("userPrincipalName", "a.perez@profe.local") 
$user.Put("displayName", "Anna Pérez") 
$user.Put("sAMAccountName","a.perez")
$user.SetInfo() 
$user.SetPassword("12345aA") 
Enable-ADAccount -Identity "a.perez"

$user = $ou.Create("User", "CN=j.serradell") 
$user.Put("userPrincipalName", "j.serradell@profe.local") 
$user.Put("displayName", "Joan Serradell") 
$user.Put("sAMAccountName","j.serradell")
$user.SetInfo() 
$user.SetPassword("12345aA") 
Enable-ADAccount -Identity "j.serradell"

$ou = [adsi] "LDAP://localhost:389/ou=ventas,ou=mytcpip,dc=profe,dc=local"
$user = $ou.Create("User", "CN=s.boronat") 
$user.Put("userPrincipalName", "s.boronat@profe.local") 
$user.Put("displayName", "Sergi Boronat ") 
$user.Put("sAMAccountName","s.boronat")
$user.SetInfo() 
$user.SetPassword("12345aA") 
Enable-ADAccount -Identity "s.boronat"

Add-ADGroupMember gempleados "gventas","gmarketing"
Add-ADGroupMember gMarketing "a.perez","j.serradell"
Add-ADGroupMember gVentas "s.boronat"

He decidido utilizar instrucciones típicas de acceso a AD como $user.Put(“…”) , y command-lets propios de PowerShell como Enable-ADAccount -Identity “s.boronat”. El motivo no es otro que conocer poco a poco ambos entornos.

Para la creación de los scripts podemos utilizar PowerShell ISE

Podemos ver con las herramientas de consola o desde línea de comandos la estructura recien creada:

PS C:\> Get-ADGroupMember gventas

distinguishedName : CN=s.boronat,OU=VENTAS,OU=myTCPIP,DC=profe,DC=local
name : s.boronat
objectClass : user
objectGUID : fcc556f8-668f-4cbf-8868-f86f212b006d
SamAccountName : s.boronat
SID : S-1-5-21-541017510-2635529094-3879769623-2132
PS C:\> Get-ADGroupMember gmarketing

distinguishedName : CN=a.perez,OU=MARKETING,OU=myTCPIP,DC=profe,DC=local
name : a.perez
objectClass : user
objectGUID : b4b1825c-b62f-4f91-86c9-f9782a9ee976
SamAccountName : a.perez
SID : S-1-5-21-541017510-2635529094-3879769623-2130

distinguishedName : CN=j.serradell,OU=MARKETING,OU=myTCPIP,DC=profe,DC=local
name : j.serradell
objectClass : user
objectGUID : bcd0c735-32c3-4388-855f-b7deff7928c3
SamAccountName : j.serradell
SID : S-1-5-21-541017510-2635529094-3879769623-2131

PS C:\> Get-ADGroupMember gempleados

distinguishedName : CN=gVentas,OU=VENTAS,OU=myTCPIP,DC=profe,DC=local
name : gVentas
objectClass : group
objectGUID : ebbced77-c74c-4610-b071-273443b05c48
SamAccountName : gVentas
SID : S-1-5-21-541017510-2635529094-3879769623-2111

distinguishedName : CN=gMarketing,OU=MARKETING,OU=myTCPIP,DC=profe,DC=local
name : gMarketing
objectClass : group
objectGUID : 48a0b3c1-06cb-450c-a53c-e2788f4c4f70
SamAccountName : gMarketing
SID : S-1-5-21-541017510-2635529094-3879769623-2112

 

 

 

 

 

You may also like

Leave a Comment