Home Windows PowerShell, controlar la existencia de un objeto en AD

PowerShell, controlar la existencia de un objeto en AD

by José Luis Sánchez Borque

Una tarea habitual en los entornos de administración de sistemas locales o cloud es la de crear objetos tales como usuarios, grupos y unidades organizativas entre otros.

La idea es automatizar el proceso de creación, sobre todo cuando se trata de decenas, cientos o incluso miles de usuarios. Pensemos ardua tarea de crear en una escuela todos los usuarios de inicio de curso en nuestro controlador de domino.

En el POST POWERSHELL Y ACTIVE DIRECTORY tenéis un ejemplo de creación de usuarios basado en un EXCEL. Se nos presenta el problema de duplicidad de nombres y apellidos a la hora de crear los diferentes objetos.

El problema viene cuando el objeto que deseamos crear ya existe, bien sea un usuario, grupo o Unidad Organizativa. Cuando este caso se produce, lo suyo es crear el nuevo objeto con un nombre diferente.

En cualquier caso, se trata de comprobar la existencia del objeto antes de crearlo.

Para usuarios utilizamos el cmd-let Get-ADUser con el parámetro filter comparando la propiedad SamAccountName con el valor del usuario. Si existe nos devuelve como resultado los datos del usuario. En caso contrario no devuelve nada.

Caso 1: Get-ADUser en el caso que el usuario exista.

PS C:\> Get-ADUser -Filter "SamAccountName -eq 're.himsworth'"

DistinguishedName : CN=Reta Himsworth,OU=M2IN2,OU=IC10 Sistemes microinformàtics en

Xarxa,OU=ESCOLA,DC=profe,DC=local

Enabled : True

GivenName : Reta

Name : Reta Himsworth

ObjectClass : user

ObjectGUID : 962b89af-c612-41bf-b1d3-f62980008ac5

SamAccountName : re.himsworth

SID : S-1-5-21-4264972423-1493810420-1847921664-31006

Surname : Himsworth

UserPrincipalName : Re.Himsworth@profe.local

Caso 2: Get-ADUser en el caso que el usuario NO exista.

PS C:\> Get-ADUser -Filter "SamAccountName -eq 're.XXXXXXXX"

PS C:\>

Evidentemente esto lo podemos utilizar dentro de una estructura IF que permita automatizar procesos:

$tmp = Get-ADUser -Filter "SamAccountName -eq 're.himsworth'"

if ($tmp) {

Write-Host "El usuario EXISTE"

} else {

Write-Host "El usuario NO EXISTE"

}

La misma idea es válida para GRUPOS:

PS C:\ > Get-ADGroup -Filter "samaccountname -eq 'grupo escola'"

DistinguishedName : CN=Grupo ESCOLA,OU=ESCOLA,DC=profe,DC=local

GroupCategory : Security

GroupScope : Global

Name : Grupo ESCOLA

ObjectClass : group

ObjectGUID : 23577df7-24e3-47cb-be6a-20ae0f0f2b82

SamAccountName : Grupo ESCOLA

SID : S-1-5-21-4264972423-1493810420-1847921664-30778

Y lo mismo para Unidades Organizativas, salvo el pequeño detalle que aquí la propiedad que vamos a utilizar es Name y no SamAccountName.

PS C:\> Get-ADOrganizationalUnit -filter "Name -eq 'ESCOLA'"

DistinguishedName : OU=ESCOLA,DC=profe,DC=local

LinkedGroupPolicyObjects : {}

ManagedBy :

Name : ESCOLA

ObjectClass : organizationalUnit

ObjectGUID : 8d8740e0-5172-493a-917c-dfb6b0f0ecc0

Y como siempre el valor no tiene porqué ser literal, sino estar dentro de una variable, en el ejemplo $NombreOU:

$NombreOU = "ESCOLA"

$tmp = Get-ADOrganizationalUnit -filter "Name -eq '$NombreOU'"

if ($tmp) {

Write-Output "La Unidad organizativa $NombreOU: EXISTE"

} else {

Write-Output "La Unidad organizativa $NombreOU: NO EXISTE"

}

Ahora ya podéis modificar el Script POWERSHELL Y ACTIVE DIRECTORY de tal forma que si es usuario existe el proceso actualice sus datos, y en caso contrario lo cree. En estos casos es evidente que debe haber algún campo del Objeto que lo identifique de forma unívoca (DNI, etc..). De esta forma evitamos el problema de dos «Antonio López»… Caso en que nunca podremos distinguir si es uno u otro… Se que alguno puede decirme que existe el tercer apellido para eso. Pero creerme, he creado un programa en php par dar de alta los usuarios en gmail de una escuela, y nunca pensé que habría tantas coincidencias en nombres, apellidos, alumnos sin segundo apellido, nombres chinos, rusos, nombres compuestos pero muy compuestos…. etc… Así que en los script deberemos tener en cuenta muchos de esos casos.

You may also like

Leave a Comment