mirror of
https://github.com/EvotecIT/GPOZaurr.git
synced 2026-07-26 11:49:17 +00:00
927ae5cd15
* Updated comments in `Example-36-FindBlockedInheritance.ps1` for clarity. * Fixed spelling error in `Invoke.GPOZaurrBlockedInheritance.ps1`.
241 lines
18 KiB
PowerShell
241 lines
18 KiB
PowerShell
$GPOZaurrBlockedInheritance = [ordered] @{
|
|
Name = 'Group Policy Blocked Inheritance'
|
|
Enabled = $true
|
|
ActionRequired = $null
|
|
Data = $null
|
|
Execute = {
|
|
if ($Script:Reporting['GPOBlockedInheritance']['Exclusions']) {
|
|
Get-GPOZaurrInheritance -IncludeBlockedObjects -IncludeExcludedObjects -OnlyBlockedInheritance -IncludeGroupPoliciesForBlockedObjects -Forest $Forest -IncludeDomains $IncludeDomains -ExcludeDomains $ExcludeDomains -Exclusions $Script:Reporting['GPOBlockedInheritance']['Exclusions']
|
|
} else {
|
|
Get-GPOZaurrInheritance -IncludeBlockedObjects -IncludeExcludedObjects -OnlyBlockedInheritance -IncludeGroupPoliciesForBlockedObjects -Forest $Forest -IncludeDomains $IncludeDomains -ExcludeDomains $ExcludeDomains
|
|
}
|
|
}
|
|
Processing = {
|
|
foreach ($GPO in $Script:Reporting['GPOBlockedInheritance']['Data']) {
|
|
if (-not $Script:Reporting['GPOBlockedInheritance']['Variables']['DeletionHarmlessPerDomain'][$GPO.DomainName]) {
|
|
$Script:Reporting['GPOBlockedInheritance']['Variables']['DeletionHarmlessPerDomain'][$GPO.DomainName] = 0
|
|
}
|
|
if (-not $Script:Reporting['GPOBlockedInheritance']['Variables']['RequiresInvesigationPerDomain'][$GPO.DomainName]) {
|
|
$Script:Reporting['GPOBlockedInheritance']['Variables']['RequiresInvesigationPerDomain'][$GPO.DomainName] = 0
|
|
}
|
|
if ($GPO.Exclude -eq $true) {
|
|
$Script:Reporting['GPOBlockedInheritance']['Variables']['Exclude']++
|
|
$Script:Reporting['GPOBlockedInheritance']['Variables']['UsersAffectedExclude'] = $Script:Reporting['GPOBlockedInheritance']['Variables']['UsersAffectedExclude'] + $GPO.UsersCount
|
|
$Script:Reporting['GPOBlockedInheritance']['Variables']['ComputersAffectedExclude'] = $Script:Reporting['GPOBlockedInheritance']['Variables']['ComputersAffectedExclude'] + $GPO.ComputersCount
|
|
} else {
|
|
$Script:Reporting['GPOBlockedInheritance']['Variables']['UsersAffected'] = $Script:Reporting['GPOBlockedInheritance']['Variables']['UsersAffected'] + $GPO.UsersCount
|
|
$Script:Reporting['GPOBlockedInheritance']['Variables']['ComputersAffected'] = $Script:Reporting['GPOBlockedInheritance']['Variables']['ComputersAffected'] + $GPO.ComputersCount
|
|
}
|
|
$Script:Reporting['GPOBlockedInheritance']['Variables']['UsersAffectedIncludingExclude'] = $Script:Reporting['GPOBlockedInheritance']['Variables']['UsersAffectedIncludingExclude'] + $GPO.UsersCount
|
|
$Script:Reporting['GPOBlockedInheritance']['Variables']['ComputersAffectedIncludingExclude'] = $Script:Reporting['GPOBlockedInheritance']['Variables']['ComputersAffectedIncludingExclude'] + $GPO.ComputersCount
|
|
|
|
if ($GPO.Exclude -eq $false -and ($GPO.UsersCount -gt 0 -or $GPO.ComputersCount -gt 0)) {
|
|
$Script:Reporting['GPOBlockedInheritance']['Variables']['RequiresInvesigation']++
|
|
$Script:Reporting['GPOBlockedInheritance']['Variables']['RequiresInvesigationPerDomain'][$GPO.DomainName]++
|
|
}
|
|
if ($GPO.Exclude -eq $false -and ($GPO.UsersCount -eq 0 -and $GPO.ComputersCount -eq 0)) {
|
|
$Script:Reporting['GPOBlockedInheritance']['Variables']['DeletionHarmless']++
|
|
$Script:Reporting['GPOBlockedInheritance']['Variables']['DeletionHarmlessPerDomain'][$GPO.DomainName]++
|
|
}
|
|
# add gpo from blocked inheritance to create additional table
|
|
#foreach ($GpoBlocked in $Script:Reporting['GPOBlockedInheritance']['Data'].GroupPolicies) {
|
|
#$Script:Reporting['GPOBlockedInheritance']['Variables']['GroupPolicies'].Add($GpoBlocked)
|
|
#}
|
|
}
|
|
if ($Script:Reporting['GPOBlockedInheritance']['Variables']['RequiresInvesigation'] -gt 0 -or $Script:Reporting['GPOBlockedInheritance']['Variables']['DeletionHarmless'] -gt 0) {
|
|
$Script:Reporting['GPOBlockedInheritance']['ActionRequired'] = $true
|
|
} else {
|
|
$Script:Reporting['GPOBlockedInheritance']['ActionRequired'] = $false
|
|
}
|
|
}
|
|
Resources = @(
|
|
'http://www.firewall.cx/microsoft-knowledgebase/windows-2012/1056-windows-2012-group-policy-enforcement.html'
|
|
)
|
|
Variables = @{
|
|
Total = 0
|
|
Exclude = 0
|
|
RequiresInvesigation = 0
|
|
RequiresInvesigationPerDomain = [ordered] @{}
|
|
DeletionHarmless = 0
|
|
DeletionHarmlessPerDomain = [ordered] @{}
|
|
UsersAffected = 0
|
|
UsersAffectedExclude = 0
|
|
UsersAffectedIncludingExclude = 0
|
|
ComputersAffected = 0
|
|
ComputersAffectedIncludingExclude = 0
|
|
ComputersAffectedExclude = 0
|
|
GroupPolicies = [System.Collections.Generic.List[PSCustomObject]]::new()
|
|
}
|
|
Overview = {
|
|
|
|
}
|
|
Summary = {
|
|
New-HTMLText -FontSize 10pt -TextBlock {
|
|
"By default, group policy settings that are linked to parent objects are inherited to the child objects in the active directory hierarchy. "
|
|
"By default, Default Domain Policy is linked to the domain and is inherited to all the child objects of the domain hierarchy. "
|
|
"So does any other policies linked to the top level OU's. "
|
|
}
|
|
New-HTMLText -Text "Blocked Inheritance" -FontSize 10pt -FontWeight bold
|
|
New-HTMLText -FontSize 10pt -Text @(
|
|
"As GPOs can be inherited by default, they can also be blocked, if required using the Block Inheritance. "
|
|
"If the Block Inheritance setting is enabled, the inheritance of group policy setting is blocked. "
|
|
"This setting is mostly used when the OU contains users or computers that require different settings than what is applied to the domain level. "
|
|
"Unfortunately blocking inheritance can have serious security consequences. "
|
|
)
|
|
New-HTMLText -Text @(
|
|
'As it stands currently there are ',
|
|
$Script:Reporting['GPOBlockedInheritance']['Data'].Count,
|
|
' organisational units with '
|
|
'GPO Inheritance Block'
|
|
' out of which '
|
|
$Script:Reporting['GPOBlockedInheritance']['Variables']['Exclude'],
|
|
' are marked as Excluded '
|
|
'(approved by IT). '
|
|
) -FontSize 10pt -FontWeight normal, bold, normal, bold, normal, bold, normal, bold -LineBreak
|
|
if ($Script:Reporting['GPOBlockedInheritance']['Data'].Count -ne 0) {
|
|
New-HTMLText -Text 'Users & Computers affected by inheritance blocks:' -FontSize 10pt -FontWeight bold
|
|
New-HTMLList -Type Unordered {
|
|
New-HTMLListItem -Text $Script:Reporting['GPOBlockedInheritance']['Variables']['UsersAffected'], ' users affected due to inheritance blocks' -FontWeight bold, normal
|
|
New-HTMLListItem -Text $Script:Reporting['GPOBlockedInheritance']['Variables']['UsersAffectedExclude'], ' users affected, but approved/excluded, due to inheritance blocks' -FontWeight bold, normal
|
|
New-HTMLListItem -Text $Script:Reporting['GPOBlockedInheritance']['Variables']['ComputersAffected'], ' computers affected due to inheritance blocks' -FontWeight bold, normal
|
|
New-HTMLListItem -Text $Script:Reporting['GPOBlockedInheritance']['Variables']['ComputersAffectedExclude'], ' computers affected, but approved/excluded, due to inheritance blocks' -FontWeight bold, normal
|
|
} -FontSize 10pt
|
|
|
|
New-HTMLText -Text 'Following domains require:' -FontSize 10pt -FontWeight bold
|
|
New-HTMLList -Type Unordered {
|
|
foreach ($Domain in $Script:Reporting['GPOBlockedInheritance']['Variables']['RequiresInvesigationPerDomain'].Keys) {
|
|
New-HTMLListItem -Text "$Domain proposes ", $Script:Reporting['GPOBlockedInheritance']['Variables']['RequiresInvesigationPerDomain'][$Domain], " investigation (computers or users inside)." -FontWeight normal, bold, normal
|
|
New-HTMLListItem -Text "$Domain proposes ", $Script:Reporting['GPOBlockedInheritance']['Variables']['DeletionHarmlessPerDomain'][$Domain], " removal (mostly harmless due to no computers or users inside)." -FontWeight normal, bold, normal
|
|
}
|
|
} -FontSize 10pt
|
|
}
|
|
New-HTMLText -FontSize 10pt -Text "Please review output in table and follow the steps below table to get Active Directory Group Policies in healthy state."
|
|
|
|
if ($Script:Reporting['GPOBlockedInheritance']['Exclusions']) {
|
|
New-HTMLText -LineBreak
|
|
New-HTMLText -Text @(
|
|
"While preparing this report following exclusions were defined. "
|
|
"Please make sure that when you execute your steps to include those exclusions to prevent any issues. "
|
|
) -FontSize 10pt -FontWeight bold, normal -Color Red, None -LineBreak
|
|
|
|
New-HTMLText -Text "Code to use for exclusions: " -FontSize 10pt -FontWeight bold -LineBreak
|
|
|
|
$Code = New-GPOZaurrExclusions -ExclusionsArray $Script:Reporting['GPOBlockedInheritance']['Exclusions']
|
|
|
|
if ($Code) {
|
|
New-HTMLCodeBlock -Code $Code -Style powershell
|
|
}
|
|
}
|
|
}
|
|
Solution = {
|
|
New-HTMLSection -Invisible {
|
|
New-HTMLPanel {
|
|
& $Script:GPOConfiguration['GPOBlockedInheritance']['Summary']
|
|
}
|
|
New-HTMLPanel {
|
|
New-HTMLChart {
|
|
New-ChartLegend -Names 'Affected', 'Affected, but excluded' -Color Salmon, PaleGreen
|
|
New-ChartBarOptions -Type barStacked
|
|
New-ChartBar -Name 'Users' -Value $Script:Reporting['GPOBlockedInheritance']['Variables']['UsersAffected'], $Script:Reporting['GPOBlockedInheritance']['Variables']['UsersAffectedExclude']
|
|
New-ChartBar -Name 'Computers' -Value $Script:Reporting['GPOBlockedInheritance']['Variables']['ComputersAffected'], $Script:Reporting['GPOBlockedInheritance']['Variables']['ComputersAffectedExclude']
|
|
} -Title 'Users & Computers affected due to blocked inheritance' -TitleAlignment center
|
|
}
|
|
}
|
|
New-HTMLSection -Name 'Organizational Units with Group Policy Blocked Inheritance' {
|
|
New-HTMLTable -DataTable $Script:Reporting['GPOBlockedInheritance']['Data'] -Filtering {
|
|
New-TableEvent -TableID 'TableWithGroupPoliciesBlockedInheritance' -SourceColumnID 8 -TargetColumnID 9
|
|
New-HTMLTableCondition -Name 'Exclude' -Value $true -BackgroundColor DeepSkyBlue -ComparisonType string -Row
|
|
New-TableConditionGroup {
|
|
New-TableCondition -Name 'BlockedInheritance' -Value $true
|
|
New-TableCondition -Name 'Exclude' -Value $false
|
|
} -BackgroundColor Salmon -FailBackgroundColor SpringGreen -HighlightHeaders 'BlockedInheritance', 'Exclude'
|
|
New-TableConditionGroup {
|
|
New-TableCondition -Name 'UsersCount' -Value 0
|
|
New-TableCondition -Name 'ComputersCount' -Value 0
|
|
} -BackgroundColor Salmon -FailBackgroundColor Amber -HighlightHeaders 'UsersCount', 'ComputersCount'
|
|
New-TableColumnOption -Hidden $true -ColumnIndex 8
|
|
} -PagingOptions 5, 10, 20, 30, 40, 50 -ExcludeProperty GroupPolicies -ScrollX
|
|
}
|
|
New-HTMLSection -Name 'Group Policies affecting objects in Organizational Units with Blocked Inheritance' {
|
|
New-HTMLTable -DataTable $Script:Reporting['GPOBlockedInheritance']['Data'].GroupPolicies -Filtering {
|
|
New-TableCondition -Name 'Enabled' -Value $true -BackgroundColor SpringGreen -FailBackgroundColor Salmon
|
|
New-TableCondition -Name 'Enforced' -Value $true -BackgroundColor Amber -FailBackgroundColor AirForceBlue
|
|
New-TableCondition -Name 'LinkedDirectly' -Value $true -BackgroundColor Amber -FailBackgroundColor AirForceBlue
|
|
} -PagingOptions 5, 10, 20, 30, 40, 50 -DataTableID 'TableWithGroupPoliciesBlockedInheritance' -ScrollX
|
|
}
|
|
if ($Script:Reporting['Settings']['HideSteps'] -eq $false) {
|
|
New-HTMLSection -Name 'Steps to fix - Organizational Units with Group Policy Blocked Inheritance' {
|
|
New-HTMLContainer {
|
|
New-HTMLSpanStyle -FontSize 10pt {
|
|
New-HTMLWizard {
|
|
New-HTMLWizardStep -Name 'Prepare environment' {
|
|
New-HTMLText -Text "To be able to execute actions in automated way please install required modules. Those modules will be installed straight from Microsoft PowerShell Gallery."
|
|
New-HTMLCodeBlock -Code {
|
|
Install-Module GPOZaurr -Force
|
|
Import-Module GPOZaurr -Force
|
|
} -Style powershell
|
|
New-HTMLText -Text "Using force makes sure newest version is downloaded from PowerShellGallery regardless of what is currently installed. Once installed you're ready for next step."
|
|
}
|
|
if ($Script:Reporting['GPOBlockedInheritance']['Exclusions']) {
|
|
New-HTMLWizardStep -Name 'Required exclusions' {
|
|
New-HTMLText -Text @(
|
|
"While preparing this report following exclusions were defined. "
|
|
"Please make sure that when you execute your steps to include those exclusions to prevent any issues. "
|
|
)
|
|
$Code = New-GPOZaurrExclusions -ExclusionsArray $Script:Reporting['GPOBlockedInheritance']['Exclusions']
|
|
|
|
if ($Code) {
|
|
New-HTMLCodeBlock -Code $Code -Style powershell
|
|
}
|
|
}
|
|
}
|
|
New-HTMLWizardStep -Name 'Prepare report' {
|
|
New-HTMLText -Text @(
|
|
"Depending when this report was run you may want to prepare new report before proceeding removing Group Policy Inheritance Blocks. "
|
|
"Please keep in mind that if exclusions for some Organizational OU's were defined you need to pass them to cmdlet below to not remove approved GPO Inheritance Blocks. "
|
|
"To generate new report please use:"
|
|
)
|
|
New-HTMLCodeBlock -Code {
|
|
Invoke-GPOZaurr -FilePath $Env:UserProfile\Desktop\GPOZaurrBlockedGPOInheritanceBefore.html -Verbose -Type GPOBlockedInheritance
|
|
}
|
|
New-HTMLText -TextBlock {
|
|
"When executed it will take a while to generate all data and provide you with new report depending on size of environment. "
|
|
"Once confirmed that data is still showing issues and requires fixing please proceed with next step. "
|
|
}
|
|
New-HTMLText -Text "Alternatively if you prefer working with console you can run: "
|
|
New-HTMLCodeBlock -Code {
|
|
$GPOOutput = Get-GPOZaurrInheritance -IncludeBlockedObjects -IncludeExcludedObjects -OnlyBlockedInheritance
|
|
$GPOOutput | Format-Table # do your actions as desired
|
|
}
|
|
New-HTMLText -Text "It provides same data as you see in table above just doesn't prettify it for you."
|
|
}
|
|
New-HTMLWizardStep -Name 'Remove OU GPO Inheritance Blocks' {
|
|
New-HTMLText -Text @(
|
|
"Removing inheritance blocks is quite trivial and can be done from GPO GUI. However knowing when to remove is the important part. "
|
|
"Please consult other Domain Admins before removing any inheritance blocks, and either approve exclusion or remove blocking inheritance. "
|
|
)
|
|
}
|
|
New-HTMLWizardStep -Name 'Verification report' {
|
|
New-HTMLText -TextBlock {
|
|
"Once cleanup task was executed properly, we need to verify that report now shows no problems."
|
|
}
|
|
New-HTMLCodeBlock -Code {
|
|
Invoke-GPOZaurr -FilePath $Env:UserProfile\Desktop\GPOZaurrBlockedGPOInheritanceAfter.html -Verbose -Type GPOBlockedInheritance
|
|
}
|
|
New-HTMLText -Text "If everything is healthy in the report you're done! Enjoy rest of the day!" -Color BlueDiamond
|
|
}
|
|
} -RemoveDoneStepOnNavigateBack -Theme arrows -ToolbarButtonPosition center -EnableAllAnchors
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if ($Script:Reporting['GPOBlockedInheritance']['WarningsAndErrors']) {
|
|
New-HTMLSection -Name 'Warnings & Errors to Review' {
|
|
New-HTMLTable -DataTable $Script:Reporting['GPOBlockedInheritance']['WarningsAndErrors'] -Filtering {
|
|
New-HTMLTableCondition -Name 'Type' -Value 'Warning' -BackgroundColor SandyBrown -ComparisonType string -Row
|
|
New-HTMLTableCondition -Name 'Type' -Value 'Error' -BackgroundColor Salmon -ComparisonType string -Row
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |