diff --git a/Public/Get-GPOZaurrLink.ps1 b/Public/Get-GPOZaurrLink.ps1 index d798e35..9621764 100644 --- a/Public/Get-GPOZaurrLink.ps1 +++ b/Public/Get-GPOZaurrLink.ps1 @@ -72,9 +72,13 @@ # That's why we use $ForestInformation.Forest.Domains instead foreach ($Domain in $ForestInformation.Forest.Domains) { Write-Verbose "Get-GPOZaurrLink - Building GPO cache for domain $Domain" - $QueryServer = $ForestInformation['QueryServers'][$Domain]['HostName'][0] - Get-GPO -All -DomainName $Domain -Server $QueryServer | ForEach-Object { - $GPOCache["$Domain$($_.ID.Guid)"] = $_ + if ($ForestInformation['QueryServers'][$Domain]) { + $QueryServer = $ForestInformation['QueryServers'][$Domain]['HostName'][0] + Get-GPO -All -DomainName $Domain -Server $QueryServer | ForEach-Object { + $GPOCache["$Domain$($_.ID.Guid)"] = $_ + } + } else { + Write-Warning -Message "Get-GPOZaurrLink - Couldn't get query server for $Domain. Skipped." } } } diff --git a/Public/Get-GPOZaurrUpdates.ps1 b/Public/Get-GPOZaurrUpdates.ps1 index 11d3f13..9aad57c 100644 --- a/Public/Get-GPOZaurrUpdates.ps1 +++ b/Public/Get-GPOZaurrUpdates.ps1 @@ -1,13 +1,23 @@ function Get-GPOZaurrUpdates { - [cmdletBinding()] + [cmdletBinding(DefaultParameterSetName = 'DateRange')] param( + [parameter(ParameterSetName = 'Dates')] + [parameter(ParameterSetName = 'DateRange')] [alias('ForestName')][string] $Forest, + [parameter(ParameterSetName = 'Dates')] + [parameter(ParameterSetName = 'DateRange')] [string[]] $ExcludeDomains, + [parameter(ParameterSetName = 'Dates')] + [parameter(ParameterSetName = 'DateRange')] [alias('Domain', 'Domains')][string[]] $IncludeDomains, - [DateTime] $DateFrom, - [DateTime] $DateTo, - [ValidateSet('PastHour', 'CurrentHour', 'PastDay', 'CurrentDay', 'PastMonth', 'CurrentMonth', 'PastQuarter', 'CurrentQuarter', 'Last14Days', 'Last7Days', 'Last3Days', 'Last1Days')][string] $DateRange, - [ValidateSet('WhenCreated', 'WhenChanged')][string] $DateProperty = 'WhenCreated', + [parameter(Mandatory, ParameterSetName = 'Dates')][DateTime] $DateFrom, + [parameter(Mandatory, ParameterSetName = 'Dates')][DateTime] $DateTo, + [parameter(Mandatory, ParameterSetName = 'DateRange')][ValidateSet('PastHour', 'CurrentHour', 'PastDay', 'CurrentDay', 'PastMonth', 'CurrentMonth', 'PastQuarter', 'CurrentQuarter', 'Last14Days', 'Last7Days', 'Last3Days', 'Last1Days')][string] $DateRange, + [parameter(ParameterSetName = 'Dates')] + [parameter(ParameterSetName = 'DateRange')] + [ValidateSet('WhenCreated', 'WhenChanged')][string[]] $DateProperty = 'WhenCreated', + [parameter(ParameterSetName = 'Dates')] + [parameter(ParameterSetName = 'DateRange')] [System.Collections.IDictionary] $ExtendedForestInformation ) $getGPOZaurrADSplat = @{ @@ -23,7 +33,14 @@ Remove-EmptyValue -Hashtable $getGPOZaurrADSplat # lets get all the links including sites - Write-Verbose -Message "Get-GPOZaurrUpdates - Get group policies for defined ranges" + if ($DateRange) { + Write-Verbose -Message "Get-GPOZaurrUpdates - Get group policies for defined range $DateRange" + } elseif ($DateFrom -and $DateTo) { + Write-Verbose -Message "Get-GPOZaurrUpdates - Get group policies for defined range $DateFrom to $DateTo" + } else { + Write-Warning -Message "Get-GPOZaurrUpdates - No range is selected. Try again." + return + } $LinksSummaryCache = Get-GPOZaurrLink -AsHashTable -Summary -Forest $Forest -IncludeDomains $IncludeDomains -ExcludeDomains $ExcludeDomains -ExtendedForestInformation $ExtendedForestInformation $OUCache = [ordered] @{} @@ -34,7 +51,7 @@ } $CurrentCount = 0 - Write-Verbose -Message "Get-GPOZaurrUpdates - Getting all GPOs for defined ranges" + Write-Verbose -Message "Get-GPOZaurrUpdates - Getting GPO information" [Array] $GPOs = Get-GPOZaurrAD @getGPOZaurrADSplat foreach ($GPO in $GPOs) { $CurrentCount++ @@ -58,15 +75,27 @@ ObjectsClasses = @() } } + if ($GPO.Owner) { + $Owner = Get-WinADObject -Identity $GPO.Owner -AddType + } else { + $Owner = [PSCustomObject] @{ + Name = 'Unknown' + Type = 'Unknown' + ObjectClass = 'Unknown' + } + } [PSCustomObject] @{ DisplayName = $GPO.DisplayName DomainName = $GPO.DomainName Owner = $GPO.Owner + OwnerName = $Owner.Name + OwnerType = $Owner.Type + OwnerClass = $Owner.ObjectClass LinksCount = if ($GPOLinkData) { $GPOLinkData.LinksCount } else { 0 } LinksEnabledCount = if ($GPOLinkData) { $GPOLinkData.LinksEnabledCount } else { 0 } AffectedCount = $OrganizationalUnitsObjects.ObjectsTotalCount BlockedInheritanceCount = $OrganizationalUnitsObjects.ObjectsBlockedInheritanceCount - AffectedClasses = $OrganizationalUnitsObjects.ObjectsClasses + AffectedClasses = $OrganizationalUnitsObjects.ObjectsClasses.GetEnumerator().Name Created = $GPO.Created Changed = $GPO.Modified LinksEnabled = $LinksDN