La siguiente función que crearemos en nuestro módulo para la creación del modelo de Tiers será la función para asignar los permisos a nivel de OUs: Funcion Set- OUUserPermission
Parámetros de entrada:
[PSObject] $OUUserPermissions
: Es el parámetro de entrada de la función, obligatorio (Mandatory = $true
). Se espera que este parámetro contenga una lista de objetos, donde cada objeto tiene al menos dos propiedades:OUPrefix
(que representa el prefijo del nombre distinguido de la OU) yGroup
(el nombre del grupo de seguridad en AD).
2. Carga del módulo de Active Directory:
Import-Module ActiveDirectory
: Se carga el móduloActiveDirectory
, necesario para utilizar cmdlets de Active Directory comoGet-ADObject
,Get-ADOrganizationalUnit
, etc.
3. Obtención de datos del esquema y configuración del dominio:
$rootdse = Get-ADRootDSE
: Obtiene información sobre el contexto de nombres de AD, como el esquema, configuración, y dominio.$domain = Get-ADDomain
: Recupera la información del dominio actual, incluyendo el Distinguished Name (DN) del dominio.$guidmap
y$extendedrightsmap
: Son diccionarios que se utilizan para mapear nombres de atributos y derechos extendidos a sus respectivos GUIDs dentro del AD.
4. Asignación de GUIDs a los nombres de los atributos:
Get-ADObject -SearchBase ($rootdse.SchemaNamingContext)
: Se utiliza para obtener los GUIDs de los atributos definidos en el esquema de AD y almacenarlos en$guidmap
.Get-ADObject -SearchBase ($rootdse.ConfigurationNamingContext)
: Se utiliza para obtener los GUIDs de los derechos extendidos (como “Reset Password”) y almacenarlos en$extendedrightsmap
.
5. Asignación de permisos a las OUs:
$OUUserPermissions | ForEach-Object { ... }
: Recorre cada elemento en el objeto$OUUserPermissions
.- Construcción del DN de la OU: Combina el prefijo de la OU (
$ouPrefix
) con el DN del dominio para formar el DN completo de la OU ($ouPath
). $ou = Get-ADOrganizationalUnit -Identity $ouPath
: Obtiene la OU específica en el AD.$adGroup = New-Object System.Security.Principal.SecurityIdentifier (Get-ADGroup -Identity $group).SID
: Obtiene el Security Identifier (SID) del grupo de seguridad especificado.$acl = Get-ACL -Path "AD:$($ou.DistinguishedName)"
: Obtiene la lista de control de acceso (ACL) actual para la OU.$acl.AddAccessRule(...)
: Se agregan varias reglas de acceso a la ACL para el grupo de seguridad en cuestión. Estas reglas incluyen:- Permisos para crear objetos de tipo
user
. - Permisos para leer y escribir propiedades específicas de los objetos
user
. - Permiso extendido para restablecer contraseñas.
- Permisos relacionados con los atributos
lockoutTime
ypwdLastSet
.
- Permisos para crear objetos de tipo
6. Aplicación de la ACL:
Write-Verbose "Configuring User Permissions on '$ouPath' for group '$group'"
: Muestra un mensaje detallado sobre la configuración que se está aplicando.Set-ACL -ACLObject $acl -Path ("AD:\" + ($ou.DistinguishedName))
: Aplica la nueva ACL a la OU.
Para el resto de funciones restantes de asignación de permisos usaremos la misma metodología
Por último crearemos la función que nos permitirá realizar la creación de usuarios:
Function create-user
{
[CmdletBinding()]
param(
[Parameter(Mandatory=$True)][string] $CSVfile,
[Parameter(Mandatory=$True)][string] $Password
)
$DNSRoot = (Get-ADDomain).DNSRoot
$DSN = (Get-ADDomain).DistinguishedName
$users = Import-Csv $CSVfile
foreach ($user in $users) {
$name = $user.name
$samAccountName = $user.samAccountName
$UserPrincipalName = $samAccountName + ‘@’ + $DNSRoot
$parentOU = $user.ParentOU + ‘,’ + $DSN
$groupMembership = $user.GroupMembership
$enabled = [bool]$user.enabled
$checkForUser = [bool]( Get-ADUSer -Filter {SamAccountname -eq $samaccountname})
If ($checkForUser -eq $false) {
Write-Verbose “Creating new user ‘$samAccountName’ under ‘$parentOU'”
New-ADUser -Name $name -Path $ParentOU -SamAccountName $samAccountName -UserPrincipalName $UserPrincipalName -AccountPassword (ConvertTo-SecureString $password -AsPlainText -Force) -ChangePasswordAtLogon $false -Enabled $enabled -EmailAddress $UserPrincipalName
start-sleep -Seconds 5
if ($groupMembership -ne “”) {
$groupMembership = ($user.GroupMembership) -split ‘,’
foreach ($group in $groupMembership){
Write-Verbose “Adding User ‘$samAccountName’ to Group ‘$group'”
Add-ADGroupMember -Identity $group -Members $samAccountName
}
}
$error.Clear()
}
Else {
Write-Verbose “User ‘$samAccountName’ already exists.”
}
}
}
Y la importación de GPOS que necesitaremos más adelante para poder desplegar todas las políticas necesarias.
function Import-gpo
{
[CmdletBinding()]
param(
[Parameter(Mandatory = $True)][string] $BackupPath,
[string] $GPOMigrationTable
)
$backupList = Get-ChildItem -Path $BackupPath -Exclude “manifest.xml”
Set-Location $BackupPath
$location = Get-Location
foreach ($item in $backupList){
$backupID = $null
$xmlFilePath = $null
$gpoName = $null
$backupID = $item.name -replace “{“,”” -replace “}”,””
$xmlFilePath = “.\$($item.name)\gpreport.xml”
[xml]$xmlFile = Get-Content -Path $xmlFilePath
$gpoName = $xmlFile.GPO.Name
Write-Verbose “Importing new GPO ‘$gpoName’ with GUID ‘$backupID'”
Write-Verbose “Please remember to update proper groups in GPO settings”
if ($GPOMigrationTable -eq $null) {
Import-GPO -BackupId $backupID -TargetName $gpoName -Path $BackupPath -CreateIfNeeded
}
else {
Import-GPO -BackupId $backupID -TargetName $gpoName -Path $BackupPath -MigrationTable $GPOMigrationTable -CreateIfNeeded
}
Set-Location $location
}
}