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" }
Importante!! En la construcción del filtro, la variable NombreOU está acotada por el carácter comilla simple ‘. Eso puede dar problemas, si el nombre de la OU contiene dicho caracter. Pongamos un ejemplo:
$NombreOU = "Administració d'Sistemes Informàtics en Xarxa"
Esta ‘ simple, dará problemas a la hora de ejecutar el script… Para arreglarlo, bastará añadir un replace debajo de la variable tal como indica el siguiente ejemplo:
$NombreOU = "Administració d'Sistemes Informàtics en Xarxa" $NombreOU = $NombreOU.replace("'","''")
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.