From b02dcfa71735a39ae51c53280a8b511d20fba07d Mon Sep 17 00:00:00 2001 From: djpbessems Date: Wed, 24 Mar 2021 11:19:27 +0100 Subject: [PATCH] Fix switch regex match;Add GPO link debugging --- scripts/ADDS/payload/scripts/11.GPO+GPP.ps1 | 59 +++++++++++++-------- scripts/Update-OvfConfiguration.ps1 | 18 +++---- 2 files changed, 47 insertions(+), 30 deletions(-) diff --git a/scripts/ADDS/payload/scripts/11.GPO+GPP.ps1 b/scripts/ADDS/payload/scripts/11.GPO+GPP.ps1 index 215404e..0091435 100644 --- a/scripts/ADDS/payload/scripts/11.GPO+GPP.ps1 +++ b/scripts/ADDS/payload/scripts/11.GPO+GPP.ps1 @@ -15,33 +15,47 @@ If (@('primary','standalone') -contains $Parameter['deployment.type']) { } $PSSession = New-PSSession @NewPSSessionSplat + $ParseErrors = @() $GetItemSplat = @{ Path = "$($PSScriptRoot)\$($MyInvocation.MyCommand)".Replace('.ps1', '.*.yml') } - Get-Item @GetItemSplat | ForEach-Object { - Write-Host "Loading/parsing file '$($_)' ..." - $GetContentSplat = @{ - Path = $_ - 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) + ForEach ($File in (Get-Item @GetItemSplat)) { + Try { + Write-Host "Loading/parsing file '$($File)' ..." + $GetContentSplat = @{ + Path = $File + Raw = $True } - # Perform conversion to Yaml again, now with parsed file contents + $RawContent = Get-Content @GetContentSplat $ConvertFromYamlSplat = @{ Yaml = $RawContent AllDocuments = $True } $YamlDocuments = ConvertFrom-Yaml @ConvertFromYamlSplat + } + Catch { + $ParseErrors += "While processing '$($File)': $($_.Exception.Message)" + Continue + } + + # Check if the respective .yml file declared substitutions which need to be parsed + If (($YamlDocuments.Count -gt 1) -and $YamlDocuments[-1].Variables) { + Try { + 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 + } + Catch { + $ParseErrors += "While processing '$($File)' (after substitutions): $($_.Exception.Message)" + Continue + } + $GroupPolicies = $YamlDocuments[0..($YamlDocuments.Count - 2)] } Else { @@ -160,19 +174,22 @@ If (@('primary','standalone') -contains $Parameter['deployment.type']) { } ForEach ($OU in $GroupPolicy.LinkedOUs) { - If (Test-Path "AD:\$($OU + ',DC=' + $Parameter['addsconfig.domainname'].Replace('.', ',DC='))") { + If (Test-Path "AD:\$($OU + (',{0}' -f (Get-ADRootDSE).rootDomainNamingContext))") { Write-Host "Linking policy '$($NewGPO.DisplayName)' to OU '$($OU)' ..." $NewGPLinkSplat = @{ Name = $NewGPO.DisplayName - Target = $OU + ',DC=' + $Parameter['addsconfig.domainname'].Replace('.', ',DC=') + Target = $OU + (',{0}' -f (Get-ADRootDSE).rootDomainNamingContext) # ErrorAction = 'SilentlyContinue' } New-GPLink @NewGPLinkSplat | Out-Null } Else { - Throw "Path not accessible: 'AD:\$($OU + ',DC=' + $Parameter['addsconfig.domainname'].Replace('.', ',DC='))'" + Throw "Path not accessible: 'AD:\$($OU + (',{0}' -f (Get-ADRootDSE).rootDomainNamingContext))" } } } } + If ($ParseErrors) { + Throw "One or more errors occurred:`n$($ParseErrors -join "`n")" + } } diff --git a/scripts/Update-OvfConfiguration.ps1 b/scripts/Update-OvfConfiguration.ps1 index 07908fa..c0fc01f 100644 --- a/scripts/Update-OvfConfiguration.ps1 +++ b/scripts/Update-OvfConfiguration.ps1 @@ -128,13 +128,13 @@ ForEach ($Category in $OVFConfig.PropertyCategories) { $XMLPropertyAttrKey.Value = $Property.Key $XMLPropertyAttrType = $XML.CreateAttribute('type', $XML.DocumentElement.ovf) Switch -regex ($Property.Type) { - 'boolean' { + '^boolean' { $XMLPropertyAttrType.Value = 'boolean' } - 'int' { + '^int' { $XMLPropertyAttrType.Value = 'uint8' $Qualifiers = @() - If ($Property.Type -match 'int\((\d*)\.\.(\d*)\)') { + If ($Property.Type -match '^int\((\d*)\.\.(\d*)\)') { If ($Matches[1]) { $Qualifiers += "MinValue($($Matches[1]))" } @@ -146,20 +146,20 @@ ForEach ($Category in $OVFConfig.PropertyCategories) { [void]$XMLProperty.Attributes.Append($XMLPropertyAttrQualifiers) } } - 'ip' { + '^ip' { $XMLPropertyAttrType.Value = 'string' $XMLPropertyAttrQualifiers = $XML.CreateAttribute('qualifiers', $XML.DocumentElement.vmw) $XMLPropertyAttrQualifiers.Value = 'Ip' [void]$XMLProperty.Attributes.Append($XMLPropertyAttrQualifiers) } - 'password' { + '^password' { $XMLPropertyAttrType.Value = 'string' $XMLPropertyAttrPassword = $XML.CreateAttribute('password', $XML.DocumentElement.ovf) $XMLPropertyAttrPassword.Value = 'true' [void]$XMLProperty.Attributes.Append($XMLPropertyAttrPassword) $Qualifiers = @() - If ($Property.Type -match 'password\((\d*)\.\.(\d*)\)') { + If ($Property.Type -match '^password\((\d*)\.\.(\d*)\)') { If ($Matches[1]) { $Qualifiers += "MinLen($($Matches[1]))" } @@ -171,10 +171,10 @@ ForEach ($Category in $OVFConfig.PropertyCategories) { [void]$XMLProperty.Attributes.Append($XMLPropertyAttrQualifiers) } } - 'string' { + '^string' { $XMLPropertyAttrType.Value = 'string' $Qualifiers = @() - If ($Property.Type -match 'string\((\d*)\.\.(\d*)\)') { + If ($Property.Type -match '^string\((\d*)\.\.(\d*)\)') { If ($Matches[1]) { $Qualifiers += "MinLen($($Matches[1]))" } @@ -184,7 +184,7 @@ ForEach ($Category in $OVFConfig.PropertyCategories) { $XMLPropertyAttrQualifiers = $XML.CreateAttribute('qualifiers', $XML.DocumentElement.ovf) $XMLPropertyAttrQualifiers.Value = $Qualifiers -join ' ' [void]$XMLProperty.Attributes.Append($XMLPropertyAttrQualifiers) - } ElseIf ($Property.Type -match 'string\[(.*)\]') { + } ElseIf ($Property.Type -match '^string\[(.*)\]') { $XMLPropertyAttrQualifiers = $XML.CreateAttribute('qualifiers', $XML.DocumentElement.ovf) $XMLPropertyAttrQualifiers.Value = "ValueMap{$($Matches[1] -replace '","', '", "')}" [void]$XMLProperty.Attributes.Append($XMLPropertyAttrQualifiers)