#Requires -Modules 'ActiveDirectory' Param( [Parameter(Mandatory)] [hashtable]$Parameter ) # Only executed on primary or standalone Domain Controller If (@('primary','standalone') -contains $Parameter['deployment.type']) { $GetContentSplat = @{ Path = "$($PSScriptRoot)\$($MyInvocation.MyCommand)".Replace('.ps1', ".yml") Raw = $True } $RawContent = Get-Content @GetContentSplat $ConvertFromYamlSplat = @{ Yaml = $RawContent AllDocuments = $True } $YamlDocuments = ConvertFrom-Yaml @ConvertFromYamlSplat # Check if the respective .yml file declared substitutions which need to be parsed If (($YamlDocuments.Count -gt 1) -and $YamlDocuments[-1].Variables) { ForEach ($Pattern in $YamlDocuments[-1].Variables) { $RawContent = $RawContent -replace "\{\{ ($($Pattern.Name)) \}\}", [string](Invoke-Expression -Command $Pattern.Expression) } # Perform conversion to Yaml again, now with parsed file contents $ConvertFromYamlSplat = @{ Yaml = $RawContent AllDocuments = $True } $YamlDocuments = ConvertFrom-Yaml @ConvertFromYamlSplat $Entries = $YamlDocuments[0..($YamlDocuments.Count - 2)] } Else { $Entries = $YamlDocuments } ForEach ($OU in $Entries.OrganizationalUnits) { $OUName, $OUPath = $OU.DistinguishedName -split ',', 2 If ($OUPath.Length -ne 0) { $OUPath += ',' } $NewADOrganizationalUnitSplat = @{ Name = $OUName.Substring(3) Path = $OUPath + (Get-ADRootDSE).rootDomainNamingContext Description = $OU.Description ProtectedFromAccidentalDeletion = $False ErrorAction = 'SilentlyContinue' } New-ADOrganizationalUnit @NewADOrganizationalUnitSplat } }