From 8a009bf288ff9bbddaf8e8be4b2325964db45caa Mon Sep 17 00:00:00 2001 From: Przemyslaw Klys Date: Mon, 28 Dec 2020 11:16:59 +0100 Subject: [PATCH] Update --- Private/Get-GPOPrivLink.ps1 | 3 +- Private/Get-GPOZaurrLinkLoop.ps1 | 15 ++++----- Public/Get-GPOZaurrLink.ps1 | 52 +++++++++++++++++++++++++------- 3 files changed, 51 insertions(+), 19 deletions(-) diff --git a/Private/Get-GPOPrivLink.ps1 b/Private/Get-GPOPrivLink.ps1 index e5f492b..517d0f9 100644 --- a/Private/Get-GPOPrivLink.ps1 +++ b/Private/Get-GPOPrivLink.ps1 @@ -7,7 +7,8 @@ function Get-GPOPrivLink { [string] $Domain, [switch] $SkipDomainRoot, [switch] $SkipDomainControllers, - [switch] $AsHashTable + [switch] $AsHashTable, + [switch] $SkipDuplicates ) foreach ($Object in $ADObject) { if ($SkipDomainRoot) { diff --git a/Private/Get-GPOZaurrLinkLoop.ps1 b/Private/Get-GPOZaurrLinkLoop.ps1 index e4b6940..3bb09bc 100644 --- a/Private/Get-GPOZaurrLinkLoop.ps1 +++ b/Private/Get-GPOZaurrLinkLoop.ps1 @@ -7,7 +7,8 @@ function Get-GPOZaurrLinkLoop { [validateset('All', 'Root', 'DomainControllers', 'Site', 'OrganizationalUnit')][string[]] $Linked, [string] $SearchBase, [Microsoft.ActiveDirectory.Management.ADSearchScope] $SearchScope, - [string] $Filter + [string] $Filter, + [switch] $SkipDuplicates ) if (-not $ADObject) { if (-not $Filter) { @@ -33,7 +34,7 @@ function Get-GPOZaurrLinkLoop { } catch { Write-Warning "Get-GPOZaurrLink - Get-ADObject error $($_.Exception.Message)" } - Get-GPOPrivLink -CacheReturnedGPOs $CacheReturnedGPOs -ADObject $ADObjectGPO -Domain $Domain -ForestInformation $ForestInformation -AsHashTable:$AsHashTable + Get-GPOPrivLink -CacheReturnedGPOs $CacheReturnedGPOs -ADObject $ADObjectGPO -Domain $Domain -ForestInformation $ForestInformation -AsHashTable:$AsHashTable -SkipDuplicates:$SkipDuplicates } if ($Linked -contains 'Site' -or $Linked -contains 'All') { Write-Verbose "Get-GPOZaurrLink - Getting GPO links for domain $Domain at SITE level" @@ -47,7 +48,7 @@ function Get-GPOZaurrLinkLoop { } catch { Write-Warning "Get-GPOZaurrLink - Get-ADObject error $($_.Exception.Message)" } - Get-GPOPrivLink -CacheReturnedGPOs $CacheReturnedGPOs -ADObject $ADObjectGPO -Domain $Domain -ForestInformation $ForestInformation -AsHashTable:$AsHashTable + Get-GPOPrivLink -CacheReturnedGPOs $CacheReturnedGPOs -ADObject $ADObjectGPO -Domain $Domain -ForestInformation $ForestInformation -AsHashTable:$AsHashTable -SkipDuplicates:$SkipDuplicates } } if ($Linked -contains 'DomainControllers' -or $Linked -contains 'All') { @@ -60,7 +61,7 @@ function Get-GPOZaurrLinkLoop { } catch { Write-Warning "Get-GPOZaurrLink - Get-ADObject error $($_.Exception.Message)" } - Get-GPOPrivLink -CacheReturnedGPOs $CacheReturnedGPOs -ADObject $ADObjectGPO -Domain $Domain -ForestInformation $ForestInformation -AsHashTable:$AsHashTable + Get-GPOPrivLink -CacheReturnedGPOs $CacheReturnedGPOs -ADObject $ADObjectGPO -Domain $Domain -ForestInformation $ForestInformation -AsHashTable:$AsHashTable -SkipDuplicates:$SkipDuplicates } if ($Linked -contains 'OrganizationalUnit' -or $Linked -contains 'All') { Write-Verbose "Get-GPOZaurrLink - Getting GPO links for domain $Domain at OU level" @@ -72,7 +73,7 @@ function Get-GPOZaurrLinkLoop { } catch { Write-Warning "Get-GPOZaurrLink - Get-ADObject error $($_.Exception.Message)" } - Get-GPOPrivLink -CacheReturnedGPOs $CacheReturnedGPOs -ADObject $ADObjectGPO -Domain $Domain -ForestInformation $ForestInformation -SkipDomainRoot -SkipDomainControllers -AsHashTable:$AsHashTable + Get-GPOPrivLink -CacheReturnedGPOs $CacheReturnedGPOs -ADObject $ADObjectGPO -Domain $Domain -ForestInformation $ForestInformation -SkipDomainRoot -SkipDomainControllers -AsHashTable:$AsHashTable -SkipDuplicates:$SkipDuplicates } } } elseif ($Filter) { @@ -102,10 +103,10 @@ function Get-GPOZaurrLinkLoop { } catch { Write-Warning "Get-GPOZaurrLink - Get-ADObject error $($_.Exception.Message)" } - Get-GPOPrivLink -CacheReturnedGPOs $CacheReturnedGPOs -ADObject $ADObjectGPO -Domain $Domain -ForestInformation $ForestInformation -AsHashTable:$AsHashTable + Get-GPOPrivLink -CacheReturnedGPOs $CacheReturnedGPOs -ADObject $ADObjectGPO -Domain $Domain -ForestInformation $ForestInformation -AsHashTable:$AsHashTable -SkipDuplicates:$SkipDuplicates } } } else { - Get-GPOPrivLink -CacheReturnedGPOs $CacheReturnedGPOs -ADObject $ADObject -Domain '' -ForestInformation $ForestInformation -AsHashTable:$AsHashTable + Get-GPOPrivLink -CacheReturnedGPOs $CacheReturnedGPOs -ADObject $ADObject -Domain '' -ForestInformation $ForestInformation -AsHashTable:$AsHashTable -SkipDuplicates:$SkipDuplicates } } \ No newline at end of file diff --git a/Public/Get-GPOZaurrLink.ps1 b/Public/Get-GPOZaurrLink.ps1 index fc7f8ad..12c6131 100644 --- a/Public/Get-GPOZaurrLink.ps1 +++ b/Public/Get-GPOZaurrLink.ps1 @@ -74,14 +74,14 @@ $getGPOLoopSplat = @{ Linked = $Linked ForestInformation = $ForestInformation - CacheReturnedGPOs = $CacheReturnedGPOs SearchScope = $SearchScope SearchBase = $SearchBase ADObject = $ADObject Filter = $Filter + SkipDuplicates = $SkipDuplicates } Remove-EmptyValue -Hashtable $getGPOLoopSplat -Recursive - + $getGPOLoopSplat['CacheReturnedGPOs'] = $CacheReturnedGPOs if ($AsHashTable -or $Summary) { $HashTable = [ordered] @{} $SummaryHashtable = [ordered] @{} @@ -96,21 +96,51 @@ foreach ($Key in $HashTable.Keys) { [Array] $Link = $HashTable[$Key] $EnabledLinks = $Link.Enabled.Where( { $_ -eq $true }, 'split') + + $LinkedRoot = $false + $LinkedRootPlaces = [System.Collections.Generic.List[string]]::new() + $LinkedSite = $false + $LinkedSitePlaces = [System.Collections.Generic.List[string]]::new() + $LinkedOU = $false + $LinkedCrossDomain = $false + $LinkedCrossDomainPlaces = [System.Collections.Generic.List[string]]::new() + foreach ($InternalLink in $Link) { + if ($InternalLink.ObjectClass -eq 'domainDNS') { + $LinkedRoot = $true + $LinkedRootPlaces.Add($InternalLink.DistinguishedName) + } elseif ($InternalLink.ObjectClass -eq 'site') { + $LinkedSite = $true + $LinkedSitePlaces.Add($InternalLink.DistinguishedName) + } else { + $LinkedOU = $true + } + if ($InternalLink.DistinguishedName -notlike "*$($InternalLink.GPODomainDistinguishedName)*") { + $LinkedCrossDomain = $true + $LinkedCrossDomainPlaces.Add($InternalLink.DistinguishedName) + } + } if ($EnabledLinks[0].Count -gt 0) { $IsLinked = $true } else { $IsLinked = $false } $SummaryLink = [PSCustomObject] @{ - DisplayName = $Link[0].DisplayName - DomainName = $Link[0].DomainName - GUID = $Link[0].GUID - Linked = $IsLinked - LinksCount = $Link.Count - LinksEnabledCount = $EnabledLinks[0].Count - LinksDisabledCount = $EnabledLinks[1].Count - Links = $Link.DistinguishedName - LinksObjects = $Link + DisplayName = $Link[0].DisplayName + DomainName = $Link[0].DomainName + GUID = $Link[0].GUID + Linked = $IsLinked + LinksCount = $Link.Count + LinksEnabledCount = $EnabledLinks[0].Count + LinksDisabledCount = $EnabledLinks[1].Count + LinkedCrossDomain = $LinkedCrossDomain + LinkedRoot = $LinkedRoot + LinkedSite = $LinkedSite + LinkedOU = $LinkedOU + LinkedSitePlaces = $LinkedSitePlaces + LinkedRootPlaces = $LinkedRootPlaces + LinkedCrossDomainPlaces = $LinkedCrossDomainPlaces + Links = $Link.DistinguishedName + LinksObjects = $Link } $SummaryHashtable[$Key] = $SummaryLink }