Además de la gestión de usuarios, ordenadores y grupos que ya hemos visto en anteriores entregas de esta serie, un administrador de Active Directory también debe comprender y gestionar toda la base de cualquier AD, hablamos de dominios, unidades organizativas, sitios y subnets. Aunque estas dos últimas las dejamos para una futura entrega vamos a ver cómo podemos llevar a cabo estas tareas a nivel de dominios y OU con Powershell.

gestionando active directory dominios y unidades organizativas

 

Gestión de dominios

Por lo general las empresas de pequeño y mediano tamaño disponen de un AD con un único dominio en el cual se engloban todas las tareas de gestión de los diferentes objetos, pero esto no siempre será así. En ocasiones podemos encontrar casos no tan solo en grandes empresas en las que exista un escenario más complejo, con uno o más bosques conteniendo a su vez varios dominios con propiedades de confianza cruzadas entre ellas...

El módulo de Active Directory en Powershell contiene diversos cmdlets para obtener los detalles de un bosque o dominio. Podemos rápidamente obtener un listado de los mismos con los siguientes comandos.

Get-Command -Module ActiveDirectory -Name *Domain*

Get-Command -Module ActiveDirectory -Name *Forest

Vamos a utilizar algunos de ellos a continuación para daros ejemplos del uso de los mismos.

Obtener información sobre el bosque y dominio

Para obtener esta información de nuestro dominio utilizaremos el cmdlet get-addomain, este nos devolverá datos como en nombre DNS del dominio, el nombre NetBIOS, el Infraestructure Master, detalles sobre los contenedores por defecto de usuarios/ordenadores/objetos borrados.., información sobre el dominio padre o los hijos, GPOs linkeadas a nivel de dominio, bosque al que pertenece el dominio..

Get-ADDomain

De la misma manera, tenemos el cmdlet get-adforest, que nos da toda una serie de información de los dominios que contiene, del nombre del bosque, los roles master, nivel de funcionalidad del bosque, referencias respecto a otros bosques...

Ejecutando estos dos cmdlets ya deberíamos tener una visión bastante clara de la configuración del Active Directory a este nivel, sigamos.

Obtener información del controlador de dominio

El o los controladores de dominio son los servidores que contienen y replican la información del dominio, para obtener información sobre los mismos podemos utilizar el cmdlet get-addomaincontroller, en este caso podemos indicar a través del parámetro -identity sobre que DC queremos obtener la información

Get-addomaincontroller -identity dcejemplo

Obtendremos de esta manera toda una serie de información sobre su dominio y bosque, su DN, su IP, si almacena el catálogo global, si es solo de lectura (RODC), sus sistema operativo, si tiene alguno de los roles de master..

Podemos en caso de necesitarlo, identificar todos DC del dominio en el que nos encontremos con el comando

get-addomaincontroller -filter * | select hostname

Obteniendo información de los dueños del roles FSMO (Flexible Single-Master Operation)

Como acabamos de ver a través de los cmdlets Get-ADDomain y Get-ADForest podemos obtener información sobre los dueños de los roles FSMO. A través de Get-ADDomain aquellos a nivel de dominio cuando pasamos el nombre de dominio al parámetro -Server y de la misma manera en Get-ADForest a nivel de bosque.

Podemos también utilizar la siguiente función para simplemente pasándole el nombre de dominio al parámetro -DomainName , obtener la información.

Function Get-FSMORoles {
[cmdletbinding()]
param(
[Parameter(Mandatory=$true)]
[string]$DomainName
)
try {
$DomainObj = Get-ADDomain -Server $DomainName -EA Stop
$ForestObj = Get-ADForest -Server $DomainName -EA Stop
$OutputObj = New-Object -TypeName PSobject
$OutputObj | Add-Member -MemberType NoteProperty -Name PDCEmulator -Value $DomainObj.PDCEmulator
$OutputObj | Add-Member -MemberType NoteProperty -Name RIDMaster -Value $DomainObj.RIDMaster
$OutputObj | Add-Member -MemberType NoteProperty -Name InfrastructureMaster -Value $DomainObj.InfrastructureMaster
$OutputObj | Add-Member -MemberType NoteProperty -Name SchemaMaster -Value $ForestObj.SchemaMaster
$OutputObj | Add-Member -MemberType NoteProperty -Name DomainNamingMaster -Value $ForestObj.DomainNamingMaster
$OutputObj

} catch {
Write-Warning "Failed to get Domain details. Verify that it is valid domain Name"
}
}

Obtendremos que servidor contiene los roles PDCEmulator, RIDMaster, InfrastructureMaster, SchemaMaster y DomainNamingMaster

Gestionando unidades organizativas (OU)

El uso de las OU viene dado por la necesidad de agrupar objetos de manera lógica para poder actuar luego sobre ellos con mayor eficiencia, vamos a ver algunas de las operaciones más comunes contra este tipo de objetos en nuestro AD a través de cuatro cmdlets básicos como son Get-ADOrganizationalUnit, New-ADOrganizationalUnit, Set-ADOrganizationalUnit y Remove-ADOrganizationalUnit.

Obtener información sobre nuestras OU

Podemos obtener rápidamente un listado de las OU en nuestro dominio con el siguiente comando al utilizar el cmdlet Get-ADOrganizationalUnit

Get-ADOrganizationalunit -filter * | select name

Como hemos visto en otros ejemplos podemos aplicar cualquier filtro que nos interese como un filtrado por nombre

Get-ADOrganizationalunit -filter {name -like “*usuario*”}

Podemos actuar como siempre también sobre la información mostrada con comandos como el siguiente ejemplo en el que mostramos por pantalla todas las propiedades de la OU

Get-ADOrganizationalunit -filter {name -like “*usuario*”} -properties *

O para seleccionar un set de propiedades, en este caso el nombre y si está protegido contra un borrado o movimiento accidental

Get-ADOrganizationalunit -filter {name -like “*usuario*”} -properties * | select name, protectedfromaccidentaldeletion

También podemos actuar sobre la OU y sobre cualquier otro objeto del AD a través de su DN (Distinguished Name) como vemos en el siguiente ejemplo

Get-ADOrganizationalunit -identity “OU=usuarios,DC=cyberseguridad,DC=net”

O utilizar como hemos visto en otros cybertrucos este DN como -Seachbase opcionalmente con el parámetro -SearchScope para indicar profundidad de búsqueda. En el siguiente ejemplo estaríamos buscando sobre la misma OU utilizada en el ejemplo anterior pero también en sus OU anidadas.

Get-ADOrganizationalunit -filter * -searchbase “OU=usuarios,DC=cyberseguridad,DC=net” -searchscope 1 | select name, protectedfromaccidentaldeletion

Crear OUs

Crear OUs es sencillo, y únicamente debemos de tener en cuenta su nombre (parámetro -name) aunque es más que recomendable crearlas al menos con una localización (parámetro -Path) y con la mayor cantidad de datos posibles para evitarnos posteriores modificaciones

En el siguiente ejemplo vemos como crear una OU dentro de una ya existente llamada usuarios

New-ADOrganizationalunit -name “contables” -path “OU=usuarios,DC=cyberseguridad,DC=net” -description “ejemplo” -protectedfromaccidentaldeletion $false

Incluido en el ejemplo el parámetro -protectedfromaccidentaldeletion por el hecho de que des de AD 2008 R2 este parámetro se activa por defecto al crear nuevas OU, para que lo tengais en cuenta si no es el caso. Obviamente podemos modificar este parámetro luego como veremos a continuación al abordar la modificación de OUs.

Modificar OUs

Sobre una OU podemos actuar sobre cualquiera de sus valores para modificarlos con el cmdlet set-adorganizationalunit, para empezar a trabajar sobre una OU y para hacer posteriores acciones mas sencillas, empezamos identificandola y almacenandola en una variable como vemos a continuación para referenciarla.

$OUejemplo = Get-adorganizationalunit -filter “name -eq contables”

Ahora podemos ya modificar cualquiera de sus valores como por ejemplo el pais indicando el parámetro country

Set-adorganizationalunit -identity $OUejemplo -country ES

A parte de las propiedades de este tipo, recordad que también podemos alterar la protección contra borrados o movimientos no deseados de la OU con el mismo cmdlet como vemos a continuación en un caso en el que la activamos

Set-adorganizationalunit -identity $OUejemplo -Protectedfromaccidentaldeletion $true

Renombrar, borrar y mover OUs

Vamos a continuación ver otra serie de cmdlets para realizar acciones sobre el objeto contenedor en sí de la OU, para renombrar una OU (como hemos dicho en varias ocasiones un objeto más de nuestro AD) utilizaremos el cmdlet rename-adobject

Rename-adobject -identity $OUejemplo -newname contablesrenombrado

Con este comando cambiamos el nombre de la OU que usamos de ejemplo de “contables” a “contablesrenombrado”

Para mover una OU utilizaremos otro cmdlet que trabaja contra objetos del AD, en este caso siguiendo la lógica gramática de AD, move-adobject.

Move-adobject -identity $OUejemplo2 -targetpath “OU=exusuarios,DC=cyberseguridad,DC=net”

Fijaos en que en el parámetro identity utilizo “OUejemplo2” a diferencia del anterior “OUejemplo” esto se debe a que como acabamos de renombrar a través de referencia nuestra OU, si no la asignamos de nuevo, estaremos tratando de mover una OU para la cual la referencia a través de “OUejemplo” ya no es válida. Por lo que antes de ejecutar el move-adobject tendremos que, primero identificar de nuevo nuestra OU

$OUejemplo2 = get-adorganizationalunit -filter “name -eq contablesrenombrado”

Y después deshabilitar la protección que hemos activado hace pocas lineas, de otra manera no nos permitirá mover la OU a ninguna parte. Una vez movida es más que recomendable reactivar este parámetro.

Esta misma protección la deberemos activar en caso que queramos borrar una OU con el cmdlet remove-adorganizationalunit. Recordad que es importante asegurarnos antes de realizar este tipo de operaciones críticas. Como vimos en la entrega anterior de esta serie, se puede recuperar, pero es obviamente mejor evitar estos contratiempos.

Remove-adorganizationalunit -identity $OUejemplo2

 

Esperemos como siempre que estos ejemplos os sirvan de ayuda y sean solo la base de vuestros futuros scripts que os hagan trabajar mucho más eficientemente con el potencial inmenso de powershell. Nos vemos en el próximo cybertruco.