Unitats Organitzatives Active Directory per PowerShell

9 novembre 2016
Josep Ma Solanes 0

Amb aquesta entrada s’automatitza el procés de creació de les estructures d’unitats organitzatives d’Active Directory a l’estàndard que desitgem. Amb la creació de grups de seguretat i usuaris operadors per defecte. És un procés molt fàcil i que segurament només utilitzarem un cop en les nostres instal·lacions. No obstant, en el camí del DevOps és necessari tenir aquesta part automatitzada.

Partim d’un entorn d’Active Directory verge, on encara no s’han creat les unitats organitzatives ni res per l’estil. En ella es creen les diferents Unitats Organitzatives que contindran els objectes:

  • GRUPS DE SEGURETAT. On hi posem els diferents grups de seguretat que necessitem.
  • EQUIPS. On hi posarem els equips que no són controladors de domini. S’estructura en altres unitats organitzatives per poder aplicar correctament les Polítiques de Grup i delegació.
    • Estacions de Treball
    • Mòbils
    • VDIs
    • Servidors membre
      • Clústers
      • Hipervisors
      • NAS
  • USUARIS. On hi posarem els usuaris. També s’estructura en altres unitats organitzatives per poder aplicar correctament les Polítiques de Grup i delegació.
    • Administradors
    • Empresa
    • Externs
    • Serveis

Per arrodonir-ho, a la Unitat Organitzativa Grups de Seguretat, es crearan els següents:

  • Usuaris Wi-Fi
  • Usuaris VPN
  • Tècnics de HelpDesk
  • Administradors de SQL Server
  • Administradors de SharePoint

Per acabar amb dos usuaris Administradors de SQL Server i de SharePoint, creats a la Unitat Organitzativa Administradors:

  • Operador
  • Administrador Josep Maria Solanes

 

Crear Unitats Organitzatives

Les comandes són senzilles. També partirem de la variable on s’especifica el nom del domini:

$dominiLDAP="DC=jmsolanes,DC=local"

Per crear les unitats organitzatives, s’indica el nom, el nom amb què ha d’aparèixer i la ruta LDAP on s’han de crear:

New-ADOrganizationalUnit -DisplayName "USUARIS" -Name "USUARIS" -path $dominiLDAP
New-ADOrganizationalUnit -DisplayName "EQUIPS" -Name "EQUIPS" -path $dominiLDAP
etc...

Què avorrit si cada cop he de fer això! Perquè no ho millorem amb una funció que, a més, comprovi si existeix abans de crear-la:

function CreaEstructura
{
   $NomOU = $args[0]
   $dominiLDAP = $args[1]
   $camiOU = ("OU="+$NomOU+","+$dominiLDAP)
   if ([adsi]::Exists(("LDAP://" + $camiOU))) 
   {
      write-host ("La Unitat Organitzativa " + $NomOU + " ja existeix.") -ForegroundColor Yellow
   } 
   else
   {
      new-ADOrganizationalUnit -DisplayName $NomOU -Name $NomOU -path $dominiLDAP
   }
}

Amb la funció creada que treballa per nosaltres, només cal anar-la cridant per crear l’arbre de Unitats Organitzatives segons necessitem, indicant el nom de la nova unitat seguida dins quina carpeta s’ha de crear:

CreaEstructura "USUARIS" $dominiLDAP
CreaEstructura "Administradors" ("OU=USUARIS,"+$dominiLDAP)
CreaEstructura "Serveis" ("OU=USUARIS,"+$dominiLDAP)
CreaEstructura "Empresa" ("OU=USUARIS,"+$dominiLDAP)
CreaEstructura "Externs" ("OU=USUARIS,"+$dominiLDAP)
CreaEstructura "EQUIPS" $dominiLDAP
CreaEstructura "Estacions de Treball" ("OU=EQUIPS,"+$dominiLDAP)
CreaEstructura "Mòbils" ("OU=EQUIPS,"+$dominiLDAP)
CreaEstructura "VDIs" ("OU=EQUIPS,"+$dominiLDAP)
CreaEstructura "Servidors membre" ("OU=EQUIPS,"+$dominiLDAP)
CreaEstructura "NAS" ("OU=Servidors membre,OU=EQUIPS,"+$dominiLDAP)
CreaEstructura "Hipervisors" ("OU=Servidors membre,OU=EQUIPS,"+$dominiLDAP)
CreaEstructura "Clústers" ("OU=Servidors membre,OU=EQUIPS,"+$dominiLDAP)
CreaEstructura "GRUPS DE SEGURETAT" $dominiLDAP

 

Crear els Grups de Seguretat

Amb l’estructura de Unitats Organitzatives creada, anem a pels grups de seguretat. Per exemple, el de Usuaris de la Wi-Fi:

New-ADGroup -DisplayName "Usuaris Wi-Fi" -Name "Usuaris Wi-Fi" -GroupScope DomainLocal -GroupCategory Security -Path "GRUPS DE SEGURETAT"

També ho podem millorar una mica oi? L’adaptem per crear una funció. Veieu que hi ha molts paràmetres quasi iguals amb la funció anterior oi? És pot simplificar i al final ho veureu. De moment, ho deixo per entendre els diferents apartats:

function NouGrupSeguretat
{
   $NomGrup = $Args[0]
   $NomOU = "GRUPS DE SEGURETAT"
   $dominiLDAP = "DC=jmsolanes,DC=local"
   $camiOU = ("OU="+$NomOU+","+$dominiLDAP)
   if (Get-ADGroup -Filter {SamAccountName -eq $NomGrup})
   {
      write-host ("El grup de seguretat " + $NomGrup + " ja existeix.") -ForegroundColor Yellow
   }
   else
   {
      New-ADGroup -DisplayName $NomGrup -Name $NomGrup -GroupScope DomainLocal -GroupCategory Security -Path $camiOU
   }
}

Aquesta funció la cridarem indicant el nom del grup de seguretat a crear:

NouGrupSeguretat "Administradors Web"

 

Crear Usuaris

Tenim les Unitats Organitzatives i els Grups de Seguretat. El següent pas és crear usuaris. La comanda també és senzilla. Es crea l’usuari Operador amb la contrasenya P@ssw0rd, que l’haurà de canviar en el primer inici de sessió i que es crearà a la Unitat Organitzativa d’Administradors:

New-ADUser -DisplayName "Operador" -Name "Operador" -UserPrincipalName "Operador" -Enabled:$true -Path "OU=Administradors,OU=USUARIS,DC=jmsolanes,DC=local" -AccountPassword (ConvertTo-SecureString -string "P@ssw0rd" -AsPlainText -Force) -ChangePasswordAtLogon:$True

Com que és un usuari per administrar el sistema informàtic, l’afegim als grups de seguretat d’Administració:

Add-ADGroupMember -Identity "Administrador SQL Server" -Members Operador
Add-ADGroupMember -Identity "Administrador SharePoint" -Members Operador

Tornem a crear una nova funció, en què agafem el nom de l’usuari que s’ha de visualitzar i el nom de logon:

function NouUsuari
{
   $NomUsuari=$Args[0]
   $NomLogon=$Args[1]
   $NomOU = "OU=Administradors,OU=USUARIS"
   $dominiLDAP = "DC=jmsolanes,DC=local"
   $camiOU = ($NomOU+","+$dominiLDAP)
   if (Get-ADUser -Filter {SamAccountName -eq $NomLogon})
   {
      write-host ("El compte d'usuari " + $NomLogon + " ja existeix.") -ForegroundColor Yellow
   }
   else
   {
      New-ADUser -DisplayName $NomUsuari -Name $NomLogon -UserPrincipalName $NomLogon -Enabled:$true -Path $camiOU -AccountPassword (ConvertTo-SecureString -string "P@ssw0rd" -AsPlainText -Force) -ChangePasswordAtLogon:$True
   }
}

Aquesta funció la cridarem indicant el nom amb què s’ha de visualitzar seguit del nom de logon:

NouUsuari "Josep Solanes" "jmsolanes"

Ja tenim els tres apartats preparats. Anem a fer una barreja de tot plegat?

 

Script per crear una estructura estàndard de Unitats Organitzatives

No hi ha massa més a dir, adjuntem totes les parts en una de sola per generar l’estructura a partir de l’script.

# Variables generals
$dominiLDAP = "DC=jmsolanes,DC=local"

# Funció per crear un nou Grup de Seguretat
function NouGrupSeguretat
{
  $NomGrup = $Args[0]
  $NomOU = $Args[1]
  $dominiLDAP = $Args[2]
  $camiOU = ("OU="+$NomOU+","+$dominiLDAP)
  if (Get-ADGroup -Filter {SamAccountName -eq $NomGrup})
  {
    write-host ("El grup de seguretat " + $NomGrup + " ja existeix.") -ForegroundColor Red
  }
  else
  {
    New-ADGroup -DisplayName $NomGrup -Name $NomGrup -GroupScope DomainLocal -GroupCategory Security -Path $camiOU
  }
}

# Funció per crear un nou Usuari, si es crea a la OU d'administradors, l'afegeix automàticament als Grups d'Administradors de SQL i SharePoint.
function NouUsuari
{
  $NomUsuari=$Args[0]
  $NomLogon=$Args[1]
  $NomOU = $Args[2]
  $dominiLDAP = $Args[3]
  $camiOU = ($NomOU+","+$dominiLDAP)
  if (Get-ADUser -Filter {SamAccountName -eq $NomLogon})
  {
    write-host ("El compte d'usuari " + $NomLogon + " ja existeix.") -ForegroundColor Red
  }
  else
  {
    write-host("Creant l'usuari " + $NomLogon + " a la unitat organitzativa "+$camiOU) -ForegroundColor Green
    New-ADUser -DisplayName $NomUsuari -Name $NomLogon -UserPrincipalName $NomLogon -Enabled:$true -Path $camiOU -AccountPassword (ConvertTo-SecureString -string "P@ssw0rd" -AsPlainText -Force) -ChangePasswordAtLogon:$True
  }
  if ($NomOU="Administradors")
  {
    Add-ADGroupMember -Identity "Administradors de SQL Server" -Members $NomLogon
    Add-ADGroupMember -Identity "Administradors de SharePoint" -Members $NomLogon
  }
}

# Funció principal per crear l'estructura i a partir d'ella anar creant els grups de seguretat i usuaris.
function CreaEstructura
{
  $NomOU = $args[0]
  $dominiLDAP = $args[1]
  $camiOU = ("OU="+$NomOU+","+$dominiLDAP)
  Write-Host ("Creant Unitat Organitzativa: " + $camiOU) -ForegroundColor Yellow
  if ([adsi]::Exists(("LDAP://"+$camiOU))) 
  {
    write-host ("La Unitat Organitzativa " + $NomOU + " ja existeix.") -ForegroundColor Red
  } 
  else
  {
    write-host ("Creant la OU "+$NomOU+","+$dominiLDAP) -ForegroundColor Green
    new-ADOrganizationalUnit -DisplayName $NomOU -Name $NomOU -path $dominiLDAP
  }
  if ($NomOU -eq "GRUPS DE SEGURETAT")
  {
    write-host ("Estic a la OU "+$NomOU+" creant els grups de seguretat que pertoquen.") -ForegroundColor Green
    NouGrupSeguretat "Usuaris Wi-Fi" $NomOU $dominiLDAP
    NouGrupSeguretat "Usuaris VPN" $NomOU $dominiLDAP
    NouGrupSeguretat "Tècnics de HelpDesk" $NomOU $dominiLDAP
    NouGrupSeguretat "Administradors de SQL Server" $NomOU $dominiLDAP
    NouGrupSeguretat "Administradors de SharePoint" $NomOU $dominiLDAP
  }
  if ($NomOU -eq "Administradors")
  {
    write-host ("Estic a la OU "+$NomOU+"; creem els usuaris que pertoquen.") -ForegroundColor Green
    NouUsuari "Operador" "Operador" ("OU="+$NomOU) $dominiLDAP
    NouUsuari "Administrador Josep Solanes" "adminjmsolanes" ("OU="+$NomOU) $dominiLDAP
  }
}

#Executem la funció principal amb els noms de les OUs.
CreaEstructura "GRUPS DE SEGURETAT" $dominiLDAP
CreaEstructura "USUARIS" $dominiLDAP
CreaEstructura "Administradors" ("OU=USUARIS,"+$dominiLDAP)
CreaEstructura "Serveis" ("OU=USUARIS,"+$dominiLDAP)
CreaEstructura "Empresa" ("OU=USUARIS,"+$dominiLDAP)
CreaEstructura "Externs" ("OU=USUARIS,"+$dominiLDAP)
CreaEstructura "EQUIPS" $dominiLDAP
CreaEstructura "Estacions de Treball" ("OU=EQUIPS,"+$dominiLDAP)
CreaEstructura "Mòbils" ("OU=EQUIPS,"+$dominiLDAP)
CreaEstructura "VDIs" ("OU=EQUIPS,"+$dominiLDAP)
CreaEstructura "Servidors membre" ("OU=EQUIPS,"+$dominiLDAP)
CreaEstructura "NAS" ("OU=Servidors membre,OU=EQUIPS,"+$dominiLDAP)
CreaEstructura "Hipervisors" ("OU=Servidors membre,OU=EQUIPS,"+$dominiLDAP)
CreaEstructura "Clústers" ("OU=Servidors membre,OU=EQUIPS,"+$dominiLDAP)

 

Per acabar, quatre costelletes per esborrar objectes

Per esborrar un usuari (operador) de l’Active Directory

Get-ADUser -filter {SamAccountName -like "Operador*"} | Remove-ADUser

Per esborrar un grup (tots els que comencin per Tècnics) de l’Active Directory

get-adgroup -filter {SamAccountName -like "Tècnics*"} | Remove-ADGroup

Per esborrar una unitat organitzativa de l’Active Directory, a la què a més, s’ha de treure el piscu de protecció contra esborrat:

Get-ADOrganizationalUnit -Filter {Name -eq "nas"} | Set-ADOrganizationalUnit -ProtectedFromAccidentalDeletion:$false 
Get-ADOrganizationalUnit -Filter {Name -eq "nas"} | Remove-ADOrganizationalUnit -confirm:$false

Esborrar les unitats organitzatives a partir d’una llista des d’un fitxer (OUs.txt) amb els noms de cadascuna d’elles en forma de llistat:

get-content .\OUs.txt | foreach-object {Get-ADOrganizationalUnit -Filter {Name -eq $_ } | Set-ADOrganizationalUnit -ProtectedFromAccidentalDeletion:$false}

get-content .\OUs.txt | foreach-object {Get-ADOrganizationalUnit -Filter {Name -eq $_ } | Remove-ADOrganizationalUnit -confirm:$false}

Ep, aquesta última idea és bona oi? Tenir-ho tot en un fitxer a partir del qual es crea tota l’estructura. Au, ja teniu feina.

Per acabar, si heu desplegat tot l’entorn anterior i es vol automatitzar l’esborrat i creació, perquè ens hem equivocat o estem jugant amb  ella, aquí teniu l’script per fer-ho:

get-adgroup -filter * | ? {$_.Name -like "Tècnics*"} |Remove-ADGroup -Confirm:$false
get-adgroup -filter * | ? {$_.Name -like "Usuaris*"} |Remove-ADGroup -Confirm:$false
get-adgroup -filter * | ? {$_.Name -like "Administradors*"} | Remove-ADGroup -Confirm:$false
get-aduser -filter {SamAccountName -eq "adminjmsolanes"} | Remove-ADUser -Confirm:$false
get-aduser -filter {SamAccountName -eq "Operador"} | Remove-ADUser -Confirm:$false
get-content .\OUs.txt | foreach-object {Get-ADOrganizationalUnit -Filter {Name -eq $_ } | Set-ADOrganizationalUnit -ProtectedFromAccidentalDeletion:$false}
get-content .\OUs.txt | foreach-object {Get-ADOrganizationalUnit -Filter {Name -eq $_ } | Remove-ADOrganizationalUnit -confirm:$false}

Com sempre podeu trobar els scripts en el meu repositori de GitHub (tots els scripts només són en castellà):

 

T’ha agradat l’article? El pots compartir a les xarxes socials. També pots deixar la teva opinió, comentari o suggeriment. Gràcies!

Similar Posts by The Author: