mirror of
https://github.com/EvotecIT/GPOZaurr.git
synced 2026-07-26 20:00:09 +00:00
Compare commits
57 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 9c689708ba | |||
| bb18d488b4 | |||
| e72d81aee3 | |||
| 70ed52cdf9 | |||
| 3b414e712c | |||
| 7ed1410fd9 | |||
| 6d2e476916 | |||
| b7ed5e0c5a | |||
| 72bd69d0e6 | |||
| b5c1f3dcd5 | |||
| bc773e2e83 | |||
| 8db961cba6 | |||
| 227639d0f6 | |||
| e03f819461 | |||
| fb955f645b | |||
| 3fc3b74798 | |||
| 695f4dbe6a | |||
| 5d69cef128 | |||
| 062374b4be | |||
| e61329ac66 | |||
| d3328dbb81 | |||
| 5803371b5e | |||
| 263f364ede | |||
| 16a181155b | |||
| 962d8829d7 | |||
| 4155c35cc6 | |||
| 614d8cbda5 | |||
| 43e7f2e746 | |||
| 9a3ed3b6ce | |||
| 50f0cfc1a6 | |||
| 269d611563 | |||
| 55ab89a5b0 | |||
| 9da8c7c94b | |||
| 53aa69029f | |||
| 4189ad12f2 | |||
| b1c3037803 | |||
| 62308cbb6d | |||
| 914dcfb0c4 | |||
| 2cf4d2c6c9 | |||
| d53d50f99b | |||
| 2ef3c306ff | |||
| 481338f83b | |||
| eaf3b231ae | |||
| b2c73479c7 | |||
| 38c6327e30 | |||
| 0b3e072a3e | |||
| 89664bfd02 | |||
| 1021ebe5f4 | |||
| 521125bbc1 | |||
| ae6b596e5b | |||
| bfe50f02fe | |||
| 187b44a19d | |||
| 36793b33c4 | |||
| 94e6c785c1 | |||
| efbd2b12de | |||
| d0a678353f | |||
| 6b0f3b332d |
@@ -7,4 +7,7 @@ Add-GPOZaurrPermission -GPOName 'New Group Policy Object' -Type AuthenticatedUse
|
||||
Add-GPOZaurrPermission -Type AuthenticatedUsers -PermissionType GpoRead -All -WhatIf -Verbose
|
||||
|
||||
# Add Domain Admins/Enterprise Admins to all that need it
|
||||
Add-GPOZaurrPermission -Type Administrative -PermissionType GpoEditDeleteModifySecurity -All -WhatIf -Verbose
|
||||
Add-GPOZaurrPermission -Type Administrative -PermissionType GpoEditDeleteModifySecurity -All -WhatIf -Verbose
|
||||
|
||||
# Add ranom name to all that need it
|
||||
Add-GPOZaurrPermission -All -Principal SVC_AGPM -PrincipalType Name -PermissionType GpoEditDeleteModifySecurity -Verbose -LimitProcessing 2 -WhatIf
|
||||
@@ -4,7 +4,7 @@
|
||||
Get-GPOZaurrBroken -Verbose | Format-Table # -IncludeDomains 'ad.evotec.pl' | Format-Table
|
||||
|
||||
# this allows you to process X amount of orphaned folders/files (good for testing)
|
||||
Remove-GPOZaurrBroken -Verbose -WhatIf -Type AD, SYSVOL -LimitProcessing 1 #-IncludeDomains 'ad.evotec.pl' #-LimitProcessing 2
|
||||
Remove-GPOZaurrBroken -Verbose -WhatIf -Type AD -LimitProcessing 10 #-IncludeDomains 'ad.evotec.pl' #-LimitProcessing 2
|
||||
|
||||
# this runs for whole SYSVOL and checks things against GPOS
|
||||
Remove-GPOZaurrBroken -Verbose -IncludeDomains 'ad.evotec.xyz' -BackupPath $Env:UserProfile\Desktop\MyBackup1 -WhatIf -Type AD, SYSVOL
|
||||
@@ -8,7 +8,7 @@ Import-Module "$PSScriptRoot\..\GPoZaurr.psd1" -Force
|
||||
#Get-GPOZaurrLinkSummary -Report 'LinksSummary' -UnlimitedProperties | Format-Table *
|
||||
|
||||
$Report = Get-GPOZaurrLinkSummary #-UnlimitedProperties
|
||||
$Report | Format-Table
|
||||
$Report.MultipleLinks | Format-Table *
|
||||
#$Report | Format-Table
|
||||
#$Report.MultipleLinks | Format-Table *
|
||||
$Report.OneLink | Format-Table *
|
||||
$Report.LinksSummary | Format-Table *
|
||||
#$Report.LinksSummary | Format-Table *
|
||||
@@ -1,4 +1,4 @@
|
||||
Import-Module "$PSScriptRoot\..\GPoZaurr.psd1" -Force
|
||||
|
||||
$Output = Invoke-GPOZaurrContent -Verbose -OutputType HTML, Object -Open -Type LocalGroups
|
||||
$Output = Invoke-GPOZaurrContent -Verbose -OutputType HTML, Object -Open -GPOPath "C:\Support\GitHub\GpoZaurr\Ignore\NewExamples" ##-Type LocalGroups
|
||||
$Output | Format-Table
|
||||
@@ -6,5 +6,10 @@
|
||||
|
||||
# Get same output DN, CanonicalName, BlockInheritance (True/False) + Users/Computers + UsersCount/ComputerCount for those with Blocked Inhertiance
|
||||
# This is so you can have a list what machines are affected
|
||||
$Objects = Get-GPOZaurrInheritance -IncludeBlockedObjects -OnlyBlockedInheritance
|
||||
$ExcludedOU = @(
|
||||
# Works on OU/
|
||||
'ad.evotec.xyz/ITR02/Test'
|
||||
)
|
||||
|
||||
$Objects = Get-GPOZaurrInheritance -IncludeBlockedObjects -IncludeExcludedObjects -OnlyBlockedInheritance -Exclusions $ExcludedOU -IncludeGroupPoliciesForBlockedObjects
|
||||
$Objects | Format-Table
|
||||
@@ -1,4 +1,4 @@
|
||||
Import-Module "$PSScriptRoot\..\GPoZaurr.psd1" -Force
|
||||
|
||||
$FilesAll = Get-GPOZaurrNetLogon -SkipOwner -IncludeDomains 'ad.evotec.pl' #-OwnerOnly
|
||||
$FilesAll = Get-GPOZaurrNetLogon -IncludeDomains 'ad.evotec.xyz' -Verbose -OwnerOnly
|
||||
$FilesAll | Format-Table -a *
|
||||
@@ -1,4 +1,16 @@
|
||||
Import-Module "$PSScriptRoot\..\GPoZaurr.psd1" -Force
|
||||
|
||||
#$Output = Invoke-GPOZaurr -FilePath $PSScriptRoot\Reports\GPOZaurr.html -PassThru -Type GPOConsistency, GPOList, GPODuplicates, GPOBroken, GPOOwners, NetLogonOwners, GPOPermissionsRead, GPOPermissionsAdministrative,GPOPermissionsUnknown
|
||||
Invoke-GPOZaurr #-FilePath $PSScriptRoot\Reports\GPOZaurr.html -Type GPOList
|
||||
|
||||
# Shows how to use exclusions (supported only in GPOBlockedInheritance)
|
||||
Invoke-GPOZaurr -FilePath $PSScriptRoot\Reports\GPOZaurr.html -Type GPOBlockedInheritance -Online -Exclusions @(
|
||||
'OU=Test,OU=ITR02,DC=ad,DC=evotec,DC=xyz'
|
||||
)
|
||||
|
||||
<#
|
||||
# Shows how to use exclusions for GPOList (different way)
|
||||
Invoke-GPOZaurr -FilePath $PSScriptRoot\Reports\GPOZaurr.html -Type GPOList -Online -Exclusions {
|
||||
Skip-GroupPolicy -Name 'de14_usr_std'
|
||||
Skip-GroupPolicy -Name 'ALL | Enable RDP' -DomaiName 'ad.evotec.xyz'
|
||||
}
|
||||
#>
|
||||
@@ -1,7 +1,7 @@
|
||||
Import-Module "$PSScriptRoot\..\GPoZaurr.psd1" -Force
|
||||
|
||||
$GPOS = Get-GPOZaurr -GPOPath 'C:\Support\GitHub\GpoZaurr\Ignore\Empty' -ExcludeGroupPolicies @(
|
||||
$GPOS = Get-GPOZaurr -GPOPath 'C:\Support\GitHub\GpoZaurr\Ignore\Empty' -ExcludeGroupPolicies {
|
||||
Skip-GroupPolicy -Name 'de14_usr_std'
|
||||
Skip-GroupPolicy -Name 'de14_usr_std' -DomaiName 'ad.evotec.xyz'
|
||||
)
|
||||
}
|
||||
$GPOS | Format-Table -AutoSize *
|
||||
@@ -1,5 +1,5 @@
|
||||
Import-Module "$PSScriptRoot\..\GPoZaurr.psd1" -Force
|
||||
|
||||
Repair-GPOZaurrBrokenLink -Verbose -LimitProcessing 1 -WhatIf
|
||||
Repair-GPOZaurrBrokenLink -Verbose -LimitProcessing 1 #-WhatIf
|
||||
|
||||
#Repair-GPOZaurrBrokenLink -Verbose -IncludeDomains ad.evotec.pl -LimitProcessing 30 #-WhatIf
|
||||
@@ -0,0 +1,10 @@
|
||||
Import-Module "$PSScriptRoot\..\GPoZaurr.psd1" -Force
|
||||
|
||||
Remove-GPOZaurrLinkEmptyOU -Verbose -LimitProcessing 3 -WhatIf
|
||||
|
||||
$Exclude = @(
|
||||
"OU=Groups,OU=Production,DC=ad,DC=evotec,DC=pl"
|
||||
"OU=Test \, OU,OU=ITR02,DC=ad,DC=evotec,DC=xyz"
|
||||
)
|
||||
|
||||
Remove-GPOZaurrLinkEmptyOU -Verbose -LimitProcessing 3 -WhatIf -ExcludeOrganizationalUnit $Exclude
|
||||
@@ -0,0 +1,5 @@
|
||||
Import-Module "$PSScriptRoot\..\GPoZaurr.psd1" -Force
|
||||
|
||||
#Get-GPOZaurrOrganizationalUnit -Verbose -Option Unlink | Format-Table
|
||||
|
||||
Invoke-GPOZaurr -Type GPOOrganizationalUnit -Online -FilePath $PSScriptRoot\Reports\GPOZaurrOU.html
|
||||
+5
-5
@@ -6,9 +6,9 @@
|
||||
CompatiblePSEditions = @('Desktop')
|
||||
Copyright = '(c) 2011 - 2021 Przemyslaw Klys @ Evotec. All rights reserved.'
|
||||
Description = 'Group Policy Eater is a PowerShell module that aims to gather information about Group Policies but also allows fixing issues that you may find in them.'
|
||||
FunctionsToExport = @('Add-GPOPermission', 'Add-GPOZaurrPermission', 'Backup-GPOZaurr', 'Clear-GPOZaurrSysvolDFSR', 'ConvertFrom-CSExtension', 'Find-CSExtension', 'Get-GPOZaurr', 'Get-GPOZaurrAD', 'Get-GPOZaurrBackupInformation', 'Get-GPOZaurrBroken', 'Get-GPOZaurrBrokenLink', 'Get-GPOZaurrDictionary', 'Get-GPOZaurrDuplicateObject', 'Get-GPOZaurrFiles', 'Get-GPOZaurrFilesPolicyDefinition', 'Get-GPOZaurrFolders', 'Get-GPOZaurrInheritance', 'Get-GPOZaurrLegacyFiles', 'Get-GPOZaurrLink', 'Get-GPOZaurrLinkSummary', 'Get-GPOZaurrNetLogon', 'Get-GPOZaurrOwner', 'Get-GPOZaurrPassword', 'Get-GPOZaurrPermission', 'Get-GPOZaurrPermissionAnalysis', 'Get-GPOZaurrPermissionConsistency', 'Get-GPOZaurrPermissionIssue', 'Get-GPOZaurrPermissionRoot', 'Get-GPOZaurrPermissionSummary', 'Get-GPOZaurrSysvolDFSR', 'Get-GPOZaurrWMI', 'Invoke-GPOZaurr', 'Invoke-GPOZaurrContent', 'Invoke-GPOZaurrPermission', 'Invoke-GPOZaurrSupport', 'New-GPOZaurrWMI', 'Optimize-GPOZaurr', 'Remove-GPOPermission', 'Remove-GPOZaurr', 'Remove-GPOZaurrBroken', 'Remove-GPOZaurrDuplicateObject', 'Remove-GPOZaurrFolders', 'Remove-GPOZaurrLegacyFiles', 'Remove-GPOZaurrPermission', 'Remove-GPOZaurrWMI', 'Repair-GPOZaurrBrokenLink', 'Repair-GPOZaurrNetLogonOwner', 'Repair-GPOZaurrPermission', 'Repair-GPOZaurrPermissionConsistency', 'Restore-GPOZaurr', 'Save-GPOZaurrFiles', 'Set-GPOOwner', 'Set-GPOZaurrOwner', 'Set-GPOZaurrStatus', 'Skip-GroupPolicy')
|
||||
FunctionsToExport = @('Add-GPOPermission', 'Add-GPOZaurrPermission', 'Backup-GPOZaurr', 'Clear-GPOZaurrSysvolDFSR', 'ConvertFrom-CSExtension', 'Find-CSExtension', 'Get-GPOZaurr', 'Get-GPOZaurrAD', 'Get-GPOZaurrBackupInformation', 'Get-GPOZaurrBroken', 'Get-GPOZaurrBrokenLink', 'Get-GPOZaurrDictionary', 'Get-GPOZaurrDuplicateObject', 'Get-GPOZaurrFiles', 'Get-GPOZaurrFilesPolicyDefinition', 'Get-GPOZaurrFolders', 'Get-GPOZaurrInheritance', 'Get-GPOZaurrLegacyFiles', 'Get-GPOZaurrLink', 'Get-GPOZaurrLinkSummary', 'Get-GPOZaurrNetLogon', 'Get-GPOZaurrOrganizationalUnit', 'Get-GPOZaurrOwner', 'Get-GPOZaurrPassword', 'Get-GPOZaurrPermission', 'Get-GPOZaurrPermissionAnalysis', 'Get-GPOZaurrPermissionConsistency', 'Get-GPOZaurrPermissionIssue', 'Get-GPOZaurrPermissionRoot', 'Get-GPOZaurrPermissionSummary', 'Get-GPOZaurrSysvolDFSR', 'Get-GPOZaurrWMI', 'Invoke-GPOZaurr', 'Invoke-GPOZaurrContent', 'Invoke-GPOZaurrPermission', 'Invoke-GPOZaurrSupport', 'New-GPOZaurrWMI', 'Optimize-GPOZaurr', 'Remove-GPOPermission', 'Remove-GPOZaurr', 'Remove-GPOZaurrBroken', 'Remove-GPOZaurrDuplicateObject', 'Remove-GPOZaurrFolders', 'Remove-GPOZaurrLegacyFiles', 'Remove-GPOZaurrLinkEmptyOU', 'Remove-GPOZaurrPermission', 'Remove-GPOZaurrWMI', 'Repair-GPOZaurrBrokenLink', 'Repair-GPOZaurrNetLogonOwner', 'Repair-GPOZaurrPermission', 'Repair-GPOZaurrPermissionConsistency', 'Restore-GPOZaurr', 'Save-GPOZaurrFiles', 'Set-GPOOwner', 'Set-GPOZaurrOwner', 'Set-GPOZaurrStatus', 'Skip-GroupPolicy')
|
||||
GUID = 'f7d4c9e4-0298-4f51-ad77-e8e3febebbde'
|
||||
ModuleVersion = '0.0.121'
|
||||
ModuleVersion = '0.0.129'
|
||||
PowerShellVersion = '5.1'
|
||||
PrivateData = @{
|
||||
PSData = @{
|
||||
@@ -18,15 +18,15 @@
|
||||
}
|
||||
}
|
||||
RequiredModules = @(@{
|
||||
ModuleVersion = '0.0.195'
|
||||
ModuleVersion = '0.0.208'
|
||||
ModuleName = 'PSSharedGoods'
|
||||
Guid = 'ee272aa8-baaa-4edf-9f45-b6d6f7d844fe'
|
||||
}, @{
|
||||
ModuleVersion = '0.0.112'
|
||||
ModuleVersion = '0.0.130'
|
||||
ModuleName = 'ADEssentials'
|
||||
Guid = '9fc9fd61-7f11-4f4b-a527-084086f1905f'
|
||||
}, @{
|
||||
ModuleVersion = '0.0.132'
|
||||
ModuleVersion = '0.0.158'
|
||||
ModuleName = 'PSWriteHTML'
|
||||
Guid = 'a7bdf640-f5cb-4acf-9de0-365b322d245c'
|
||||
}, 'CimCmdlets', 'Microsoft.PowerShell.Management', 'Microsoft.PowerShell.Utility', 'Microsoft.PowerShell.Security')
|
||||
|
||||
+46
-6
@@ -2,13 +2,53 @@
|
||||
$Public = @( Get-ChildItem -Path $PSScriptRoot\Public\*.ps1 -ErrorAction SilentlyContinue -Recurse )
|
||||
$Private = @( Get-ChildItem -Path $PSScriptRoot\Private\*.ps1 -ErrorAction SilentlyContinue -Recurse )
|
||||
|
||||
#Dot source the files
|
||||
Foreach ($import in @($Public + $Private)) {
|
||||
Try {
|
||||
. $import.fullname
|
||||
} Catch {
|
||||
Write-Error -Message "Failed to import function $($import.fullname): $_"
|
||||
$AssemblyFolders = Get-ChildItem -Path $PSScriptRoot\Lib -Directory -ErrorAction SilentlyContinue
|
||||
if ($AssemblyFolders.BaseName -contains 'Standard') {
|
||||
$Assembly = @( Get-ChildItem -Path $PSScriptRoot\Lib\Standard\*.dll -ErrorAction SilentlyContinue )
|
||||
} else {
|
||||
if ($PSEdition -eq 'Core') {
|
||||
$Assembly = @( Get-ChildItem -Path $PSScriptRoot\Lib\Core\*.dll -ErrorAction SilentlyContinue )
|
||||
} else {
|
||||
$Assembly = @( Get-ChildItem -Path $PSScriptRoot\Lib\Default\*.dll -ErrorAction SilentlyContinue )
|
||||
}
|
||||
}
|
||||
$FoundErrors = @(
|
||||
Foreach ($Import in @($Assembly)) {
|
||||
try {
|
||||
Add-Type -Path $Import.Fullname -ErrorAction Stop
|
||||
} catch [System.Reflection.ReflectionTypeLoadException] {
|
||||
Write-Warning "Processing $($Import.Name) Exception: $($_.Exception.Message)"
|
||||
$LoaderExceptions = $($_.Exception.LoaderExceptions) | Sort-Object -Unique
|
||||
foreach ($E in $LoaderExceptions) {
|
||||
Write-Warning "Processing $($Import.Name) LoaderExceptions: $($E.Message)"
|
||||
}
|
||||
$true
|
||||
#Write-Error -Message "StackTrace: $($_.Exception.StackTrace)"
|
||||
} catch {
|
||||
Write-Warning "Processing $($Import.Name) Exception: $($_.Exception.Message)"
|
||||
$LoaderExceptions = $($_.Exception.LoaderExceptions) | Sort-Object -Unique
|
||||
foreach ($E in $LoaderExceptions) {
|
||||
Write-Warning "Processing $($Import.Name) LoaderExceptions: $($E.Message)"
|
||||
}
|
||||
$true
|
||||
#Write-Error -Message "StackTrace: $($_.Exception.StackTrace)"
|
||||
}
|
||||
}
|
||||
#Dot source the files
|
||||
Foreach ($Import in @($Private + $Public)) {
|
||||
Try {
|
||||
. $Import.Fullname
|
||||
} Catch {
|
||||
Write-Error -Message "Failed to import functions from $($import.Fullname): $_"
|
||||
$true
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
if ($FoundErrors.Count -gt 0) {
|
||||
$ModuleName = (Get-ChildItem $PSScriptRoot\*.psd1).BaseName
|
||||
Write-Warning "Importing module $ModuleName failed. Fix errors before continuing."
|
||||
break
|
||||
}
|
||||
|
||||
Export-ModuleMember -Function '*' -Alias '*'
|
||||
@@ -0,0 +1,101 @@
|
||||
function ConvertTo-XMLCertificates {
|
||||
[cmdletBinding()]
|
||||
param(
|
||||
[PSCustomObject] $GPO,
|
||||
[string[]] $Category,
|
||||
[switch] $SingleObject
|
||||
)
|
||||
$SkipNames = ('Name', 'LocalName', 'NamespaceURI', 'Prefix', 'NodeType', 'ParentNode', 'OwnerDocument', 'IsEmpty', 'Attributes', 'HasAttributes', 'SchemaInfo', 'InnerXml', 'InnerText', 'NextSibling', 'PreviousSibling', 'ChildNodes', 'FirstChild', 'LastChild', 'HasChildNodes', 'IsReadOnly', 'OuterXml', 'BaseURI', 'PreviousText')
|
||||
if ($SingleObject) {
|
||||
$CreateGPO = [ordered]@{
|
||||
DisplayName = $GPO.DisplayName
|
||||
DomainName = $GPO.DomainName
|
||||
GUID = $GPO.GUID
|
||||
GpoType = $GPO.GpoType
|
||||
Count = 0
|
||||
Settings = $null
|
||||
}
|
||||
[Array] $CreateGPO['Settings'] = foreach ($Setting in $GPO.DataSet) {
|
||||
$SettingName = $Setting.Name -split ":"
|
||||
$MySettings = [ordered] @{
|
||||
CreatedTime = $GPO.CreatedTime # : 06.06.2020 18:03:36
|
||||
ModifiedTime = $GPO.ModifiedTime # : 17.06.2020 16:08:10
|
||||
ReadTime = $GPO.ReadTime # : 13.08.2020 10:15:37
|
||||
SecurityDescriptor = $GPO.SecurityDescriptor # : SecurityDescriptor
|
||||
FilterDataAvailable = $GPO.FilterDataAvailable # : True
|
||||
}
|
||||
$Name = $SettingName[1]
|
||||
#$Name = Format-ToTitleCase -Text $Setting.Name -RemoveWhiteSpace -RemoveChar ',', '-', "'", '\(', '\)', ':'
|
||||
$MySettings['Name'] = $Name # $Setting.Name
|
||||
|
||||
ConvertTo-XMLNested -CreateGPO $MySettings -Setting $Setting -SkipNames $SkipNames #-Name $Name
|
||||
|
||||
if ($MySettings.Data) {
|
||||
$bytes = $MySettings.Data -replace '\r?\n' -split '(?<=\G.{2})' -ne '' -replace '^', '0x' -as [byte[]]
|
||||
$CertificateData = [System.Security.Cryptography.X509Certificates.X509Certificate2]::new($bytes)
|
||||
|
||||
$MySettings['NotBefore'] = $CertificateData.NotBefore
|
||||
$MySettings['NotAfter'] = $CertificateData.NotAfter
|
||||
$MySettings['HasPrivateKey'] = $CertificateData.HasPrivateKey
|
||||
$MySettings['Thumbprint'] = $CertificateData.Thumbprint
|
||||
$MySettings['SerialNumber'] = $CertificateData.SerialNumber
|
||||
$MySettings['Version'] = $CertificateData.Version
|
||||
$MySettings['Handle'] = $CertificateData.Handle
|
||||
$MySettings['SignatureAlgorithm'] = $CertificateData.SignatureAlgorithm.Value
|
||||
$MySettings['SignatureAlgorithmName'] = $CertificateData.SignatureAlgorithm.FriendlyName
|
||||
$MySettings['KeyUsages'] = $CertificateData.Extensions.KeyUsages
|
||||
$MySettings.Remove('Data')
|
||||
}
|
||||
|
||||
[PSCustomObject] $MySettings
|
||||
}
|
||||
|
||||
$CreateGPO['Count'] = $CreateGPO['Settings'].Count
|
||||
$CreateGPO['Linked'] = $GPO.Linked
|
||||
$CreateGPO['LinksCount'] = $GPO.LinksCount
|
||||
$CreateGPO['Links'] = $GPO.Links
|
||||
[PSCustomObject] $CreateGPO
|
||||
} else {
|
||||
foreach ($Setting in $GPO.DataSet) {
|
||||
$CreateGPO = [ordered]@{
|
||||
DisplayName = $GPO.DisplayName
|
||||
DomainName = $GPO.DomainName
|
||||
GUID = $GPO.GUID
|
||||
GpoType = $GPO.GpoType
|
||||
}
|
||||
$SettingName = $Setting.Name -split ":"
|
||||
$CreateGPO['CreatedTime'] = $GPO.CreatedTime # : 06.06.2020 18:03:36
|
||||
$CreateGPO['ModifiedTime'] = $GPO.ModifiedTime # : 17.06.2020 16:08:10
|
||||
$CreateGPO['ReadTime'] = $GPO.ReadTime # : 13.08.2020 10:15:37
|
||||
$CreateGPO['SecurityDescriptor'] = $GPO.SecurityDescriptor # : SecurityDescriptor
|
||||
$CreateGPO['FilterDataAvailable'] = $GPO.FilterDataAvailable # : True
|
||||
|
||||
$Name = $SettingName[1]
|
||||
$CreateGPO['Name'] = $Name # $Setting.Name
|
||||
|
||||
ConvertTo-XMLNested -CreateGPO $CreateGPO -Setting $Setting -SkipNames $SkipNames #-Name $Name
|
||||
|
||||
if ($CreateGPO.Data) {
|
||||
$bytes = $CreateGPO.Data -replace '\r?\n' -split '(?<=\G.{2})' -ne '' -replace '^', '0x' -as [byte[]]
|
||||
$CertificateData = [System.Security.Cryptography.X509Certificates.X509Certificate2]::new($bytes)
|
||||
|
||||
$CreateGPO['NotBefore'] = $CertificateData.NotBefore
|
||||
$CreateGPO['NotAfter'] = $CertificateData.NotAfter
|
||||
$CreateGPO['HasPrivateKey'] = $CertificateData.HasPrivateKey
|
||||
$CreateGPO['Thumbprint'] = $CertificateData.Thumbprint
|
||||
$CreateGPO['SerialNumber'] = $CertificateData.SerialNumber
|
||||
$CreateGPO['Version'] = $CertificateData.Version
|
||||
$CreateGPO['Handle'] = $CertificateData.Handle
|
||||
$CreateGPO['SignatureAlgorithm'] = $CertificateData.SignatureAlgorithm.Value
|
||||
$CreateGPO['SignatureAlgorithmName'] = $CertificateData.SignatureAlgorithm.FriendlyName
|
||||
$CreateGPO['KeyUsages'] = $CertificateData.Extensions.KeyUsages
|
||||
$CreateGPO.Remove('Data')
|
||||
}
|
||||
$CreateGPO['Filters'] = $Setting.Filters
|
||||
$CreateGPO['Linked'] = $GPO.Linked
|
||||
$CreateGPO['LinksCount'] = $GPO.LinksCount
|
||||
$CreateGPO['Links'] = $GPO.Links
|
||||
[PSCustomObject] $CreateGPO
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
function ConvertTo-XMLWindowsFirewall {
|
||||
[cmdletBinding()]
|
||||
param(
|
||||
[PSCustomObject] $GPO,
|
||||
[switch] $SingleObject
|
||||
)
|
||||
if ($SingleObject) {
|
||||
$CreateGPO = [ordered]@{
|
||||
DisplayName = $GPO.DisplayName
|
||||
DomainName = $GPO.DomainName
|
||||
GUID = $GPO.GUID
|
||||
GpoType = $GPO.GpoType
|
||||
#GpoCategory = $GPOEntry.GpoCategory
|
||||
#GpoSettings = $GPOEntry.GpoSettings
|
||||
Count = 0
|
||||
Settings = $null
|
||||
}
|
||||
[Array] $CreateGPO['Settings'] = foreach ($Policy in $GPO.DataSet) {
|
||||
[PSCustomObject] @{
|
||||
Name = $Policy.LocalName
|
||||
Version = $Policy.PolicyVersion.Value
|
||||
}
|
||||
}
|
||||
$CreateGPO['Count'] = $CreateGPO['Settings'].Count
|
||||
$CreateGPO['Linked'] = $GPO.Linked
|
||||
$CreateGPO['LinksCount'] = $GPO.LinksCount
|
||||
$CreateGPO['Links'] = $GPO.Links
|
||||
[PSCustomObject] $CreateGPO
|
||||
} else {
|
||||
foreach ($Policy in $GPO.DataSet) {
|
||||
[PSCustomObject]@{
|
||||
DisplayName = $GPO.DisplayName
|
||||
DomainName = $GPO.DomainName
|
||||
GUID = $GPO.GUID
|
||||
GpoType = $GPO.GpoType
|
||||
Name = $Policy.LocalName
|
||||
Version = $Policy.PolicyVersion.Value
|
||||
Linked = $GPO.Linked
|
||||
LinksCount = $GPO.LinksCount
|
||||
Links = $GPO.Links
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
function ConvertTo-XMLWindowsFirewallConnectionSecurityAuthentiation {
|
||||
[cmdletBinding()]
|
||||
param(
|
||||
[PSCustomObject] $GPO,
|
||||
[switch] $SingleObject
|
||||
)
|
||||
if ($SingleObject) {
|
||||
$CreateGPO = [ordered]@{
|
||||
DisplayName = $GPO.DisplayName
|
||||
DomainName = $GPO.DomainName
|
||||
GUID = $GPO.GUID
|
||||
GpoType = $GPO.GpoType
|
||||
#GpoCategory = $GPOEntry.GpoCategory
|
||||
#GpoSettings = $GPOEntry.GpoSettings
|
||||
Count = 0
|
||||
Settings = $null
|
||||
}
|
||||
[Array] $CreateGPO['Settings'] = foreach ($Connection in $GPO.DataSet) {
|
||||
[PSCustomObject] @{
|
||||
Name = $Connection.LocalName
|
||||
Version = $Connection.Version
|
||||
ConnectionGUID = $Connection.GUID
|
||||
Method = $Connection.AuthenticationSuites.Method #: MachineCert
|
||||
CAName = $Connection.AuthenticationSuites.CAName #: DC = xyz, DC = evotec, DC = ad, CN = ad-ADCS-CA
|
||||
CertAccountMapping = if ($Connection.AuthenticationSuites.CertAccountMapping -eq 'true') { $true } elseif ($Connection.AuthenticationSuites.CertAccountMapping -eq 'false') { $false } else { $Connection.AuthenticationSuites.CertAccountMapping }
|
||||
ExcludeCAName = if ($Connection.AuthenticationSuites.ExcludeCAName -eq 'true') { $true } elseif ($Connection.AuthenticationSuites.ExcludeCAName -eq 'false') { $false } else { $Connection.AuthenticationSuites.ExcludeCAName }
|
||||
HealthCert = if ($Connection.AuthenticationSuites.HealthCert -eq 'true') { $true } elseif ($Connection.AuthenticationSuites.HealthCert -eq 'false') { $false } else { $Connection.AuthenticationSuites.HealthCert }
|
||||
}
|
||||
}
|
||||
$CreateGPO['Count'] = $CreateGPO['Settings'].Count
|
||||
$CreateGPO['Linked'] = $GPO.Linked
|
||||
$CreateGPO['LinksCount'] = $GPO.LinksCount
|
||||
$CreateGPO['Links'] = $GPO.Links
|
||||
[PSCustomObject] $CreateGPO
|
||||
} else {
|
||||
foreach ($Connection in $GPO.DataSet) {
|
||||
[PSCustomObject]@{
|
||||
DisplayName = $GPO.DisplayName
|
||||
DomainName = $GPO.DomainName
|
||||
GUID = $GPO.GUID
|
||||
GpoType = $GPO.GpoType
|
||||
Name = $Connection.LocalName
|
||||
Version = $Connection.Version
|
||||
ConnectionGUID = $Connection.GUID
|
||||
Method = $Connection.AuthenticationSuites.Method #: MachineCert
|
||||
CAName = $Connection.AuthenticationSuites.CAName #: DC = xyz, DC = evotec, DC = ad, CN = ad-ADCS-CA
|
||||
CertAccountMapping = if ($Connection.AuthenticationSuites.CertAccountMapping -eq 'true') { $true } elseif ($Connection.AuthenticationSuites.CertAccountMapping -eq 'false') { $false } else { $Connection.AuthenticationSuites.CertAccountMapping }
|
||||
ExcludeCAName = if ($Connection.AuthenticationSuites.ExcludeCAName -eq 'true') { $true } elseif ($Connection.AuthenticationSuites.ExcludeCAName -eq 'false') { $false } else { $Connection.AuthenticationSuites.ExcludeCAName }
|
||||
HealthCert = if ($Connection.AuthenticationSuites.HealthCert -eq 'true') { $true } elseif ($Connection.AuthenticationSuites.HealthCert -eq 'false') { $false } else { $Connection.AuthenticationSuites.HealthCert }
|
||||
Linked = $GPO.Linked
|
||||
LinksCount = $GPO.LinksCount
|
||||
Links = $GPO.Links
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
function ConvertTo-XMLWindowsFirewallProfile {
|
||||
[cmdletBinding()]
|
||||
param(
|
||||
[PSCustomObject] $GPO,
|
||||
[switch] $SingleObject
|
||||
)
|
||||
if ($SingleObject) {
|
||||
$CreateGPO = [ordered]@{
|
||||
DisplayName = $GPO.DisplayName
|
||||
DomainName = $GPO.DomainName
|
||||
GUID = $GPO.GUID
|
||||
GpoType = $GPO.GpoType
|
||||
#GpoCategory = $GPOEntry.GpoCategory
|
||||
#GpoSettings = $GPOEntry.GpoSettings
|
||||
Count = 0
|
||||
Settings = $null
|
||||
}
|
||||
[Array] $CreateGPO['Settings'] = foreach ($Profile in $GPO.DataSet) {
|
||||
[PSCustomObject] @{
|
||||
Profile = $Profile.LocalName
|
||||
EnableFirewall = if ($Profile.EnableFirewall.Value -eq 'true') { 'Yes' } elseif ($Profile.EnableFirewall.Value -eq 'false') { 'No' } else { 'Not configured' }
|
||||
AllowLocalIPsecPolicyMerge = if ($Profile.AllowLocalIPsecPolicyMerge.Value -eq 'true') { 'Yes' } elseif ($Profile.EnableFirewall.Value -eq 'false') { 'No' } else { 'Not configured' }
|
||||
AllowLocalPolicyMerge = if ($Profile.AllowLocalPolicyMerge.Value -eq 'true') { 'Yes' } elseif ($Profile.EnableFirewall.Value -eq 'false') { 'No' } else { 'Not configured' }
|
||||
DefaultInboundAction = if ($Profile.DefaultInboundAction.Value -eq 'true') { 'Yes' } elseif ($Profile.EnableFirewall.Value -eq 'false') { 'No' } else { 'Not configured' }
|
||||
DefaultOutboundAction = if ($Profile.DefaultOutboundAction.Value -eq 'true') { 'Yes' } elseif ($Profile.EnableFirewall.Value -eq 'false') { 'No' } else { 'Not configured' }
|
||||
DisableNotifications = if ($Profile.DisableNotifications.Value -eq 'true') { 'Yes' } elseif ($Profile.EnableFirewall.Value -eq 'false') { 'No' } else { 'Not configured' }
|
||||
DisableUnicastResponsesToMulticastBroadcast = if ($Profile.DisableUnicastResponsesToMulticastBroadcast.Value -eq 'true') { 'Yes' } elseif ($Profile.EnableFirewall.Value -eq 'false') { 'No' } else { 'Not configured' }
|
||||
DoNotAllowExceptions = if ($Profile.DoNotAllowExceptions.Value -eq 'true') { 'Yes' } elseif ($Profile.EnableFirewall.Value -eq 'false') { 'No' } else { 'Not configured' }
|
||||
LogFilePath = if ($Profile.LogFilePath.Value) { $Profile.LogFilePath.Value } else { 'Not configured' }
|
||||
LogDroppedPackets = if ($Profile.LogDroppedPackets.Value -eq 'true') { 'Yes' } elseif ($Profile.EnableFirewall.Value -eq 'false') { 'No' } else { 'Not configured' }
|
||||
LogFileSize = if ($Profile.LogFileSize.Value) { $Profile.LogFileSize.Value } else { 'Not configured' }
|
||||
LogSuccessfulConnections = if ($Profile.LogSuccessfulConnections.Value -eq 'true') { 'Yes' } elseif ($Profile.EnableFirewall.Value -eq 'false') { 'No' } else { 'Not configured' }
|
||||
}
|
||||
}
|
||||
$CreateGPO['Count'] = $CreateGPO['Settings'].Count
|
||||
$CreateGPO['Linked'] = $GPO.Linked
|
||||
$CreateGPO['LinksCount'] = $GPO.LinksCount
|
||||
$CreateGPO['Links'] = $GPO.Links
|
||||
[PSCustomObject] $CreateGPO
|
||||
} else {
|
||||
foreach ($Profile in $GPO.DataSet) {
|
||||
[PSCustomObject]@{
|
||||
DisplayName = $GPO.DisplayName
|
||||
DomainName = $GPO.DomainName
|
||||
GUID = $GPO.GUID
|
||||
GpoType = $GPO.GpoType
|
||||
Profile = $Profile.LocalName
|
||||
EnableFirewall = if ($Profile.EnableFirewall.Value -eq 'true') { 'Yes' } elseif ($Profile.EnableFirewall.Value -eq 'false') { 'No' } else { 'Not configured' }
|
||||
AllowLocalIPsecPolicyMerge = if ($Profile.AllowLocalIPsecPolicyMerge.Value -eq 'true') { 'Yes' } elseif ($Profile.EnableFirewall.Value -eq 'false') { 'No' } else { 'Not configured' }
|
||||
AllowLocalPolicyMerge = if ($Profile.AllowLocalPolicyMerge.Value -eq 'true') { 'Yes' } elseif ($Profile.EnableFirewall.Value -eq 'false') { 'No' } else { 'Not configured' }
|
||||
DefaultInboundAction = if ($Profile.DefaultInboundAction.Value -eq 'true') { 'Yes' } elseif ($Profile.EnableFirewall.Value -eq 'false') { 'No' } else { 'Not configured' }
|
||||
DefaultOutboundAction = if ($Profile.DefaultOutboundAction.Value -eq 'true') { 'Yes' } elseif ($Profile.EnableFirewall.Value -eq 'false') { 'No' } else { 'Not configured' }
|
||||
DisableNotifications = if ($Profile.DisableNotifications.Value -eq 'true') { 'Yes' } elseif ($Profile.EnableFirewall.Value -eq 'false') { 'No' } else { 'Not configured' }
|
||||
DisableUnicastResponsesToMulticastBroadcast = if ($Profile.DisableUnicastResponsesToMulticastBroadcast.Value -eq 'true') { 'Yes' } elseif ($Profile.EnableFirewall.Value -eq 'false') { 'No' } else { 'Not configured' }
|
||||
DoNotAllowExceptions = if ($Profile.DoNotAllowExceptions.Value -eq 'true') { 'Yes' } elseif ($Profile.EnableFirewall.Value -eq 'false') { 'No' } else { 'Not configured' }
|
||||
LogFilePath = if ($Profile.LogFilePath.Value) { $Profile.LogFilePath.Value } else { 'Not configured' }
|
||||
LogDroppedPackets = if ($Profile.LogDroppedPackets.Value -eq 'true') { 'Yes' } elseif ($Profile.EnableFirewall.Value -eq 'false') { 'No' } else { 'Not configured' }
|
||||
LogFileSize = if ($Profile.LogFileSize.Value) { $Profile.LogFileSize.Value } else { 'Not configured' }
|
||||
LogSuccessfulConnections = if ($Profile.LogSuccessfulConnections.Value -eq 'true') { 'Yes' } elseif ($Profile.EnableFirewall.Value -eq 'false') { 'No' } else { 'Not configured' }
|
||||
Linked = $GPO.Linked
|
||||
LinksCount = $GPO.LinksCount
|
||||
Links = $GPO.Links
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,133 @@
|
||||
function ConvertTo-XMLWindowsFirewallRules {
|
||||
[cmdletBinding()]
|
||||
param(
|
||||
[PSCustomObject] $GPO,
|
||||
[switch] $SingleObject
|
||||
)
|
||||
if ($SingleObject) {
|
||||
$CreateGPO = [ordered]@{
|
||||
DisplayName = $GPO.DisplayName
|
||||
DomainName = $GPO.DomainName
|
||||
GUID = $GPO.GUID
|
||||
GpoType = $GPO.GpoType
|
||||
#GpoCategory = $GPOEntry.GpoCategory
|
||||
#GpoSettings = $GPOEntry.GpoSettings
|
||||
Count = 0
|
||||
Settings = $null
|
||||
}
|
||||
[Array] $CreateGPO['Settings'] = foreach ($Rule in $GPO.DataSet) {
|
||||
[PSCustomObject] @{
|
||||
Version = $Rule.Version
|
||||
Type = if ($Rule.Dir -eq 'In') { 'Inbound' } elseif ($Rule.Dir -eq 'Out') { 'Outbound' } else { $Rule.Dir }
|
||||
Name = $Rule.Name
|
||||
Action = $Rule.Action
|
||||
Enabled = if ($Rule.Active -eq 'true') { $true } else { $false }
|
||||
Profile = $Rule.Profile
|
||||
Svc = $Rule.Svc
|
||||
LocalAddressIPv4 = $Rule.LA4
|
||||
LocalAddressIPv6 = $Rule.LA6
|
||||
RemoteAddressIPV4 = $Rule.RA4
|
||||
RemoteAddressIPV6 = $Rule.RA6
|
||||
LocalPort = $Rule.LPort
|
||||
RemotePort = $Rule.RPort
|
||||
Description = $Rule.Desc
|
||||
EmbedCtxt = $Rule.EmbedCtxt
|
||||
Edge = $Rule.Edge
|
||||
IFType = $Rule.IFType
|
||||
Security = $Rule.Security
|
||||
App = $Rule.App
|
||||
Protocol = $Rule.Protocol
|
||||
RMAuth = $Rule.RMAuth
|
||||
RUAuth = $Rule.RUAuth
|
||||
ICMP4 = $Rule.ICMP4
|
||||
LocalName = $Rule.LocalName
|
||||
|
||||
}
|
||||
}
|
||||
$CreateGPO['Count'] = $CreateGPO['Settings'].Count
|
||||
$CreateGPO['Linked'] = $GPO.Linked
|
||||
$CreateGPO['LinksCount'] = $GPO.LinksCount
|
||||
$CreateGPO['Links'] = $GPO.Links
|
||||
[PSCustomObject] $CreateGPO
|
||||
} else {
|
||||
foreach ($Rule in $GPO.DataSet) {
|
||||
[PSCustomObject]@{
|
||||
DisplayName = $GPO.DisplayName
|
||||
DomainName = $GPO.DomainName
|
||||
GUID = $GPO.GUID
|
||||
GpoType = $GPO.GpoType
|
||||
Version = $Rule.Version
|
||||
Type = if ($Rule.Dir -eq 'In') { 'Inbound' } elseif ($Rule.Dir -eq 'Out') { 'Outbound' } else { $Rule.Dir }
|
||||
Name = $Rule.Name
|
||||
Action = $Rule.Action
|
||||
Enabled = if ($Rule.Active -eq 'true') { $true } else { $false }
|
||||
Profile = $Rule.Profile
|
||||
Svc = $Rule.Svc
|
||||
LocalAddressIPv4 = $Rule.LA4
|
||||
LocalAddressIPv6 = $Rule.LA6
|
||||
RemoteAddressIPV4 = $Rule.RA4
|
||||
RemoteAddressIPV6 = $Rule.RA6
|
||||
LocalPort = $Rule.LPort
|
||||
RemotePort = $Rule.RPort
|
||||
Description = $Rule.Desc
|
||||
EmbedCtxt = $Rule.EmbedCtxt
|
||||
Edge = $Rule.Edge
|
||||
IFType = $Rule.IFType
|
||||
Security = $Rule.Security
|
||||
App = $Rule.App
|
||||
Protocol = $Rule.Protocol
|
||||
RMAuth = $Rule.RMAuth
|
||||
RUAuth = $Rule.RUAuth
|
||||
ICMP4 = $Rule.ICMP4
|
||||
LocalName = $Rule.LocalName
|
||||
Linked = $GPO.Linked
|
||||
LinksCount = $GPO.LinksCount
|
||||
Links = $GPO.Links
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
<#
|
||||
Version : 2.30
|
||||
Action : Allow
|
||||
Name : @%SystemRoot%\system32\firewallapi.dll,-37303
|
||||
Dir : In
|
||||
App : %SystemRoot%\system32\svchost.exe
|
||||
Svc : dnscache
|
||||
Profile : Public
|
||||
RA4 : LocalSubnet
|
||||
RA6 : LocalSubnet
|
||||
LPort : 5353
|
||||
Protocol : 17
|
||||
Desc : @%SystemRoot%\system32\firewallapi.dll,-37304
|
||||
Active : true
|
||||
EmbedCtxt : @%SystemRoot%\system32\firewallapi.dll,-37302
|
||||
|
||||
|
||||
Version : 2.30
|
||||
Action : Allow
|
||||
Name : TEST APP
|
||||
Dir : In
|
||||
App : C:\Test\exe.exe
|
||||
Active : true
|
||||
|
||||
Version : 2.30
|
||||
Action : Block
|
||||
Name : Blo
|
||||
Dir : Out
|
||||
App : dfdff
|
||||
Active : true
|
||||
|
||||
Version : 2.30
|
||||
Action : Block
|
||||
Name : @FirewallAPI.dll,-36012
|
||||
Dir : Out
|
||||
App : %SystemRoot%\system32\svchost.exe
|
||||
Svc : Qwave
|
||||
Profile : {Private, Public}
|
||||
RPort : 2177
|
||||
Protocol : 17
|
||||
Desc : @FirewallAPI.dll,-36013
|
||||
Active : true
|
||||
EmbedCtxt : @FirewallAPI.dll,-36001
|
||||
#>
|
||||
@@ -0,0 +1,76 @@
|
||||
function ConvertTo-XMLWindowsFirewallSecurityRules {
|
||||
[cmdletBinding()]
|
||||
param(
|
||||
[PSCustomObject] $GPO,
|
||||
[switch] $SingleObject
|
||||
)
|
||||
if ($SingleObject) {
|
||||
$CreateGPO = [ordered]@{
|
||||
DisplayName = $GPO.DisplayName
|
||||
DomainName = $GPO.DomainName
|
||||
GUID = $GPO.GUID
|
||||
GpoType = $GPO.GpoType
|
||||
#GpoCategory = $GPOEntry.GpoCategory
|
||||
#GpoSettings = $GPOEntry.GpoSettings
|
||||
Count = 0
|
||||
Settings = $null
|
||||
}
|
||||
[Array] $CreateGPO['Settings'] = foreach ($Rule in $GPO.DataSet) {
|
||||
[PSCustomObject] @{
|
||||
Version = $Rule.Version
|
||||
Name = $Rule.Name
|
||||
Action = $Rule.Action
|
||||
Enabled = if ($Rule.Active -eq 'true') { $true } else { $false }
|
||||
Auth1Set = $Rule.Auth1Set
|
||||
Auth2Set = $Rule.Auth2Set
|
||||
Crypto2Set = $Rule.Crypto2Set
|
||||
Description = $Rule.Desc
|
||||
}
|
||||
}
|
||||
$CreateGPO['Count'] = $CreateGPO['Settings'].Count
|
||||
$CreateGPO['Linked'] = $GPO.Linked
|
||||
$CreateGPO['LinksCount'] = $GPO.LinksCount
|
||||
$CreateGPO['Links'] = $GPO.Links
|
||||
[PSCustomObject] $CreateGPO
|
||||
} else {
|
||||
foreach ($Rule in $GPO.DataSet) {
|
||||
[PSCustomObject]@{
|
||||
DisplayName = $GPO.DisplayName
|
||||
DomainName = $GPO.DomainName
|
||||
GUID = $GPO.GUID
|
||||
GpoType = $GPO.GpoType
|
||||
Version = $Rule.Version
|
||||
Name = $Rule.Name
|
||||
Action = $Rule.Action
|
||||
Enabled = if ($Rule.Active -eq 'true') { $true } else { $false }
|
||||
Auth1Set = $Rule.Auth1Set
|
||||
Auth2Set = $Rule.Auth2Set
|
||||
Crypto2Set = $Rule.Crypto2Set
|
||||
Description = $Rule.Desc
|
||||
Linked = $GPO.Linked
|
||||
LinksCount = $GPO.LinksCount
|
||||
Links = $GPO.Links
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
<#
|
||||
Version : 2.30
|
||||
Action : Boundary
|
||||
Name : TeST Aut
|
||||
Auth1Set : {E5A5D32A-4BCE-4e4d-B07F-4AB1BA7E5FE3}
|
||||
Auth2Set : {E5A5D32A-4BCE-4e4d-B07F-4AB1BA7E5FE4}
|
||||
Crypto2Set : {E5A5D32A-4BCE-4e4d-B07F-4AB1BA7E5FE2}
|
||||
Desc :
|
||||
Active : true
|
||||
|
||||
Version : 2.30
|
||||
Action : Boundary
|
||||
Name : CA TEST
|
||||
Auth1Set : {0E3A2DDC-F31B-42B5-BEAC-890752F9C0BB}
|
||||
Auth2Set : EmptySet
|
||||
Crypto2Set : {E5A5D32A-4BCE-4e4d-B07F-4AB1BA7E5FE2}
|
||||
Desc :
|
||||
Active : true
|
||||
#>
|
||||
@@ -290,6 +290,7 @@
|
||||
'Problem' = $Problem
|
||||
'ApplyPermission' = $null
|
||||
'Exclude' = $Exclude
|
||||
'Description' = $GPO.Description
|
||||
'ComputerPolicies' = $XMLContent.GPO.Computer.ExtensionData.Name -join ", "
|
||||
'UserPolicies' = $XMLContent.GPO.User.ExtensionData.Name -join ", "
|
||||
'LinksCount' = $LinksTotalCount
|
||||
@@ -315,7 +316,6 @@
|
||||
'UserSettingsVersionIdentical' = if ($XMLContent.GPO.User.VersionDirectory -eq $XMLContent.GPO.User.VersionSysvol) { $true } else { $false }
|
||||
'UserSettings' = $XMLContent.GPO.User.ExtensionData.Extension
|
||||
'NoSettings' = $NoSettings
|
||||
'Description' = $GPO.Description
|
||||
'CreationTime' = [DateTime] $XMLContent.GPO.CreatedTime
|
||||
'ModificationTime' = [DateTime] $XMLContent.GPO.ModifiedTime
|
||||
'ReadTime' = [DateTime] $XMLContent.GPO.ReadTime
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
New-HTMLTable -DataTable $Script:Reporting['GPOAnalysis']['WarningsAndErrors'] -Filtering {
|
||||
New-HTMLTableCondition -Name 'Type' -Value 'Warning' -BackgroundColor SandyBrown -ComparisonType string -Row
|
||||
New-HTMLTableCondition -Name 'Type' -Value 'Error' -BackgroundColor Salmon -ComparisonType string -Row
|
||||
}
|
||||
} -SearchBuilder
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,25 +4,208 @@
|
||||
ActionRequired = $null
|
||||
Data = $null
|
||||
Execute = {
|
||||
Get-GPOZaurrInheritance -IncludeBlockedObjects -OnlyBlockedInheritance -Forest $Forest -IncludeDomains $IncludeDomains -ExcludeDomains $ExcludeDomains
|
||||
if ($Script:Reporting['GPOBlockedInheritance']['Exclusions']) {
|
||||
Get-GPOZaurrInheritance -IncludeBlockedObjects -IncludeExcludedObjects -OnlyBlockedInheritance -IncludeGroupPoliciesForBlockedObjects -Forest $Forest -IncludeDomains $IncludeDomains -ExcludeDomains $Excludeomains -Exclusions $Script:Reporting['GPOBlockedInheritance']['Exclusions']
|
||||
} else {
|
||||
Get-GPOZaurrInheritance -IncludeBlockedObjects -IncludeExcludedObjects -OnlyBlockedInheritance -IncludeGroupPoliciesForBlockedObjects -Forest $Forest -IncludeDomains $IncludeDomains -ExcludeDomains $Excludeomains
|
||||
}
|
||||
}
|
||||
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. "
|
||||
"Unfortunetly 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."
|
||||
}
|
||||
Solution = {
|
||||
New-HTMLTable -DataTable $Script:Reporting['GPOBlockedInheritance']['Data'] -Filtering
|
||||
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 -SearchBuilder -ExcludeProperty GroupPolicies
|
||||
}
|
||||
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 -SearchBuilder -DataTableID 'TableWithGroupPoliciesBlockedInheritance'
|
||||
}
|
||||
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."
|
||||
}
|
||||
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
|
||||
}
|
||||
} -SearchBuilder
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -76,7 +76,7 @@ $GPOZaurrBrokenLink = [ordered] @{
|
||||
New-HTMLSection -Name 'Group Policy Broken Links' {
|
||||
New-HTMLTable -DataTable $Script:Reporting['GPOBrokenLink']['Data'] -Filtering {
|
||||
|
||||
} -PagingOptions 10, 20, 30, 40, 50
|
||||
} -PagingOptions 10, 20, 30, 40, 50 -SearchBuilder
|
||||
}
|
||||
if ($Script:Reporting['Settings']['HideSteps'] -eq $false) {
|
||||
New-HTMLSection -Name 'Steps to remove Broken Links' {
|
||||
|
||||
@@ -91,7 +91,7 @@
|
||||
New-HTMLTableCondition -Name 'ACLConsistentInside' -Value $true -BackgroundColor PaleGreen -TextTransform capitalize -ComparisonType string
|
||||
New-HTMLTableCondition -Name 'ACLConsistent' -Value 'Not available' -BackgroundColor Crimson -ComparisonType string
|
||||
New-HTMLTableCondition -Name 'ACLConsistentInside' -Value 'Not available' -BackgroundColor Crimson -ComparisonType string
|
||||
} -PagingOptions 10, 20, 30, 40, 50
|
||||
} -PagingOptions 10, 20, 30, 40, 50 -SearchBuilder
|
||||
}
|
||||
if ($Script:Reporting['Settings']['HideSteps'] -eq $false) {
|
||||
New-HTMLSection -Name 'Steps to fix - Permissions Consistency' {
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
New-HTMLSection -Name 'Group Policy CNF (Duplicate) Objects' {
|
||||
New-HTMLTable -DataTable $Script:Reporting['GPODuplicates']['Data'] -Filtering {
|
||||
|
||||
} -PagingOptions 10, 20, 30, 40, 50
|
||||
} -PagingOptions 10, 20, 30, 40, 50 -SearchBuilder
|
||||
}
|
||||
if ($Script:Reporting['Settings']['HideSteps'] -eq $false) {
|
||||
New-HTMLSection -Name 'Steps to fix - Remove duplicate (CNF) objects' {
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
New-HTMLTable -DataTable $Script:Reporting['GPOFiles']['WarningsAndErrors'] -Filtering {
|
||||
New-HTMLTableCondition -Name 'Type' -Value 'Warning' -BackgroundColor SandyBrown -ComparisonType string -Row
|
||||
New-HTMLTableCondition -Name 'Type' -Value 'Error' -BackgroundColor Salmon -ComparisonType string -Row
|
||||
}
|
||||
} -SearchBuilder
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ $GPOZaurrLinks = [ordered] @{
|
||||
New-HTMLTable -DataTable $Script:Reporting['GPOLinks']['WarningsAndErrors'] -Filtering {
|
||||
New-HTMLTableCondition -Name 'Type' -Value 'Warning' -BackgroundColor SandyBrown -ComparisonType string -Row
|
||||
New-HTMLTableCondition -Name 'Type' -Value 'Error' -BackgroundColor Salmon -ComparisonType string -Row
|
||||
}
|
||||
} -SearchBuilder
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -358,7 +358,7 @@
|
||||
New-HTMLTableCondition -Name 'UserProblem' -Value $false -BackgroundColor SpringGreen -ComparisonType string
|
||||
New-HTMLTableCondition -Name 'ComputerOptimized' -Value $true -BackgroundColor SpringGreen -ComparisonType string
|
||||
New-HTMLTableCondition -Name 'UserOptimized' -Value $true -BackgroundColor SpringGreen -TextTransform capitalize -ComparisonType string
|
||||
} -PagingOptions 10, 20, 30, 40, 50
|
||||
} -PagingOptions 10, 20, 30, 40, 50 -SearchBuilder
|
||||
}
|
||||
}
|
||||
if ($Script:Reporting['Settings']['HideSteps'] -eq $false) {
|
||||
|
||||
@@ -135,7 +135,7 @@
|
||||
New-HTMLTableCondition -Name 'OwnerType' -Value "WellKnownAdministrative" -BackgroundColor LightGreen -ComparisonType string -Operator eq
|
||||
New-HTMLTableCondition -Name 'Status' -Value "OK" -BackgroundColor LightGreen -ComparisonType string -Operator eq
|
||||
New-HTMLTableCondition -Name 'Status' -Value "OK" -BackgroundColor Salmon -ComparisonType string -Operator ne
|
||||
}
|
||||
} -SearchBuilder
|
||||
}
|
||||
if ($Script:Reporting['Settings']['HideSteps'] -eq $false) {
|
||||
New-HTMLSection -Name 'Steps to fix NetLogon Owners ' {
|
||||
|
||||
@@ -237,7 +237,7 @@
|
||||
New-HTMLTableCondition -Name 'Status' -Value "Review permission required" -BackgroundColor PaleGoldenrod -ComparisonType string -Operator eq
|
||||
New-HTMLTableCondition -Name 'Status' -Value "Removal permission required" -BackgroundColor Salmon -ComparisonType string -Operator eq -Row
|
||||
New-HTMLTableCondition -Name 'Status' -Value "OK" -BackgroundColor LightGreen -ComparisonType string -Operator eq
|
||||
}
|
||||
} -SearchBuilder
|
||||
}
|
||||
if ($Script:Reporting['Settings']['HideSteps'] -eq $false) {
|
||||
New-HTMLSection -Name 'Steps to fix NetLogon Permissions ' {
|
||||
|
||||
@@ -0,0 +1,208 @@
|
||||
$GPOZaurrOrganizationalUnit = [ordered] @{
|
||||
Name = 'Group Policy Organizational Units'
|
||||
Enabled = $true
|
||||
ActionRequired = $null
|
||||
Data = $null
|
||||
Execute = {
|
||||
Get-GPOZaurrOrganizationalUnit -Forest $Forest -IncludeDomains $IncludeDomains -ExcludeDomains $ExcludeDomains
|
||||
}
|
||||
Processing = {
|
||||
# Create Per Domain Variables
|
||||
$Script:Reporting['GPOOrganizationalUnit']['Variables']['RequiresDiffFixPerDomain'] = @{}
|
||||
$Script:Reporting['GPOOrganizationalUnit']['Variables']['WillFixPerDomain'] = @{}
|
||||
foreach ($OU in $Script:Reporting['GPOOrganizationalUnit']['Data']) {
|
||||
$Script:Reporting['GPOOrganizationalUnit']['Variables']['TotalOU']++
|
||||
# Create Per Domain Variables
|
||||
if (-not $Script:Reporting['GPOOrganizationalUnit']['Variables']['WillFixPerDomain'][$OU.DomainName]) {
|
||||
$Script:Reporting['GPOOrganizationalUnit']['Variables']['WillFixPerDomain'][$OU.DomainName] = 0
|
||||
}
|
||||
|
||||
if ($OU.Status -contains 'Unlink GPO' -and $OU.Status -contains 'Delete OU') {
|
||||
$Script:Reporting['GPOOrganizationalUnit']['Variables']['UnlinkGPODeleteOU']++
|
||||
$Script:Reporting['GPOOrganizationalUnit']['Variables']['WillFix']++
|
||||
$Script:Reporting['GPOOrganizationalUnit']['Variables']['WillFixPerDomain'][$OU.DomainName]++
|
||||
} elseif ($OU.Status -contains 'Unlink GPO') {
|
||||
$Script:Reporting['GPOOrganizationalUnit']['Variables']['UnlinkGPO']++
|
||||
$Script:Reporting['GPOOrganizationalUnit']['Variables']['WillFix']++
|
||||
$Script:Reporting['GPOOrganizationalUnit']['Variables']['WillFixPerDomain'][$OU.DomainName]++
|
||||
} elseif ($OU.Status -contains 'Delete OU') {
|
||||
$Script:Reporting['GPOOrganizationalUnit']['Variables']['DeleteOU']++
|
||||
$Script:Reporting['GPOOrganizationalUnit']['Variables']['WillFix']++
|
||||
$Script:Reporting['GPOOrganizationalUnit']['Variables']['WillFixPerDomain'][$OU.DomainName]++
|
||||
} else {
|
||||
$Script:Reporting['GPOOrganizationalUnit']['Variables']['Legitimate']++
|
||||
|
||||
}
|
||||
}
|
||||
if ($Script:Reporting['GPOOrganizationalUnit']['Variables']['WillFix'] -gt 0) {
|
||||
$Script:Reporting['GPOOrganizationalUnit']['ActionRequired'] = $true
|
||||
} else {
|
||||
$Script:Reporting['GPOOrganizationalUnit']['ActionRequired'] = $false
|
||||
}
|
||||
}
|
||||
Variables = @{
|
||||
TotalOU = 0
|
||||
UnlinkGPO = 0
|
||||
UnlinkGPODeleteOU = 0
|
||||
DeleteOU = 0
|
||||
Legitimate = 0
|
||||
WillFix = 0
|
||||
WillFixPerDomain = $null
|
||||
}
|
||||
Overview = {
|
||||
|
||||
}
|
||||
Summary = {
|
||||
New-HTMLText -FontSize 10pt -Text @(
|
||||
"In most Active Directories there are a lot of Organizational Units that have different use cases to store different type of objects. "
|
||||
"As Active Directories change over time you can often find Organizational Units with linked GPOs and no objects inside. "
|
||||
"In some cases thats's expected, but in some cases it's totally unnessecary, and for very large AD can be a problem. "
|
||||
"Additionally only User and Computer objects can have GPO applied to them, so having GPO applied to a any other object type won't really work. "
|
||||
)
|
||||
New-HTMLText -FontSize 10pt -Text "Following can happen: " -FontWeight bold
|
||||
New-HTMLList -Type Unordered {
|
||||
New-HTMLListItem -Text 'Organizational Units that can have Group Policies unlinked (objects exists): ', $Script:Reporting['GPOOrganizationalUnit']['Variables']['UnlinkGPO'] -FontWeight normal, bold
|
||||
New-HTMLListItem -Text 'Organizational Units that can have Group Policies unlinked and OU removed (be careful!) (no objects): ', $Script:Reporting['GPOOrganizationalUnit']['Variables']['UnlinkGPODeleteOU'] -FontWeight normal, bold
|
||||
New-HTMLListItem -Text "Organizational Units that can be deleted (no objects/no gpos): ", $Script:Reporting['GPOOrganizationalUnit']['Variables']['DeleteOU'] -FontWeight normal, bold
|
||||
} -FontSize 10pt
|
||||
New-HTMLText -Text 'Following domains require actions (permissions required):' -FontSize 10pt -FontWeight bold
|
||||
New-HTMLList -Type Unordered {
|
||||
foreach ($Domain in $Script:Reporting['GPOOrganizationalUnit']['Variables']['WillFixPerDomain'].Keys) {
|
||||
New-HTMLListItem -Text "$Domain requires ", $Script:Reporting['GPOOrganizationalUnit']['Variables']['WillFixPerDomain'][$Domain], " changes." -FontWeight normal, bold, normal
|
||||
}
|
||||
} -FontSize 10pt
|
||||
New-HTMLText -Text @(
|
||||
"Please make sure that you really want to unlink GPO or delete Organizational Unit before executing changes. Sometimes it's completly valid to keep one or the other. "
|
||||
"Unlinking GPO from OU that has no Computer or User objects is fairly safe exercise. Removing OU requires a bit more dive in, and should only be executed if you know what you're doing. "
|
||||
) -FontWeight normal, bold -Color None, Red -FontSize 10pt
|
||||
}
|
||||
Solution = {
|
||||
New-HTMLSection -Invisible {
|
||||
New-HTMLPanel {
|
||||
& $Script:GPOConfiguration['GPOOrganizationalUnit']['Summary']
|
||||
}
|
||||
New-HTMLPanel {
|
||||
New-HTMLChart {
|
||||
New-ChartBarOptions -Type bar -Distributed
|
||||
New-ChartAxisY -LabelMaxWidth 200 -LabelAlign left -Show
|
||||
New-ChartBar -Name "Unlink GPO ($($Script:Reporting['GPOOrganizationalUnit']['Variables']['UnlinkGPO']))" -Value $Script:Reporting['GPOOrganizationalUnit']['Variables']['UnlinkGPO']
|
||||
New-ChartBar -Name "Unlink GPO & Delete OU ($($Script:Reporting['GPOOrganizationalUnit']['Variables']['UnlinkGPODeleteOU']))" -Value $Script:Reporting['GPOOrganizationalUnit']['Variables']['UnlinkGPODeleteOU']
|
||||
New-ChartBar -Name "Delete OU ($($Script:Reporting['GPOOrganizationalUnit']['Variables']['DeleteOU']))" -Value $Script:Reporting['GPOOrganizationalUnit']['Variables']['DeleteOU']
|
||||
} -Title 'Organizational Units' -TitleAlignment center
|
||||
}
|
||||
}
|
||||
New-HTMLSection -Name 'Group Policy Organizational Units' {
|
||||
New-HTMLTable -DataTable $Script:Reporting['GPOOrganizationalUnit']['Data'] -Filtering {
|
||||
New-TableHeader -ResponsiveOperations none -Names 'GPONames', 'Objects'
|
||||
New-HTMLTableCondition -Name 'Status' -ComparisonType string -Value 'Unlink GPO, Delete OU' -BackgroundColor Salmon -Row
|
||||
New-HTMLTableCondition -Name 'Status' -ComparisonType string -Value 'Unlink GPO' -BackgroundColor YellowOrange -Row
|
||||
New-HTMLTableCondition -Name 'Status' -ComparisonType string -Value 'Delete OU' -BackgroundColor Red -Row
|
||||
New-HTMLTableCondition -Name 'Status' -ComparisonType string -Value 'OK' -BackgroundColor LightGreen -Row
|
||||
} -PagingOptions 10, 20, 30, 40, 50 -SearchBuilder -ExcludeProperty GPO
|
||||
}
|
||||
if ($Script:Reporting['Settings']['HideSteps'] -eq $false) {
|
||||
New-HTMLSection -Name 'Steps to fix Group Organizational Units' {
|
||||
New-HTMLContainer {
|
||||
New-HTMLSpanStyle -FontSize 10pt {
|
||||
#New-HTMLText -Text 'Following steps will guide you how to fix group policy owners'
|
||||
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."
|
||||
}
|
||||
New-HTMLWizardStep -Name 'Prepare report' {
|
||||
New-HTMLText -Text "Depending when this report was run you may want to prepare new report before proceeding with unlinking unused Group Policies. To generate new report please use:"
|
||||
New-HTMLCodeBlock -Code {
|
||||
Invoke-GPOZaurr -FilePath $Env:UserProfile\Desktop\GPOZaurrGPOOrganizationalUnitBefore.html -Verbose -Type GPOOrganizationalUnit
|
||||
}
|
||||
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 {
|
||||
$OwnersGPO = Get-GPOZaurrOrganizationalUnit -Verbose
|
||||
$OwnersGPO | Format-Table
|
||||
}
|
||||
New-HTMLText -Text "It provides same data as you see in table above just doesn't prettify it for you."
|
||||
}
|
||||
New-HTMLWizardStep -Name 'Unlink unused Group Policies' {
|
||||
New-HTMLText -Text @(
|
||||
"Following command when executed runs cleanup procedure that unlinks all Group Policies from Organizational Units that have no user or computer objects. "
|
||||
"Make sure when running it for the first time to run it with ",
|
||||
"WhatIf",
|
||||
" parameter as shown below to prevent accidental unlinking."
|
||||
'When run it will remove any GPO links from Organizational Units that have no objects applicable for GPOs.'
|
||||
) -FontWeight normal, normal, bold, normal -Color Black, Black, Red, Black
|
||||
New-HTMLCodeBlock -Code {
|
||||
Remove-GPOZaurrLinkEmptyOU -WhatIf -Verbose
|
||||
}
|
||||
New-HTMLText -TextBlock {
|
||||
"Alternatively for multi-domain scenario, if you have limited Domain Admin credentials to a single domain please use following command: "
|
||||
}
|
||||
New-HTMLCodeBlock -Code {
|
||||
Remove-GPOZaurrLinkEmptyOU -WhatIf -Verbose -IncludeDomains 'YourDomainYouHavePermissionsFor'
|
||||
}
|
||||
New-HTMLText -TextBlock {
|
||||
"After execution please make sure there are no errors, make sure to review provided output, and confirm that what is about to be removed matches expected data. "
|
||||
"Keep in mind that there is no backup for this, and if link is removed you would need to relink it yourself."
|
||||
"Once you remove it, it's gone. "
|
||||
} -LineBreak
|
||||
New-HTMLText -Text 'Once happy with results please follow with command (this will start removal process): ' -LineBreak -FontWeight bold
|
||||
New-HTMLCodeBlock -Code {
|
||||
Remove-GPOZaurrLinkEmptyOU -WhatIf -LimitProcessing 2 -Verbose
|
||||
}
|
||||
New-HTMLText -TextBlock {
|
||||
"Alternatively for multi-domain scenario, if you have limited Domain Admin credentials to a single domain please use following command: "
|
||||
}
|
||||
New-HTMLCodeBlock -Code {
|
||||
Remove-GPOZaurrLinkEmptyOU -WhatIf -LimitProcessing 2 -Verbose -IncludeDomains 'YourDomainYouHavePermissionsFor'
|
||||
}
|
||||
New-HTMLText -TextBlock {
|
||||
"This command when executed deletes only first X broken GPOs. Use LimitProcessing parameter to prevent mass delete and increase the counter when no errors occur. "
|
||||
"Repeat step above as much as needed increasing LimitProcessing count till there's nothing left. In case of any issues please review and action accordingly. "
|
||||
} -LineBreak
|
||||
New-HTMLText -TextBlock {
|
||||
"It's possible to exclude certain OU's from having GPO's unlinked using follwing method: "
|
||||
} -FontWeight bold
|
||||
New-HTMLCodeBlock -Code {
|
||||
$Exclude = @(
|
||||
"OU=Groups,OU=Production,DC=ad,DC=evotec,DC=pl"
|
||||
"OU=Test \, OU,OU=ITR02,DC=ad,DC=evotec,DC=xyz"
|
||||
)
|
||||
Remove-GPOZaurrLinkEmptyOU -Verbose -LimitProcessing 3 -WhatIf -ExcludeOrganizationalUnit $Exclude
|
||||
}
|
||||
}
|
||||
New-HTMLWizardStep -Name 'Delete unused Organizational Units' {
|
||||
New-HTMLText -Text @(
|
||||
"Following automation is not yet implemented. Requires more testing as potentially it could do more damage than help."
|
||||
)
|
||||
}
|
||||
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\GPOZaurrGPOOrganizationalUnitAfter.html -Verbose -Type GPOOrganizationalUnit
|
||||
}
|
||||
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['GPOOrganizationalUnit']['WarningsAndErrors']) {
|
||||
New-HTMLSection -Name 'Warnings & Errors to Review' {
|
||||
New-HTMLTable -DataTable $Script:Reporting['GPOOrganizationalUnit']['WarningsAndErrors'] -Filtering {
|
||||
New-HTMLTableCondition -Name 'Type' -Value 'Warning' -BackgroundColor SandyBrown -ComparisonType string -Row
|
||||
New-HTMLTableCondition -Name 'Type' -Value 'Error' -BackgroundColor Salmon -ComparisonType string -Row
|
||||
} -PagingOptions 10, 20, 30, 40, 50
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -99,7 +99,7 @@
|
||||
New-HTMLListItem -Text 'Group Policies on SYSVOL, but no details in AD: ', $Script:Reporting['GPOBroken']['Variables']['NotAvailableInAD'] -FontWeight normal, bold
|
||||
New-HTMLListItem -Text 'Group Policies in AD, but no content on SYSVOL: ', $Script:Reporting['GPOBroken']['Variables']['NotAvailableOnSysvol'] -FontWeight normal, bold
|
||||
New-HTMLListItem -Text 'Group Policies which exists, but have wrong ObjectClass: ', $Script:Reporting['GPOBroken']['Variables']['NotAvailableObjectClassIssue'] -FontWeight normal, bold
|
||||
New-HTMLListItem -Text "Group Policies which couldn't be assed due to permissions issue: ", $Script:Reporting['GPOBroken']['Variables']['NotAvailablePermissionIssue'] -FontWeight normal, bold
|
||||
New-HTMLListItem -Text "Group Policies which couldn't be assessed due to permissions issue: ", $Script:Reporting['GPOBroken']['Variables']['NotAvailablePermissionIssue'] -FontWeight normal, bold
|
||||
} -FontSize 10pt
|
||||
New-HTMLText -Text 'Following domains require actions (permissions required):' -FontSize 10pt -FontWeight bold
|
||||
New-HTMLList -Type Unordered {
|
||||
@@ -128,7 +128,7 @@
|
||||
New-HTMLTableCondition -Name 'Status' -Value "Not available on SYSVOL" -BackgroundColor LightCoral -ComparisonType string
|
||||
New-HTMLTableCondition -Name 'Status' -Value "ObjectClass issue" -BackgroundColor MediumOrchid -ComparisonType string
|
||||
New-HTMLTableCondition -Name 'Status' -Value "Permissions issue" -BackgroundColor MediumVioletRed -ComparisonType string -Color White
|
||||
} -PagingOptions 10, 20, 30, 40, 50
|
||||
} -PagingOptions 10, 20, 30, 40, 50 -SearchBuilder
|
||||
}
|
||||
if ($Script:Reporting['Settings']['HideSteps'] -eq $false) {
|
||||
New-HTMLSection -Name 'Steps to fix - Not available on SYSVOL / Active Directory / ObjectClass issue' {
|
||||
|
||||
@@ -134,7 +134,7 @@
|
||||
New-HTMLTable -DataTable $Script:Reporting['GPOOwners']['Data'] -Filtering {
|
||||
New-HTMLTableCondition -Name 'IsOwnerConsistent' -Value $false -BackgroundColor Salmon -ComparisonType string -Row
|
||||
New-HTMLTableCondition -Name 'IsOwnerAdministrative' -Value $false -BackgroundColor Salmon -ComparisonType string -Row
|
||||
} -PagingOptions 10, 20, 30, 40, 50
|
||||
} -PagingOptions 10, 20, 30, 40, 50 -SearchBuilder
|
||||
}
|
||||
if ($Script:Reporting['Settings']['HideSteps'] -eq $false) {
|
||||
New-HTMLSection -Name 'Steps to fix Group Policy Owners' {
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
New-HTMLTable -DataTable $Script:Reporting['GPOPassword']['WarningsAndErrors'] -Filtering {
|
||||
New-HTMLTableCondition -Name 'Type' -Value 'Warning' -BackgroundColor SandyBrown -ComparisonType string -Row
|
||||
New-HTMLTableCondition -Name 'Type' -Value 'Error' -BackgroundColor Salmon -ComparisonType string -Row
|
||||
}
|
||||
} -SearchBuilder
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -94,12 +94,12 @@
|
||||
New-HTMLSection -Name 'Group Policy Administrative Users Permissions Summary' {
|
||||
New-HTMLTable -DataTable $Script:Reporting['GPOPermissionsAdministrative']['Data'].PermissionsPerRow -Filtering {
|
||||
New-HTMLTableCondition -Name 'Permission' -Value '' -BackgroundColor Salmon -ComparisonType string -Row
|
||||
} -PagingOptions 7, 15, 30, 45, 60
|
||||
} -PagingOptions 7, 15, 30, 45, 60 -SearchBuilder
|
||||
}
|
||||
New-HTMLSection -Name 'Group Policy Administrative Users Analysis' {
|
||||
New-HTMLTable -DataTable $Script:Reporting['GPOPermissionsAdministrative']['Data'].PermissionsAnalysis -Filtering {
|
||||
# New-HTMLTableCondition -Name 'Permission' -Value '' -BackgroundColor Salmon -ComparisonType string -Row
|
||||
} -PagingOptions 7, 15, 30, 45, 60
|
||||
} -PagingOptions 7, 15, 30, 45, 60 -SearchBuilder
|
||||
}
|
||||
if ($Script:Reporting['Settings']['HideSteps'] -eq $false) {
|
||||
New-HTMLSection -Name 'Steps to fix Group Policy Administrative Users' {
|
||||
|
||||
@@ -309,7 +309,7 @@
|
||||
New-HTMLSection -Name 'Group Policy Visibility Analysis' {
|
||||
New-HTMLTable -DataTable $Script:Reporting['GPOPermissions']['Data'].PermissionsIssues -Filtering {
|
||||
New-HTMLTableCondition -Name 'PermissionIssue' -Value $true -BackgroundColor Salmon -ComparisonType string -Row
|
||||
} -PagingOptions 7, 15, 30, 45, 60 -DefaultSortColumn PermissionIssue -DefaultSortOrder Descending
|
||||
} -PagingOptions 7, 15, 30, 45, 60 -DefaultSortColumn PermissionIssue -DefaultSortOrder Descending -SearchBuilder
|
||||
}
|
||||
New-HTMLSection -Name 'Group Policy Permissions Analysis' {
|
||||
New-HTMLContainer {
|
||||
@@ -344,7 +344,7 @@
|
||||
New-HTMLTableCondition -Name 'EnterpriseAdmins' -Value 'True' -BackgroundColor Salmon -ComparisonType string -Operator ne
|
||||
|
||||
New-TableEvent -TableID 'GPOPermissionsAll' -SourceColumnName 'GUID' -TargetColumnID 1 # TargetColumnID 1 eq GUID on the other table
|
||||
} -PagingOptions 7, 15, 30, 45, 60
|
||||
} -PagingOptions 7, 15, 30, 45, 60 -SearchBuilder
|
||||
}
|
||||
}
|
||||
New-HTMLSection -Name 'All Permissions' {
|
||||
@@ -355,7 +355,7 @@
|
||||
New-HTMLTableCondition -Name 'Permission' -Value 'GpoApply' -BackgroundColor Orange -ComparisonType string
|
||||
New-HTMLTableCondition -Name 'Permission' -Value 'GpoRead' -BackgroundColor MediumSpringGreen -ComparisonType string -Operator eq
|
||||
New-HTMLTableCondition -Name 'PrincipalSidType' -Value 'Unknown' -BackgroundColor Salmon -ComparisonType string -Operator eq
|
||||
} -PagingOptions 7, 15, 30, 45, 60 -DataTableID 'GPOPermissionsAll'
|
||||
} -PagingOptions 7, 15, 30, 45, 60 -DataTableID 'GPOPermissionsAll' -SearchBuilder
|
||||
}
|
||||
if ($Script:Reporting['Settings']['HideSteps'] -eq $false) {
|
||||
New-HTMLSection -Name 'Steps to fix Group Policy Administrative Users' {
|
||||
|
||||
@@ -151,12 +151,12 @@
|
||||
New-HTMLSection -Name 'Group Policy Authenticated Users Analysis' {
|
||||
New-HTMLTable -DataTable $Script:Reporting['GPOPermissionsRead']['Data'].Permissions -Filtering {
|
||||
New-HTMLTableCondition -Name 'Permission' -Value '' -BackgroundColor Salmon -ComparisonType string -Row
|
||||
} -PagingOptions 7, 15, 30, 45, 60
|
||||
} -PagingOptions 7, 15, 30, 45, 60 -SearchBuilder
|
||||
}
|
||||
New-HTMLSection -Name 'Group Policy Issues Assesment' {
|
||||
New-HTMLTable -DataTable $Script:Reporting['GPOPermissionsRead']['Data'].Issues -Filtering {
|
||||
New-HTMLTableCondition -Name 'PermissionIssue' -Value $true -BackgroundColor Salmon -ComparisonType string -Row
|
||||
} -PagingOptions 7, 15, 30, 45, 60 -DefaultSortColumn PermissionIssue -DefaultSortOrder Descending
|
||||
} -PagingOptions 7, 15, 30, 45, 60 -DefaultSortColumn PermissionIssue -DefaultSortOrder Descending -SearchBuilder
|
||||
}
|
||||
if ($Script:Reporting['Settings']['HideSteps'] -eq $false) {
|
||||
New-HTMLSection -Name 'Steps to fix Group Policy Authenticated Users' {
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
New-HTMLTable -DataTable $Script:Reporting['GPOPermissionsRoot']['WarningsAndErrors'] -Filtering {
|
||||
New-HTMLTableCondition -Name 'Type' -Value 'Warning' -BackgroundColor SandyBrown -ComparisonType string -Row
|
||||
New-HTMLTableCondition -Name 'Type' -Value 'Error' -BackgroundColor Salmon -ComparisonType string -Row
|
||||
}
|
||||
} -SearchBuilder
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -71,7 +71,7 @@
|
||||
New-HTMLSection -Name 'Group Policy Unknown Permissions Analysis' {
|
||||
New-HTMLTable -DataTable $Script:Reporting['GPOPermissionsUnknown']['Data'] -Filtering {
|
||||
New-HTMLTableCondition -Name 'Permission' -Value '' -BackgroundColor Salmon -ComparisonType string -Row
|
||||
} -PagingOptions 7, 15, 30, 45, 60
|
||||
} -PagingOptions 7, 15, 30, 45, 60 -SearchBuilder
|
||||
}
|
||||
if ($Script:Reporting['Settings']['HideSteps'] -eq $false) {
|
||||
New-HTMLSection -Name 'Steps to fix Group Policy Unknown Permissions' {
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
GPOOwners = $GPOZaurrOwners
|
||||
GPOConsistency = $GPOZaurrConsistency
|
||||
GPODuplicates = $GPOZaurrDuplicates
|
||||
GPOOrganizationalUnit = $GPOZaurrOrganizationalUnit
|
||||
GPOList = $GPOZaurrList
|
||||
GPOLinks = $GPOZaurrLinks
|
||||
GPOPassword = $GPOZaurrPassword
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
$Script:GPODitionary = [ordered] @{
|
||||
AccountPolicies = [ordered] @{
|
||||
AccountPolicies = [ordered] @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'SecuritySettings'
|
||||
@@ -14,7 +14,7 @@
|
||||
ConvertTo-XMLAccountPolicy -GPO $GPO -SingleObject
|
||||
}
|
||||
}
|
||||
Audit = [ordered] @{
|
||||
Audit = [ordered] @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'SecuritySettings'
|
||||
@@ -36,7 +36,7 @@
|
||||
ConvertTo-XMLAudit -GPO $GPO -SingleObject
|
||||
}
|
||||
}
|
||||
Autologon = [ordered] @{
|
||||
Autologon = [ordered] @{
|
||||
# We want to process this based on other report called RegistrySettings
|
||||
# This is because registry settings can be stored in Collections or nested within other registry settings
|
||||
# The original function ConvertTo-XMLRegistryAutologon was processing it in limited ordered and potentially would skip some entries.
|
||||
@@ -50,7 +50,7 @@
|
||||
ConvertTo-XMLRegistryAutologonOnReport -GPO $GPO
|
||||
}
|
||||
}
|
||||
AutoPlay = @{
|
||||
AutoPlay = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -65,7 +65,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Windows Components/AutoPlay Policies*' -SingleObject
|
||||
}
|
||||
}
|
||||
Biometrics = @{
|
||||
Biometrics = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -78,7 +78,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Windows Components/Biometrics*'
|
||||
}
|
||||
}
|
||||
Bitlocker = @{
|
||||
Bitlocker = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -95,7 +95,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Windows Components/BitLocker Drive Encryption*' -SingleObject
|
||||
}
|
||||
}
|
||||
ControlPanel = [ordered]@{
|
||||
ControlPanel = [ordered]@{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -110,7 +110,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Control Panel' -SingleObject
|
||||
}
|
||||
}
|
||||
ControlPanelAddRemove = [ordered]@{
|
||||
ControlPanelAddRemove = [ordered]@{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -125,7 +125,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Control Panel/Add or Remove Programs' -SingleObject
|
||||
}
|
||||
}
|
||||
ControlPanelDisplay = [ordered]@{
|
||||
ControlPanelDisplay = [ordered]@{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -140,7 +140,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Control Panel/Display' -SingleObject
|
||||
}
|
||||
}
|
||||
ControlPanelPersonalization = [ordered]@{
|
||||
ControlPanelPersonalization = [ordered]@{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -155,7 +155,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Control Panel/Personalization' -SingleObject
|
||||
}
|
||||
}
|
||||
ControlPanelPrinters = [ordered]@{
|
||||
ControlPanelPrinters = [ordered]@{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -170,7 +170,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Control Panel/Printers' -SingleObject
|
||||
}
|
||||
}
|
||||
ControlPanelPrograms = [ordered]@{
|
||||
ControlPanelPrograms = [ordered]@{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -185,7 +185,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Control Panel/Programs' -SingleObject
|
||||
}
|
||||
}
|
||||
ControlPanelRegional = [ordered]@{
|
||||
ControlPanelRegional = [ordered]@{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -200,7 +200,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Control Panel/Regional and Language Options' -SingleObject
|
||||
}
|
||||
}
|
||||
CredentialsDelegation = @{
|
||||
CredentialsDelegation = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -215,7 +215,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'System/Credentials Delegation*' -SingleObject
|
||||
}
|
||||
}
|
||||
CustomInternationalSettings = [ordered]@{
|
||||
CustomInternationalSettings = [ordered]@{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -230,7 +230,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Custom International Settings*' -SingleObject
|
||||
}
|
||||
}
|
||||
Desktop = @{
|
||||
Desktop = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -245,7 +245,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Desktop*' -SingleObject
|
||||
}
|
||||
}
|
||||
DnsClient = @{
|
||||
DnsClient = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -260,7 +260,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Network/DNS Client*' -SingleObject
|
||||
}
|
||||
}
|
||||
DriveMapping = [ordered] @{
|
||||
DriveMapping = [ordered] @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'DriveMapSettings'
|
||||
@@ -275,7 +275,7 @@
|
||||
ConvertTo-XMLDriveMapSettings -GPO $GPO -SingleObject
|
||||
}
|
||||
}
|
||||
EventLog = [ordered] @{
|
||||
EventLog = [ordered] @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'SecuritySettings'
|
||||
@@ -290,7 +290,7 @@
|
||||
ConvertTo-XMLEventLog -GPO $GPO
|
||||
}
|
||||
}
|
||||
EventForwarding = @{
|
||||
EventForwarding = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -305,7 +305,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Windows Components/Event Forwarding*' -SingleObject
|
||||
}
|
||||
}
|
||||
EventLogService = @{
|
||||
EventLogService = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -320,7 +320,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Windows Components/Event Log Service*' -SingleObject
|
||||
}
|
||||
}
|
||||
FileExplorer = @{
|
||||
FileExplorer = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -335,7 +335,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Windows Components/File Explorer*' -SingleObject
|
||||
}
|
||||
}
|
||||
FolderRedirection = @{
|
||||
FolderRedirection = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'FolderRedirectionSettings'
|
||||
@@ -350,7 +350,7 @@
|
||||
ConvertTo-XMLFolderRedirection -GPO $GPO -SingleObject
|
||||
}
|
||||
}
|
||||
FolderRedirectionPolicy = @{
|
||||
FolderRedirectionPolicy = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -365,7 +365,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'System/Folder Redirection' -SingleObject
|
||||
}
|
||||
}
|
||||
FSLogix = @{
|
||||
FSLogix = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -380,7 +380,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'FSLogix' -SingleObject
|
||||
}
|
||||
}
|
||||
GoogleChrome = @{
|
||||
GoogleChrome = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -399,7 +399,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Google Chrome', 'Google/Google Chrome', 'Google Chrome - Default Settings (users can override)' -SingleObject
|
||||
}
|
||||
}
|
||||
GroupPolicy = @{
|
||||
GroupPolicy = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -414,7 +414,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'System/Group Policy*' -SingleObject
|
||||
}
|
||||
}
|
||||
InternetCommunicationManagement = @{
|
||||
InternetCommunicationManagement = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -429,7 +429,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'System/Internet Communication Management*' -SingleObject
|
||||
}
|
||||
}
|
||||
InternetExplorer = @{
|
||||
InternetExplorer = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -444,7 +444,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Windows Components/Internet Explorer*', 'Composants Windows/Celle Internet Explorer' -SingleObject
|
||||
}
|
||||
}
|
||||
InternetExplorerZones = [ordered] @{
|
||||
InternetExplorerZones = [ordered] @{
|
||||
ByReports = @(
|
||||
@{
|
||||
Report = 'RegistrySettings'
|
||||
@@ -455,7 +455,7 @@
|
||||
ConvertTo-XMLRegistryInternetExplorerZones -GPO $GPO
|
||||
}
|
||||
}
|
||||
KDC = @{
|
||||
KDC = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -470,7 +470,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'System/KDC' -SingleObject
|
||||
}
|
||||
}
|
||||
LAPS = @{
|
||||
LAPS = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -485,7 +485,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'LAPS' -SingleObject
|
||||
}
|
||||
}
|
||||
Lithnet = @{
|
||||
Lithnet = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -501,7 +501,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Lithnet/Password Protection for Active Directory*' -SingleObject
|
||||
}
|
||||
}
|
||||
LocalUsers = [ordered] @{
|
||||
LocalUsers = [ordered] @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'LugsSettings'
|
||||
@@ -516,7 +516,7 @@
|
||||
ConvertTo-XMLLocalUser -GPO $GPO -SingleObject
|
||||
}
|
||||
}
|
||||
LocalGroups = [ordered] @{
|
||||
LocalGroups = [ordered] @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'LugsSettings'
|
||||
@@ -531,7 +531,7 @@
|
||||
ConvertTo-XMLLocalGroups -GPO $GPO -SingleObject
|
||||
}
|
||||
}
|
||||
Logon = @{
|
||||
Logon = @{
|
||||
Types = @(
|
||||
@{ Category = 'RegistrySettings'; Settings = 'Policy' }
|
||||
)
|
||||
@@ -543,7 +543,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'System/Logon*' -SingleObject
|
||||
}
|
||||
}
|
||||
MicrosoftOutlook2002 = @{
|
||||
MicrosoftOutlook2002 = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -558,7 +558,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Microsoft Outlook 2002*' -SingleObject
|
||||
}
|
||||
}
|
||||
MicrosoftEdge = @{
|
||||
MicrosoftEdge = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -577,7 +577,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Microsoft Edge*', 'Windows Components/Microsoft Edge', 'Windows Components/Edge UI' -SingleObject
|
||||
}
|
||||
}
|
||||
MicrosoftOutlook2003 = @{
|
||||
MicrosoftOutlook2003 = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -595,7 +595,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Microsoft Office Outlook 2003*', 'Outlook 2003 RPC Encryption' -SingleObject
|
||||
}
|
||||
}
|
||||
MicrosoftOutlook2010 = @{
|
||||
MicrosoftOutlook2010 = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -610,7 +610,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Microsoft Outlook 2010*' -SingleObject
|
||||
}
|
||||
}
|
||||
MicrosoftOutlook2013 = @{
|
||||
MicrosoftOutlook2013 = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -625,7 +625,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Microsoft Outlook 2013*' -SingleObject
|
||||
}
|
||||
}
|
||||
MicrosoftOutlook2016 = @{
|
||||
MicrosoftOutlook2016 = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -640,7 +640,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Microsoft Outlook 2016*' -SingleObject
|
||||
}
|
||||
}
|
||||
MicrosoftManagementConsole = @{
|
||||
MicrosoftManagementConsole = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -655,7 +655,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Windows Components/Microsoft Management Console*' -SingleObject
|
||||
}
|
||||
}
|
||||
NetMeeting = @{
|
||||
NetMeeting = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -670,7 +670,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Windows Components/NetMeeting*' -SingleObject
|
||||
}
|
||||
}
|
||||
MSSLegacy = @{
|
||||
MSSLegacy = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -685,7 +685,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'MSS (Legacy)' -SingleObject
|
||||
}
|
||||
}
|
||||
MSSecurityGuide = @{
|
||||
MSSecurityGuide = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -700,7 +700,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'MS Security Guide' -SingleObject
|
||||
}
|
||||
}
|
||||
OneDrive = @{
|
||||
OneDrive = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -715,7 +715,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Windows Components/OneDrive*' -SingleObject
|
||||
}
|
||||
}
|
||||
Policies = @{
|
||||
Policies = @{
|
||||
Comment = "This isn't really translated"
|
||||
Types = @(
|
||||
@{
|
||||
@@ -731,7 +731,7 @@
|
||||
ConvertTo-XMLPolicies -GPO $GPO -SingleObject
|
||||
}
|
||||
}
|
||||
Printers = @{
|
||||
Printers = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'PrintersSettings'
|
||||
@@ -750,7 +750,7 @@
|
||||
ConvertTo-XMLPrinter -GPO $GPO -SingleObject
|
||||
}
|
||||
}
|
||||
PrintersPolicies = @{
|
||||
PrintersPolicies = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -768,7 +768,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Printers*', 'Control Panel/Printers*' -SingleObject
|
||||
}
|
||||
}
|
||||
PublicKeyPoliciesCertificates = [ordered] @{
|
||||
PublicKeyPoliciesCertificates = [ordered] @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'PublicKeySettings'
|
||||
@@ -789,10 +789,10 @@
|
||||
)
|
||||
GPOPath = 'Policies -> Windows Settings -> Security Settings -> Public Key Policies'
|
||||
Code = {
|
||||
ConvertTo-XMLGenericPublicKey -GPO $GPO
|
||||
ConvertTo-XMLCertificates -GPO $GPO
|
||||
}
|
||||
CodeSingle = {
|
||||
ConvertTo-XMLGenericPublicKey -GPO $GPO -SingleObject
|
||||
ConvertTo-XMLCertificates -GPO $GPO -SingleObject
|
||||
}
|
||||
}
|
||||
<#
|
||||
@@ -820,7 +820,7 @@
|
||||
}
|
||||
}
|
||||
#>
|
||||
PublicKeyPoliciesAutoEnrollment = [ordered] @{
|
||||
PublicKeyPoliciesAutoEnrollment = [ordered] @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'PublicKeySettings'
|
||||
@@ -835,7 +835,7 @@
|
||||
ConvertTo-XMLGenericPublicKey -GPO $GPO -SingleObject
|
||||
}
|
||||
}
|
||||
PublicKeyPoliciesEFS = [ordered] @{
|
||||
PublicKeyPoliciesEFS = [ordered] @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'PublicKeySettings'
|
||||
@@ -850,7 +850,7 @@
|
||||
ConvertTo-XMLGenericPublicKey -GPO $GPO -SingleObject
|
||||
}
|
||||
}
|
||||
PublicKeyPoliciesRootCA = [ordered] @{
|
||||
PublicKeyPoliciesRootCA = [ordered] @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'PublicKeySettings'
|
||||
@@ -865,7 +865,7 @@
|
||||
ConvertTo-XMLGenericPublicKey -GPO $GPO -SingleObject
|
||||
}
|
||||
}
|
||||
PublicKeyPoliciesEnrollmentPolicy = @{
|
||||
PublicKeyPoliciesEnrollmentPolicy = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -882,7 +882,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'System/Internet Communication Management*' -SingleObject
|
||||
}
|
||||
}
|
||||
RegistrySetting = [ordered] @{
|
||||
RegistrySetting = [ordered] @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -897,7 +897,7 @@
|
||||
ConvertTo-XMLGenericPublicKey -GPO $GPO -SingleObject
|
||||
}
|
||||
}
|
||||
RegistrySettings = [ordered] @{
|
||||
RegistrySettings = [ordered] @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -912,7 +912,7 @@
|
||||
ConvertTo-XMLRegistrySettings -GPO $GPO -SingleObject
|
||||
}
|
||||
}
|
||||
OnlineAssistance = @{
|
||||
OnlineAssistance = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -927,7 +927,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Windows Components/Online Assistance*' -SingleObject
|
||||
}
|
||||
}
|
||||
RemoteAssistance = @{
|
||||
RemoteAssistance = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -942,7 +942,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'System/Remote Assistance*' -SingleObject
|
||||
}
|
||||
}
|
||||
RemoteDesktopServices = @{
|
||||
RemoteDesktopServices = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -957,7 +957,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Windows Components/Remote Desktop Services*' -SingleObject
|
||||
}
|
||||
}
|
||||
RSSFeeds = @{
|
||||
RSSFeeds = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -972,7 +972,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Windows Components/RSS Feeds*' -SingleObject
|
||||
}
|
||||
}
|
||||
Scripts = [ordered] @{
|
||||
Scripts = [ordered] @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'Scripts'
|
||||
@@ -987,7 +987,7 @@
|
||||
ConvertTo-XMLScripts -GPO $GPO -SingleObject
|
||||
}
|
||||
}
|
||||
SecurityOptions = [ordered] @{
|
||||
SecurityOptions = [ordered] @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'SecuritySettings'
|
||||
@@ -1002,7 +1002,7 @@
|
||||
ConvertTo-XMLSecurityOptions -GPO $GPO -SingleObject
|
||||
}
|
||||
}
|
||||
SoftwareInstallation = [ordered] @{
|
||||
SoftwareInstallation = [ordered] @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'SoftwareInstallationSettings'
|
||||
@@ -1017,7 +1017,7 @@
|
||||
ConvertTo-XMLSoftwareInstallation -GPO $GPO -SingleObject
|
||||
}
|
||||
}
|
||||
SystemServices = [ordered] @{
|
||||
SystemServices = [ordered] @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'SecuritySettings'
|
||||
@@ -1033,7 +1033,7 @@
|
||||
ConvertTo-XMLSystemServices -GPO $GPO -SingleObject
|
||||
}
|
||||
}
|
||||
SystemServicesNT = [ordered] @{
|
||||
SystemServicesNT = [ordered] @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'ServiceSettings'
|
||||
@@ -1067,7 +1067,7 @@
|
||||
}
|
||||
}
|
||||
#>
|
||||
TaskScheduler = [ordered] @{
|
||||
TaskScheduler = [ordered] @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'ScheduledTasksSettings'
|
||||
@@ -1083,7 +1083,7 @@
|
||||
ConvertTo-XMLTaskScheduler -GPO $GPO -SingleObject
|
||||
}
|
||||
}
|
||||
TaskSchedulerPolicies = @{
|
||||
TaskSchedulerPolicies = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -1116,7 +1116,7 @@
|
||||
}
|
||||
}
|
||||
#>
|
||||
UserRightsAssignment = [ordered] @{
|
||||
UserRightsAssignment = [ordered] @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'SecuritySettings'
|
||||
@@ -1131,7 +1131,7 @@
|
||||
ConvertTo-XMLUserRightsAssignment -GPO $GPO -SingleObject
|
||||
}
|
||||
}
|
||||
WindowsDefender = @{
|
||||
WindowsDefender = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -1146,7 +1146,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Windows Components/Windows Defender*' -SingleObject
|
||||
}
|
||||
}
|
||||
WindowsDefenderExploitGuard = @{
|
||||
WindowsDefenderExploitGuard = @{
|
||||
# this needs improvements because of DropDownList
|
||||
Types = @(
|
||||
@{
|
||||
@@ -1162,7 +1162,103 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Windows Components/Microsoft Defender Antivirus/Microsoft Defender Exploit Guard*' -SingleObject
|
||||
}
|
||||
}
|
||||
WindowsHelloForBusiness = @{
|
||||
# WindowsFirewall = @{
|
||||
# # Contains only one setting showing version
|
||||
# Types = @(
|
||||
# @{
|
||||
# Category = 'WindowsFirewallSettings'
|
||||
# Settings = 'GlobalSettings'
|
||||
# }
|
||||
# )
|
||||
# GPOPath = 'Policies -> Windows Settings -> Security Settings -> Windows Firewall with Advanced Security'
|
||||
# Code = {
|
||||
# ConvertTo-XMLWindowsFirewall -GPO $GPO
|
||||
# }
|
||||
# CodeSingle = {
|
||||
# ConvertTo-XMLWindowsFirewall -GPO $GPO -SingleObject
|
||||
# }
|
||||
# }
|
||||
WindowsFirewallConnectionSecurityRules = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'WindowsFirewallSettings'
|
||||
Settings = 'ConnectionSecurityRules'
|
||||
}
|
||||
)
|
||||
GPOPath = 'Policies -> Windows Settings -> Security Settings -> Windows Firewall with Advanced Security'
|
||||
Code = {
|
||||
ConvertTo-XMLWindowsFirewallSecurityRules -GPO $GPO
|
||||
}
|
||||
CodeSingle = {
|
||||
ConvertTo-XMLWindowsFirewallSecurityRules -GPO $GPO -SingleObject
|
||||
}
|
||||
}
|
||||
WindowsFirewallConnectionSecurityAuthentication = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'WindowsFirewallSettings'
|
||||
Settings = 'Phase1AuthenticationSets'
|
||||
}
|
||||
@{
|
||||
Category = 'WindowsFirewallSettings'
|
||||
Settings = 'Phase2AuthenticationSets'
|
||||
}
|
||||
#@{
|
||||
# Category = 'WindowsFirewallSettings'
|
||||
# Settings = 'DefaultPhase1CryptoSet'
|
||||
#}
|
||||
)
|
||||
GPOPath = 'Policies -> Windows Settings -> Security Settings -> Windows Firewall with Advanced Security'
|
||||
Code = {
|
||||
ConvertTo-XMLWindowsFirewallConnectionSecurityAuthentiation -GPO $GPO
|
||||
}
|
||||
CodeSingle = {
|
||||
ConvertTo-XMLWindowsFirewallConnectionSecurityAuthentiation -GPO $GPO -SingleObject
|
||||
}
|
||||
}
|
||||
WindowsFirewallProfiles = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'WindowsFirewallSettings'
|
||||
Settings = 'DomainProfile'
|
||||
}
|
||||
@{
|
||||
Category = 'WindowsFirewallSettings'
|
||||
Settings = 'PublicProfile'
|
||||
}
|
||||
@{
|
||||
Category = 'WindowsFirewallSettings'
|
||||
Settings = 'PrivateProfile'
|
||||
}
|
||||
)
|
||||
GPOPath = 'Policies -> Windows Settings -> Security Settings -> Windows Firewall with Advanced Security'
|
||||
Code = {
|
||||
ConvertTo-XMLWindowsFirewallProfile -GPO $GPO
|
||||
}
|
||||
CodeSingle = {
|
||||
ConvertTo-XMLWindowsFirewallProfile -GPO $GPO -SingleObject
|
||||
}
|
||||
}
|
||||
WindowsFirewallRules = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'WindowsFirewallSettings'
|
||||
Settings = 'InboundFirewallRules'
|
||||
}
|
||||
@{
|
||||
Category = 'WindowsFirewallSettings'
|
||||
Settings = 'OutboundFirewallRules'
|
||||
}
|
||||
)
|
||||
GPOPath = 'Policies -> Windows Settings -> Security Settings -> Windows Firewall with Advanced Security -> '
|
||||
Code = {
|
||||
ConvertTo-XMLWindowsFirewallRules -GPO $GPO
|
||||
}
|
||||
CodeSingle = {
|
||||
ConvertTo-XMLWindowsFirewallRules -GPO $GPO -SingleObject
|
||||
}
|
||||
}
|
||||
WindowsHelloForBusiness = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -1177,7 +1273,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Windows Components/Windows Hello For Business*' -SingleObject
|
||||
}
|
||||
}
|
||||
WindowsInstaller = @{
|
||||
WindowsInstaller = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -1192,7 +1288,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Windows Components/Windows Installer*' -SingleObject
|
||||
}
|
||||
}
|
||||
WindowsLogon = @{
|
||||
WindowsLogon = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -1207,7 +1303,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Windows Components/Windows Logon Options*' -SingleObject
|
||||
}
|
||||
}
|
||||
WindowsMediaPlayer = @{
|
||||
WindowsMediaPlayer = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -1222,7 +1318,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Windows Components/Windows Media Player*' -SingleObject
|
||||
}
|
||||
}
|
||||
WindowsMessenger = @{
|
||||
WindowsMessenger = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -1237,7 +1333,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Windows Components/Windows Messenger*' -SingleObject
|
||||
}
|
||||
}
|
||||
WindowsPowerShell = @{
|
||||
WindowsPowerShell = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -1252,7 +1348,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Windows Components/Windows PowerShell*' -SingleObject
|
||||
}
|
||||
}
|
||||
WindowsRemoteManagement = @{
|
||||
WindowsRemoteManagement = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -1267,7 +1363,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'Windows Components/Windows Remote Management (WinRM)*' -SingleObject
|
||||
}
|
||||
}
|
||||
WindowsTimeService = @{
|
||||
WindowsTimeService = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
@@ -1282,7 +1378,7 @@
|
||||
ConvertTo-XMLGenericPolicy -GPO $GPO -Category 'System/Windows Time Service*' -SingleObject
|
||||
}
|
||||
}
|
||||
WindowsUpdate = @{
|
||||
WindowsUpdate = @{
|
||||
Types = @(
|
||||
@{
|
||||
Category = 'RegistrySettings'
|
||||
|
||||
@@ -99,7 +99,7 @@
|
||||
} else {
|
||||
foreach ($Path in $GPOPath) {
|
||||
Write-Verbose "Get-GPOZaurr - Getting GPO content from XML files"
|
||||
Get-ChildItem -LiteralPath $Path -Recurse -Filter *.xml | ForEach-Object {
|
||||
Get-ChildItem -LiteralPath $Path -Recurse -Filter *.xml -ErrorAction SilentlyContinue | ForEach-Object {
|
||||
if ($_.Name -ne 'GPOList.xml') {
|
||||
$XMLContent = [XML]::new()
|
||||
$XMLContent.Load($_.FullName)
|
||||
|
||||
@@ -1,8 +1,49 @@
|
||||
function Get-GPOZaurrInheritance {
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Short description
|
||||
|
||||
.DESCRIPTION
|
||||
Long description
|
||||
|
||||
.PARAMETER IncludeBlockedObjects
|
||||
Include OU's with blocked inheritance. Default disabled
|
||||
|
||||
.PARAMETER OnlyBlockedInheritance
|
||||
Show only OU's with blocked inheritance
|
||||
|
||||
.PARAMETER IncludeExcludedObjects
|
||||
Show excluded objets. Default disabled
|
||||
|
||||
.PARAMETER Exclusions
|
||||
Provide exclusions for OU's approved by IT. You can provide OU by canonical name or distinguishedName
|
||||
|
||||
.PARAMETER Forest
|
||||
Target different Forest, by default current forest is used
|
||||
|
||||
.PARAMETER ExcludeDomains
|
||||
Exclude domain from search, by default whole forest is scanned
|
||||
|
||||
.PARAMETER IncludeDomains
|
||||
Include only specific domains, by default whole forest is scanned
|
||||
|
||||
.PARAMETER ExtendedForestInformation
|
||||
Ability to provide Forest Information from another command to speed up processing
|
||||
|
||||
.EXAMPLE
|
||||
$Objects = Get-GPOZaurrInheritance -IncludeBlockedObjects -IncludeExcludedObjects -OnlyBlockedInheritance -Exclusions $ExcludedOU
|
||||
$Objects | Format-Table
|
||||
|
||||
.NOTES
|
||||
General notes
|
||||
#>
|
||||
[cmdletBinding()]
|
||||
param(
|
||||
[switch] $IncludeBlockedObjects,
|
||||
[switch] $OnlyBlockedInheritance,
|
||||
[switch] $IncludeExcludedObjects,
|
||||
[switch] $IncludeGroupPoliciesForBlockedObjects,
|
||||
[string[]] $Exclusions,
|
||||
|
||||
[alias('ForestName')][string] $Forest,
|
||||
[string[]] $ExcludeDomains,
|
||||
@@ -10,7 +51,11 @@
|
||||
[System.Collections.IDictionary] $ExtendedForestInformation
|
||||
)
|
||||
Begin {
|
||||
$ExclusionsCache = @{}
|
||||
$ForestInformation = Get-WinADForestDetails -Extended -Forest $Forest -IncludeDomains $IncludeDomains -ExcludeDomains $ExcludeDomains -ExtendedForestInformation $ExtendedForestInformation
|
||||
foreach ($Exclusion in $Exclusions) {
|
||||
$ExclusionsCache[$Exclusion] = $true
|
||||
}
|
||||
}
|
||||
Process {
|
||||
foreach ($Domain in $ForestInformation.Domains) {
|
||||
@@ -19,6 +64,37 @@
|
||||
$InheritanceInformation = [Ordered] @{
|
||||
CanonicalName = $OU.canonicalName
|
||||
BlockedInheritance = if ($OU.gpOptions -eq 1) { $true } else { $false }
|
||||
Exclude = $false
|
||||
DomainName = ConvertFrom-DistinguishedName -ToDomainCN -DistinguishedName $OU.DistinguishedName
|
||||
}
|
||||
if ($InheritanceInformation.BlockedInheritance -and $IncludeGroupPoliciesForBlockedObjects.IsPresent) {
|
||||
$GPInheritance = Get-GPInheritance -Target $OU.distinguishedName
|
||||
$ActiveGroupPolicies = foreach ($GPO in $GPInheritance.InheritedGpoLinks) {
|
||||
[PSCustomObject] @{
|
||||
OrganizationalUnit = $OU.canonicalName
|
||||
DisplayName = $GPO.DisplayName
|
||||
DomainName = $GPO.GpoDomainName
|
||||
LinkedDirectly = if ($OU.DistinguishedName -eq $GPO.Target) { $true } else { $false }
|
||||
GPOID = $GPO.GPOID
|
||||
Enabled = $GPO.Enabled
|
||||
Enforced = $GPO.Enforced
|
||||
Order = $GPO.Order
|
||||
LinkedTo = $GPO.Target
|
||||
OrganizationalUnitDN = $OU.DistinguishedName
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$ActiveGroupPolicies = $null
|
||||
}
|
||||
if ($Exclusions) {
|
||||
if ($ExclusionsCache[$OU.canonicalName]) {
|
||||
$InheritanceInformation['Exclude'] = $true
|
||||
} elseif ($ExclusionsCache[$OU.DistinguishedName]) {
|
||||
$InheritanceInformation['Exclude'] = $true
|
||||
}
|
||||
}
|
||||
if (-not $IncludeExcludedObjects -and $InheritanceInformation['Exclude']) {
|
||||
continue
|
||||
}
|
||||
if (-not $IncludeBlockedObjects) {
|
||||
if ($OnlyBlockedInheritance) {
|
||||
@@ -44,6 +120,8 @@
|
||||
$InheritanceInformation['Computers'] = $null
|
||||
}
|
||||
}
|
||||
$InheritanceInformation['DistinguishedName'] = $OU.DistinguishedName
|
||||
$InheritanceInformation['GroupPolicies'] = $ActiveGroupPolicies
|
||||
if ($OnlyBlockedInheritance) {
|
||||
if ($InheritanceInformation.BlockedInheritance -eq $true) {
|
||||
[PSCustomObject] $InheritanceInformation
|
||||
@@ -52,17 +130,7 @@
|
||||
[PSCustomObject] $InheritanceInformation
|
||||
}
|
||||
}
|
||||
$InheritanceInformation['DistinguishedName'] = $OU.DistinguishedName
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
<#
|
||||
|
||||
$OrganizationalUnits = Get-ADOrganizationalUnit -Filter *
|
||||
$Output = foreach ($OU in $OrganizationalUnits) {
|
||||
Get-GPInheritance -Target $OU.DistinguishedName
|
||||
}
|
||||
$Output | Format-Table
|
||||
#>
|
||||
}
|
||||
@@ -13,7 +13,7 @@
|
||||
$CacheSummaryLinks = [ordered] @{} # cache
|
||||
|
||||
# Get all links
|
||||
$Links = Get-GPOZaurrLink -Forest $Forest -IncludeDomains $IncludeDomains -ExcludeDomains $ExcludeDomains -ExtendedForestInformation $ExtendedForestInformation -Linked Root, DomainControllers, Other
|
||||
$Links = Get-GPOZaurrLink -Forest $Forest -IncludeDomains $IncludeDomains -ExcludeDomains $ExcludeDomains -ExtendedForestInformation $ExtendedForestInformation -Linked Root, DomainControllers, OrganizationalUnit
|
||||
foreach ($Link in $Links) {
|
||||
if (-not $CacheSummaryLinks["$($Link.DomainName)$($Link.Guid)"]) {
|
||||
$CacheSummaryLinks["$($Link.DomainName)$($Link.Guid)"] = [System.Collections.Generic.List[System.Object]]::new()
|
||||
@@ -121,13 +121,13 @@
|
||||
for ($i = 0; $i -le $HighestCount; $i++) {
|
||||
"Level$i"
|
||||
}
|
||||
'Owner'
|
||||
'GpoStatus'
|
||||
'Description'
|
||||
'CreationTime'
|
||||
'ModificationTime'
|
||||
'GPODomainDistinguishedName'
|
||||
'GPODistinguishedName'
|
||||
#'Owner'
|
||||
#'GpoStatus'
|
||||
#'Description'
|
||||
#'CreationTime'
|
||||
#'ModificationTime'
|
||||
#'GPODomainDistinguishedName'
|
||||
#'GPODistinguishedName'
|
||||
)
|
||||
$ReturnObject.MultipleLinks = $ReturnObject.MultipleLinks | Select-Object -Property $Properties
|
||||
}
|
||||
|
||||
@@ -0,0 +1,130 @@
|
||||
function Get-GPOZaurrOrganizationalUnit {
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[alias('ForestName')][string] $Forest,
|
||||
[string[]] $ExcludeDomains,
|
||||
[alias('Domain', 'Domains')][string[]] $IncludeDomains,
|
||||
[System.Collections.IDictionary] $ExtendedForestInformation,
|
||||
|
||||
[ValidateSet('OK', 'Unlink', 'Delete')][string[]] $Option
|
||||
)
|
||||
$CachedOu = [ordered] @{}
|
||||
$CachedGPO = [ordered] @{}
|
||||
$ForestInformation = Get-WinADForestDetails -Extended -Forest $Forest -IncludeDomains $IncludeDomains -ExcludeDomains $ExcludeDomains -ExtendedForestInformation $ExtendedForestInformation
|
||||
$GroupPolicies = Get-GPOZaurrAD -Forest $Forest -IncludeDomains $IncludeDomains -ExcludeDomains $ExcludeDomains -ExtendedForestInformation $ExtendedForestInformation
|
||||
foreach ($GPO in $GroupPolicies) {
|
||||
$CachedGPO[$GPO.GPODistinguishedName] = $GPO
|
||||
}
|
||||
foreach ($Domain in $ForestInformation.Domains) {
|
||||
Write-Verbose "Get-GPOZaurrOrganizationalUnit - Processing $($Domain)"
|
||||
$CountTop = 0
|
||||
$TopOrganizationalUnits = Get-ADOrganizationalUnit -Filter * -Properties LinkedGroupPolicyObjects, DistinguishedName, ntSecurityDescriptor -Server $ForestInformation['QueryServers'][$Domain]['hostname'][0] -SearchScope OneLevel
|
||||
foreach ($TopOU in $TopOrganizationalUnits) {
|
||||
$CountTop++
|
||||
Write-Verbose "Get-GPOZaurrOrganizationalUnit - Processing $($Domain) / $($TOPOU.DistinguishedName) [$CountTop/$($TopOrganizationalUnits.Count)]"
|
||||
# cache top ou
|
||||
if ($TopOU.LinkedGroupPolicyObjects) {
|
||||
$LinkedGPOs = $CachedGPO[$TopOU.LinkedGroupPolicyObjects]
|
||||
} else {
|
||||
$LinkedGPOs = $null
|
||||
}
|
||||
$CachedOu[$TopOU.DistinguishedName] = [ordered]@{
|
||||
'LinkedGroupPolicyObjects' = $TopOU.LinkedGroupPolicyObjects
|
||||
'LinkedGroupPolicy' = $LinkedGPOs
|
||||
'Objects' = [ordered] @{}
|
||||
'ObjectsClasses' = [ordered] @{}
|
||||
'ObjectsCountDirect' = 0
|
||||
'ObjectsCountIndirect' = 0
|
||||
'ObjectsCountTotal' = 0
|
||||
'Level' = 'Top'
|
||||
'Domain' = $Domain
|
||||
}
|
||||
|
||||
# cache children OUs
|
||||
$OUs = Get-ADOrganizationalUnit -SearchScope Subtree -SearchBase $TopOU.DistinguishedName -Server $ForestInformation['QueryServers'][$Domain]['hostname'][0] -Properties LinkedGroupPolicyObjects, DistinguishedName -Filter *
|
||||
Write-Verbose "Get-GPOZaurrOrganizationalUnit - Processing $($Domain) / $($TOPOU.DistinguishedName) [$CountTop/$($TopOrganizationalUnits.Count)], found $($OUs.Count) OU's to process."
|
||||
foreach ($OU in $OUs) {
|
||||
if (-not $CachedOu[$OU.DistinguishedName]) {
|
||||
if ($OU.LinkedGroupPolicyObjects) {
|
||||
$LinkedGPOs = $CachedGPO[$OU.LinkedGroupPolicyObjects]
|
||||
} else {
|
||||
$LinkedGPOs = $null
|
||||
}
|
||||
$CachedOu[$OU.DistinguishedName] = [ordered]@{
|
||||
'LinkedGroupPolicyObjects' = $OU.LinkedGroupPolicyObjects
|
||||
'LinkedGroupPolicy' = $LinkedGPOs
|
||||
'Objects' = [ordered] @{}
|
||||
'ObjectsClasses' = [ordered] @{}
|
||||
'ObjectsCountDirect' = 0
|
||||
'ObjectsCountIndirect' = 0
|
||||
'ObjectsCountTotal' = 0
|
||||
'Level' = 'Child'
|
||||
'Domain' = $Domain
|
||||
}
|
||||
}
|
||||
}
|
||||
# Find all objects in those OUs
|
||||
$ObjectsInOu = Get-ADObject -LDAPFilter "(|(ObjectClass=user)(ObjectClass=contact)(ObjectClass=computer)(ObjectClass=group)(objectClass=inetOrgPerson))" -SearchBase $TopOU.distinguishedName -Server $ForestInformation['QueryServers'][$Domain]['hostname'][0]
|
||||
Write-Verbose "Get-GPOZaurrOrganizationalUnit - Processing $($Domain) / $($TOPOU.DistinguishedName) [$CountTop/$($TopOrganizationalUnits.Count)], found $($ObjectsInOu.Count) objects to process."
|
||||
foreach ($Object in $ObjectsInOu) {
|
||||
$Place = ConvertFrom-DistinguishedName -ToOrganizationalUnit -DistinguishedName $Object.DistinguishedName
|
||||
$AllOUs = ConvertFrom-DistinguishedName -ToMultipleOrganizationalUnit -IncludeParent -DistinguishedName $Place
|
||||
foreach ($OU in $AllOUs) {
|
||||
if ($OU -eq $Place) {
|
||||
$CachedOu[$OU]['Objects'][$Object.DistinguishedName] = $Object
|
||||
$CachedOu[$OU]['ObjectsClasses'][$Object.ObjectClass] = ''
|
||||
$CachedOu[$OU]['ObjectsCountDirect']++
|
||||
} else {
|
||||
$CachedOu[$OU]['ObjectsClasses'][$Object.ObjectClass] = ''
|
||||
$CachedOu[$OU]['ObjectsCountIndirect']++
|
||||
}
|
||||
$CachedOu[$OU]['ObjectsCountTotal']++
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach ($OU in $CachedOu.Keys) {
|
||||
$ObjectClasses = [string[]] $CachedOu[$OU]['ObjectsClasses'].Keys
|
||||
|
||||
if ($CachedOu[$OU]['ObjectsCountTotal'] -eq 0 -and $CachedOu[$OU]['LinkedGroupPolicyObjects'].Count -gt 0) {
|
||||
$Status = "Unlink GPO", 'Delete OU'
|
||||
} elseif ($CachedOu[$OU]['ObjectsCountTotal'] -eq 0 -and $CachedOu[$OU]['LinkedGroupPolicyObjects'].Count -eq 0) {
|
||||
$Status = 'Delete OU'
|
||||
} elseif ($CachedOU[$Ou]['ObjectsCountTotal'] -gt 0 -and $CachedOu[$OU]['LinkedGroupPolicyObjects'].Count -gt 0 -and $ObjectClasses -notcontains 'User' -and $ObjectClasses -notcontains 'Computer' ) {
|
||||
$Status = "Unlink GPO"
|
||||
} else {
|
||||
$Status = 'OK'
|
||||
}
|
||||
|
||||
|
||||
if ($Option) {
|
||||
$Found = $false
|
||||
if ($Option -contains 'Ok' -and $Status -contains 'OK') {
|
||||
$Found = $true
|
||||
} elseif ($Option -contains 'Unlink' -and $Status -contains 'Unlink GPO') {
|
||||
$Found = $true
|
||||
} elseif ($Option -contains 'Delete' -and $Status -contains 'Delete OU') {
|
||||
$Found = $true
|
||||
}
|
||||
if (-not $Found) {
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
[PSCustomObject] @{
|
||||
Organizationalunit = $OU
|
||||
Level = $CachedOu[$OU]['Level']
|
||||
DomainName = $CachedOu[$OU]['Domain']
|
||||
Status = $Status
|
||||
GPOCount = $CachedOu[$OU]['LinkedGroupPolicyObjects'].Count
|
||||
ObjectCountDirect = $CachedOu[$OU]['ObjectsCountDirect']
|
||||
ObjectCountIndirect = $CachedOu[$OU]['ObjectsCountIndirect']
|
||||
ObjectCountTotal = $CachedOu[$OU]['ObjectsCountTotal']
|
||||
ObjectClasses = $ObjectClasses
|
||||
GPONames = $CachedOu[$OU]['LinkedGroupPolicy'].DisplayName
|
||||
Objects = $CachedOu[$OU]['Objects'].Values.Name
|
||||
GPO = $CachedOu[$OU]['LinkedGroupPolicy']
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,7 +2,7 @@
|
||||
[alias('Show-GPOZaurr', 'Show-GPO')]
|
||||
[cmdletBinding()]
|
||||
param(
|
||||
[Parameter(Position = 1)][scriptblock] $ExcludeGroupPolicies,
|
||||
[alias('ExcludeGroupPolicies', 'ExclusionsCode')][Parameter(Position = 1)][object] $Exclusions,
|
||||
[string] $FilePath,
|
||||
[Parameter(Position = 0)][string[]] $Type,
|
||||
[switch] $PassThru,
|
||||
@@ -50,27 +50,6 @@
|
||||
Write-Color '[i]', "[GPOZaurr] ", 'Domain Information', ' [Informative] ', "Included Domains: ", $DisplayIncludedDomains -Color Yellow, DarkGray, Yellow, DarkGray, Yellow, Magenta
|
||||
Write-Color '[i]', "[GPOZaurr] ", 'Domain Information', ' [Informative] ', "Excluded Domains: ", $DisplayExcludedDomains -Color Yellow, DarkGray, Yellow, DarkGray, Yellow, Magenta
|
||||
|
||||
# Exclusions support, converts ScriptBlock into list of GPOs
|
||||
<#
|
||||
$Exclusions = [ordered]@{}
|
||||
if ($Extension) {
|
||||
$Exclusions['All'] = [System.Collections.Generic.List[PSCustomObject]]::new()
|
||||
[Array] $ExecuteExtension = & $Extension
|
||||
foreach ($Ext in $ExecuteExtension) {
|
||||
if ($Ext.Type -eq 'Exclusion') {
|
||||
if ($Ext.Type) {
|
||||
if (-not $Exclusions[$Ext.Type]) {
|
||||
$Exclusions[$Ext.Type] = [System.Collections.Generic.List[PSCustomObject]]::new()
|
||||
}
|
||||
$Exclusions[$Ext.Type].Add($Ext)
|
||||
} else {
|
||||
$Exclusions['All'].Add($Ext)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#>
|
||||
|
||||
# Lets make sure we only enable those types which are requestd by user
|
||||
if ($Type) {
|
||||
foreach ($T in $Script:GPOConfiguration.Keys) {
|
||||
@@ -96,8 +75,12 @@
|
||||
Variables = Copy-Dictionary -Dictionary $Script:GPOConfiguration[$T]['Variables']
|
||||
}
|
||||
if ($Exclusions) {
|
||||
$Script:Reporting[$T]['ExclusionsCode'] = $ExcludeGroupPolicies
|
||||
$Script:Reporting[$T]['Exclusions'] = & $ExcludeGroupPolicies
|
||||
if ($Exclusions -is [scriptblock]) {
|
||||
$Script:Reporting[$T]['ExclusionsCode'] = $Exclusions
|
||||
}
|
||||
if ($Exclusions -is [Array]) {
|
||||
$Script:Reporting[$T]['Exclusions'] = $Exclusions
|
||||
}
|
||||
}
|
||||
|
||||
$TimeLogGPOList = Start-TimeLog
|
||||
@@ -152,7 +135,7 @@
|
||||
New-HTMLTabStyle -BorderRadius 0px -TextTransform capitalize -BackgroundColorActive SlateGrey
|
||||
New-HTMLSectionStyle -BorderRadius 0px -HeaderBackGroundColor Grey -RemoveShadow
|
||||
New-HTMLPanelStyle -BorderRadius 0px
|
||||
New-HTMLTableOption -DataStore JavaScript -BoolAsString
|
||||
New-HTMLTableOption -DataStore JavaScript -BoolAsString -ArrayJoinString ', ' -ArrayJoin
|
||||
|
||||
New-HTMLHeader {
|
||||
New-HTMLSection -Invisible {
|
||||
|
||||
@@ -212,7 +212,9 @@
|
||||
$DisplayProperties = @(
|
||||
$FirstProperties
|
||||
foreach ($Property in $Properties) {
|
||||
$Property
|
||||
if ($Property -notin $FirstProperties -and $Property -notin $EndProperties) {
|
||||
$Property
|
||||
}
|
||||
}
|
||||
$EndProperties
|
||||
)
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
function Remove-GPOZaurrLinkEmptyOU {
|
||||
[cmdletbinding(SupportsShouldProcess)]
|
||||
param(
|
||||
[alias('ForestName')][string] $Forest,
|
||||
[string[]] $ExcludeDomains,
|
||||
[alias('Domain', 'Domains')][string[]] $IncludeDomains,
|
||||
[System.Collections.IDictionary] $ExtendedForestInformation,
|
||||
|
||||
[string[]] $ExcludeOrganizationalUnit,
|
||||
|
||||
[int] $LimitProcessing = [int32]::MaxValue
|
||||
)
|
||||
|
||||
$Processed = 0
|
||||
$OrganizationalUnits = Get-GPOZaurrOrganizationalUnit -Forest $Forest -IncludeDomains $IncludeDomains -ExcludeDomains $ExcludeDomains -ExtendedForestInformation $ExtendedForestInformation -Option Unlink
|
||||
foreach ($OU in $OrganizationalUnits) {
|
||||
if ($OU.Status -contains 'Unlink GPO') {
|
||||
if ($OU.OrganizationalUnit -in $ExcludeOrganizationalUnit) {
|
||||
Write-Verbose "Remove-GPOZaurrLinkEmptyOU - Processing $($OU.Organizationalunit) was skipped as it's excluded."
|
||||
continue
|
||||
}
|
||||
Write-Verbose "Remove-GPOZaurrLinkEmptyOU - Processing $($OU.Organizationalunit) found OU with GPOs to unlink"
|
||||
$Processed++
|
||||
foreach ($GPO in $OU.GPO) {
|
||||
Write-Verbose "Remove-GPOZaurrLinkEmptyOU - Removing $($GPO.DisplayName) link from $($OU.Organizationalunit)"
|
||||
try {
|
||||
Remove-GPLink -ErrorAction Stop -Guid $GPO.GUID -Domain $GPO.DomainName -Target $OU.Organizationalunit
|
||||
} catch {
|
||||
Write-Warning "Remove-GPOZaurrLinkEmptyOU - Error removing link of $($GPO.DisplayName) from $($OU.OrganizationalUnit) error: $($_.Exception.Message)"
|
||||
}
|
||||
}
|
||||
if ($Processed -ge $LimitProcessing) {
|
||||
Write-Verbose "Remove-GPOZaurrLinkEmptyOU - Limit processing hit, stopping."
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -38,6 +38,9 @@
|
||||
.PARAMETER LimitProcessing
|
||||
Allows to specify maximum number of items that will be fixed in a single run. It doesn't affect amount of GPOs processed
|
||||
|
||||
.PARAMETER Force
|
||||
Pushes new owner regardless if it's already set or not
|
||||
|
||||
.EXAMPLE
|
||||
Set-GPOZaurrOwner -Type All -Verbose -WhatIf -LimitProcessing 2
|
||||
|
||||
@@ -72,11 +75,16 @@
|
||||
[Parameter(ParameterSetName = 'Named')]
|
||||
[string] $Principal,
|
||||
|
||||
[Parameter(ParameterSetName = 'Type')]
|
||||
[Parameter(ParameterSetName = 'Named')]
|
||||
[switch] $SkipSysvol,
|
||||
|
||||
[Parameter(ParameterSetName = 'Type')]
|
||||
[Parameter(ParameterSetName = 'Named')]
|
||||
[int] $LimitProcessing = [int32]::MaxValue,
|
||||
|
||||
[Parameter(ParameterSetName = 'Type')]
|
||||
[Parameter(ParameterSetName = 'Named')]
|
||||
[switch] $Force
|
||||
)
|
||||
Begin {
|
||||
|
||||
@@ -19,15 +19,6 @@
|
||||
|
||||
# GPOZaurr
|
||||
|
||||
## Table of Contents
|
||||
|
||||
- [GPOZaurr](#gpozaurr)
|
||||
- [Table of Contents](#table-of-contents)
|
||||
- [Installing](#installing)
|
||||
- [Updating](#updating)
|
||||
- [Resources](#resources)
|
||||
- [Changelog](#changelog)
|
||||
|
||||
## Installing
|
||||
|
||||
GPOZaurr requires `RSAT` installed to provide results. If you don't have them you can install them as below. Keep in mind it also installs GUI tools so it shouldn't be installed on user workstations.
|
||||
@@ -64,205 +55,237 @@ To understand the usage I've created blog post you may find useful
|
||||
|
||||
## Changelog
|
||||
|
||||
- 0.0.129
|
||||
- Added `Get-GPOZaurrOrganizationalUnit` and added `GPOOrganizationalUnit` in `Invoke-GPOZaurr` (preview)
|
||||
- Added `Remove-GPOZaurrLinkEmptyOU` which allows removing links from Empty OUs (preview)
|
||||
- Small update to parameter sets for `Set-GPOZaurrOwner`
|
||||
- 0.0.128 - 2021.05.26
|
||||
- ☑ Improved `Invoke-GPOZaurrContent` - type `PublicKeyPoliciesCertificates` - added more certificate information
|
||||
- ☑ Improved `Invoke-GPOZaurr` - type `GPOAnalysis` - added more certificate information
|
||||
- 0.0.128 Alpha 1 - 2021.05.17
|
||||
- 🐛 Fixes errors when normalizing properties [#17](https://github.com/EvotecIT/GPOZaurr/issues/17)
|
||||
- 0.0.127 - 2021.04.15
|
||||
- ☑ Improved `Invoke-GPOZaurr`
|
||||
- ☑ Report `GPOList` - moved description closer to statuses
|
||||
- ☑ Improved `Get-GPOZaurr` - moved description closer to statuses
|
||||
- 0.0.126 - 2021.04.12
|
||||
- ☑ Improved `Invoke-GPOZaurr`
|
||||
- ☑ Report `GPOBlockedInheritance` - hidden DistinguishedName, fixed some small typos
|
||||
- 0.0.125 - 2021.04.11
|
||||
- ☑ Improved `Invoke-GPOZaurr`
|
||||
- ☑ Report `GPOBlockedInheritance` - small fixes
|
||||
- 0.0.124 - 2021.04.11
|
||||
- ☑ Added `SearchBuilder` to all tables
|
||||
- ☑ Automatically joins arrays in tables in `Invoke-GPOZaurr`
|
||||
- ☑ Improved `Get-GPOZaurrInheritance` with Exclusions and some help information
|
||||
- ☑ Improved `Invoke-GPOZaurr` with some Exclusions
|
||||
- ☑ Improved `Invoke-GPOZaurr`
|
||||
- 🔥 Report `GPOBlockedInheritance` - heavily improved functionality and data
|
||||
- 0.0.123 - 2021.03.21
|
||||
- ☑ Fixes `Get-GPOZaurrLinkSummary`
|
||||
- 0.0.122 - 2021.02.11
|
||||
- ☑ Improved `Invoke-GPOZaurr`
|
||||
- ☑ Report `GPOAnalysis` - added `WindowsFirewallRules`,`WindowsFirewallProfiles`,`WindowsFirewallConnectionSecurityAuthentication`,`WindowsFirewallConnectionSecurityRules`
|
||||
- ☑ Improved `Invoke-GPOZaurrContent` as mentioned above for `GPOAnalysis`
|
||||
- 0.0.121 - 2021.02.10
|
||||
- [x] Improvement to `Get-GPOZaurr` - added description [#13](https://github.com/EvotecIT/GPOZaurr/issues/13)
|
||||
- [x] Improvement to `Invoke-GPOZaurr -Type GPOList` - added description [#13](https://github.com/EvotecIT/GPOZaurr/issues/13)
|
||||
- [x] Improved `Invoke-GPOZaurr`
|
||||
- [x] Report GPOAnalysis - added `FolderRedirection`
|
||||
- [x] Report GPOAnalysis - renamed `FolderRedirection` to `FolderRedirectionPolicy`
|
||||
- [x] Improved `Invoke-GPOZaurrContent` as mentioned above for `GPOAnalysis`
|
||||
- ☑ Improvement to `Get-GPOZaurr` - added description [#13](https://github.com/EvotecIT/GPOZaurr/issues/13)
|
||||
- ☑ Improvement to `Invoke-GPOZaurr -Type GPOList` - added description [#13](https://github.com/EvotecIT/GPOZaurr/issues/13)
|
||||
- ☑ Improved `Invoke-GPOZaurr`
|
||||
- ☑ Report GPOAnalysis - added `FolderRedirection`
|
||||
- ☑ Report GPOAnalysis - renamed `FolderRedirection` to `FolderRedirectionPolicy`
|
||||
- ☑ Improved `Invoke-GPOZaurrContent` as mentioned above for `GPOAnalysis`
|
||||
- 0.0.120 - 2021.02.10
|
||||
- [x] Improvement to `Get-GPOZaurr` to warn if there is potential issue with EMPTY (which can happen on non-english system)
|
||||
- [x] In such case GPOZaurr will asses EMPTY or not using old method which doesn't detect all EMPTY cases but shouldn't provide false positives
|
||||
- ☑ Improvement to `Get-GPOZaurr` to warn if there is potential issue with EMPTY (which can happen on non-english system)
|
||||
- ☑ In such case GPOZaurr will asses EMPTY or not using old method which doesn't detect all EMPTY cases but shouldn't provide false positives
|
||||
- 0.0.119
|
||||
- Broken release - weird
|
||||
- 0.0.118 - 2021.02.09
|
||||
- [x] Added information where the report is saved
|
||||
- [x] Small improvement to `Get-GPOZaurr` to exlicitly define variable types
|
||||
- ☑ Added information where the report is saved
|
||||
- ☑ Small improvement to `Get-GPOZaurr` to exlicitly define variable types
|
||||
- 0.0.117 - 2021.02.09
|
||||
- [x] Small fix to `Get-GPOZaurr` to exclude GPOList.xml which is used in offline mode by `Save-GPOZaurrFiles`
|
||||
- ☑ Small fix to `Get-GPOZaurr` to exclude GPOList.xml which is used in offline mode by `Save-GPOZaurrFiles`
|
||||
- 0.0.116 - 2021.02.08
|
||||
- [x] Improved `Remove-GPOZaurrBroken` to handle ObjectClass problem, and removed reduntant check
|
||||
- ☑ Improved `Remove-GPOZaurrBroken` to handle ObjectClass problem, and removed reduntant check
|
||||
- 0.0.115 - 2021.02.07
|
||||
- [x] Improved `Invoke-GPOZaurr`
|
||||
- [x] `GPOList` - clarified some texts, changed 7 days to 30 days as default
|
||||
- [x] `NetLogonPermissions` - fixed missing text
|
||||
- [x] Fixes `Get-GPOZaurrNetLogon` error on empty Owner - [#9](https://github.com/EvotecIT/GPOZaurr/issues/9)
|
||||
- ☑ Improved `Invoke-GPOZaurr`
|
||||
- ☑ `GPOList` - clarified some texts, changed 7 days to 30 days as default
|
||||
- ☑ `NetLogonPermissions` - fixed missing text
|
||||
- ☑ Fixes `Get-GPOZaurrNetLogon` error on empty Owner - [#9](https://github.com/EvotecIT/GPOZaurr/issues/9)
|
||||
- 0.0.114 - 2021.01.27
|
||||
- [x] Improved `Invoke-GPOZaurr`
|
||||
- [x] HTML now uses offline mode by default (no CDN) - increase in size of HTML up to 3MB
|
||||
- [x] Using Online switch forces use of CDN - smaller files. For example `Invoke-GPOZaurr -Type GPOList -Online`
|
||||
- ☑ Improved `Invoke-GPOZaurr`
|
||||
- ☑ HTML now uses offline mode by default (no CDN) - increase in size of HTML up to 3MB
|
||||
- ☑ Using Online switch forces use of CDN - smaller files. For example `Invoke-GPOZaurr -Type GPOList -Online`
|
||||
- [ ] Improved `Invoke-GPOZaurrSupport`
|
||||
- [x] HTML now uses offline mode by default (no CDN) - increase in size of HTML up to 3MB
|
||||
- [x] Using Online switch forces use of CDN - smaller files. For example `Invoke-GPOZaurrSupport -Online`
|
||||
- [x] Removed parameter Offline, added parameter Online
|
||||
- [x] The cmdlet is not really production ready. It's work in progress
|
||||
- ☑ HTML now uses offline mode by default (no CDN) - increase in size of HTML up to 3MB
|
||||
- ☑ Using Online switch forces use of CDN - smaller files. For example `Invoke-GPOZaurrSupport -Online`
|
||||
- ☑ Removed parameter Offline, added parameter Online
|
||||
- ☑ The cmdlet is not really production ready. It's work in progress
|
||||
- 0.0.113 - 2021.01.25
|
||||
- [x] Improved `Invoke-GPOZaurr`
|
||||
- [x] Report GPOAnalysis - added WindowsTimeService
|
||||
- [x] Improved `Invoke-GPOZaurrContent`
|
||||
- [x] Added `WindowsTimeService` type
|
||||
- ☑ Improved `Invoke-GPOZaurr`
|
||||
- ☑ Report GPOAnalysis - added WindowsTimeService
|
||||
- ☑ Improved `Invoke-GPOZaurrContent`
|
||||
- ☑ Added `WindowsTimeService` type
|
||||
- 0.0.112 - 2021.01.25
|
||||
- [x] Improved `Invoke-GPOZaurr`
|
||||
- ☑ Improved `Invoke-GPOZaurr`
|
||||
- 0.0.111 - 2021.01.24
|
||||
- [x] Improved `Invoke-GPOZaurr`
|
||||
- ☑ Improved `Invoke-GPOZaurr`
|
||||
- 0.0.110 - 2021.01.22
|
||||
- [x] Improved `Invoke-GPOZaurr`
|
||||
- ☑ Improved `Invoke-GPOZaurr`
|
||||
- 0.0.109 - 2021.01.11
|
||||
- [x] Improved `Invoke-GPOZaurr`
|
||||
- ☑ Improved `Invoke-GPOZaurr`
|
||||
- 0.0.108 - 2021.01.11
|
||||
- [x] Improved `Invoke-GPOZaurr`
|
||||
- [x] Improved `GPOConsistency`
|
||||
- ☑ Improved `Invoke-GPOZaurr`
|
||||
- ☑ Improved `GPOConsistency`
|
||||
- 0.0.107 - 2021.01.11
|
||||
- [x] Improved `Invoke-GPOZaurr`
|
||||
- ☑ Improved `Invoke-GPOZaurr`
|
||||
- 0.0.106 - 2021.01.11
|
||||
- [x] Improved `Invoke-GPOZaurrContent`
|
||||
- ☑ Improved `Invoke-GPOZaurrContent`
|
||||
- 0.0.105 - 2021.01.05
|
||||
- [x] Improved `Get-GPOZaurr`
|
||||
- [x] Improved report `GPOBrokenLink`
|
||||
- ☑ Improved `Get-GPOZaurr`
|
||||
- ☑ Improved report `GPOBrokenLink`
|
||||
- 0.0.104 - 2021.01.04
|
||||
- [x] Improved `Get-GPOZaurrBrokenLink`
|
||||
- [x] Improved `Repair-GPOZaurrBrokenLink`
|
||||
- [x] Improved `Get-GPOZaurr`
|
||||
- [x] Improved report `GPOBrokenLink`
|
||||
- ☑ Improved `Get-GPOZaurrBrokenLink`
|
||||
- ☑ Improved `Repair-GPOZaurrBrokenLink`
|
||||
- ☑ Improved `Get-GPOZaurr`
|
||||
- ☑ Improved report `GPOBrokenLink`
|
||||
- 0.0.103 - 2021.01.04
|
||||
- [x] Improved `Get-GPOZaurr`
|
||||
- [x] Added new report `GPOBrokenLink`
|
||||
- [x] Added `Get-GPOZaurrBrokenLink`
|
||||
- [x] Added `Repair-GPOZaurrBrokenLink`
|
||||
- ☑ Improved `Get-GPOZaurr`
|
||||
- ☑ Added new report `GPOBrokenLink`
|
||||
- ☑ Added `Get-GPOZaurrBrokenLink`
|
||||
- ☑ Added `Repair-GPOZaurrBrokenLink`
|
||||
- 0.0.102 - 2021.01.02
|
||||
- [x] Improved `Get-GPOZaurrLink`
|
||||
- [x] Supports all links across forest
|
||||
- [x] Renamed Linked validate set from `Other` to `OrganizationalUnit`
|
||||
- [x] Improved `Get-GPOZaurrLinkSummary`
|
||||
- [x] Improved/BugFix `Get-GPOZaurr` to properly detect linked GPOs in sites/cross-domain
|
||||
- [x] Improved `Invoke-GPOZaurrPermission`
|
||||
- [x] Renamed Linked validate set from `Other` to `OrganizationalUnit`
|
||||
- [x] Improved `Invoke-GPOZaurr`
|
||||
- [x] Added `GPOLinks` basic list
|
||||
- ☑ Improved `Get-GPOZaurrLink`
|
||||
- ☑ Supports all links across forest
|
||||
- ☑ Renamed Linked validate set from `Other` to `OrganizationalUnit`
|
||||
- ☑ Improved `Get-GPOZaurrLinkSummary`
|
||||
- ☑ Improved/BugFix `Get-GPOZaurr` to properly detect linked GPOs in sites/cross-domain
|
||||
- ☑ Improved `Invoke-GPOZaurrPermission`
|
||||
- ☑ Renamed Linked validate set from `Other` to `OrganizationalUnit`
|
||||
- ☑ Improved `Invoke-GPOZaurr`
|
||||
- ☑ Added `GPOLinks` basic list
|
||||
- 0.0.101 - 23.12.2020
|
||||
- [x] Improved `Get-GPOZaurrBroken`
|
||||
- [x] It now detects `ObjectClass Issue`
|
||||
- [x] Heavily improved performance
|
||||
- [x] Removed some useless properties for this particular cmdlet
|
||||
- [x] All states: `Not available on SYSVOL`, `Not available in AD`, `Exists`, `Permissions Issue`, `ObjectClass Issue`
|
||||
- [x] Improved help
|
||||
- [x] Improved `Remove-GPOZaurrBroken`
|
||||
- [x] It now deals with `ObjectClass Issue`
|
||||
- [x] Heavily improved performance
|
||||
- [x] Removed some useless properties for this particular cmdlet
|
||||
- [x] Now requires manual type insert AD, SYSVOL or ObjectClass (or all of them). Before it was auto using AD/SYSVOL.
|
||||
- [x] Improved help
|
||||
- [x] Improved `Invoke-GPOZaurr`
|
||||
- [x] Type `GPOList`
|
||||
- [x] Renamed `GPOOrphans` to `GPOBroken`
|
||||
- [x] Improved `GPOBroken` with `ObjectClass issue`
|
||||
- ☑ Improved `Get-GPOZaurrBroken`
|
||||
- ☑ It now detects `ObjectClass Issue`
|
||||
- ☑ Heavily improved performance
|
||||
- ☑ Removed some useless properties for this particular cmdlet
|
||||
- ☑ All states: `Not available on SYSVOL`, `Not available in AD`, `Exists`, `Permissions Issue`, `ObjectClass Issue`
|
||||
- ☑ Improved help
|
||||
- ☑ Improved `Remove-GPOZaurrBroken`
|
||||
- ☑ It now deals with `ObjectClass Issue`
|
||||
- ☑ Heavily improved performance
|
||||
- ☑ Removed some useless properties for this particular cmdlet
|
||||
- ☑ Now requires manual type insert AD, SYSVOL or ObjectClass (or all of them). Before it was auto using AD/SYSVOL.
|
||||
- ☑ Improved help
|
||||
- ☑ Improved `Invoke-GPOZaurr`
|
||||
- ☑ Type `GPOList`
|
||||
- ☑ Renamed `GPOOrphans` to `GPOBroken`
|
||||
- ☑ Improved `GPOBroken` with `ObjectClass issue`
|
||||
- 0.0.100 - 21.12.2020
|
||||
- [x] Improved `Invoke-GPOZaurr`
|
||||
- [x] Type `GPOPermissionsRead`
|
||||
- [x] Type `GPOPermissions`
|
||||
- ☑ Improved `Invoke-GPOZaurr`
|
||||
- ☑ Type `GPOPermissionsRead`
|
||||
- ☑ Type `GPOPermissions`
|
||||
- 0.0.99 - 13.12.2020
|
||||
- [x] Improved `Invoke-GPOZaurr`
|
||||
- [x] Type `GPOList` - require GPO to be 7 days old for deletion to be proposed
|
||||
- [x] Type `GPOPermissions` - one stop for permissions
|
||||
- [x] Allows Steps to be chosen via their menu and out-of-order
|
||||
- [x] Improved `Remove-GPOZaurr` - added `RequireDays` parameter to prevent deletion of just modified GPOs
|
||||
- [x] Added `Get-GPOZaurrPermissionAnalysis`
|
||||
- [x] Added `Repair-GPOZaurrPermission`
|
||||
- ☑ Improved `Invoke-GPOZaurr`
|
||||
- ☑ Type `GPOList` - require GPO to be 7 days old for deletion to be proposed
|
||||
- ☑ Type `GPOPermissions` - one stop for permissions
|
||||
- ☑ Allows Steps to be chosen via their menu and out-of-order
|
||||
- ☑ Improved `Remove-GPOZaurr` - added `RequireDays` parameter to prevent deletion of just modified GPOs
|
||||
- ☑ Added `Get-GPOZaurrPermissionAnalysis`
|
||||
- ☑ Added `Repair-GPOZaurrPermission`
|
||||
- 0.0.98 - 10.12.2020
|
||||
- [x] Improved `Invoke-GPOZaurr`
|
||||
- [x] Type `GPOList` - fixed unexpected ending of cmdlet when error occurs (for example deleted GPO while script is running) which could impact results
|
||||
- [x] Other types - small color adjustment
|
||||
- [x] Fixed/Improved `Get-GPOZaurr` - fixed unexpected ending of cmdlet when error occurs (for example deleted GPO while script is running), improved code base
|
||||
- [x] Improved `Invoke-GPOZaurrSupport`
|
||||
- ☑ Improved `Invoke-GPOZaurr`
|
||||
- ☑ Type `GPOList` - fixed unexpected ending of cmdlet when error occurs (for example deleted GPO while script is running) which could impact results
|
||||
- ☑ Other types - small color adjustment
|
||||
- ☑ Fixed/Improved `Get-GPOZaurr` - fixed unexpected ending of cmdlet when error occurs (for example deleted GPO while script is running), improved code base
|
||||
- ☑ Improved `Invoke-GPOZaurrSupport`
|
||||
- 0.0.97 - 07.12.2020
|
||||
- [x] Improved `Invoke-GPOZaurr`
|
||||
- [x] Type `GPOList` - added more data, did small reorganization
|
||||
- ☑ Improved `Invoke-GPOZaurr`
|
||||
- ☑ Type `GPOList` - added more data, did small reorganization
|
||||
- 0.0.96 - 07.12.2020
|
||||
- [x] Improved `Invoke-GPOZaurr`
|
||||
- [x] Type `GPOList` - added more data, added Optimization Step
|
||||
- [x] Added `Set-GPOZaurrStatus`
|
||||
- [x] Added `Optimize-GPOZaurr`
|
||||
- [x] Fixed `Invoke-GPOZaurrPermission` which would not remove permission due to internal changes earlier on
|
||||
- [x] Small change to `Backup-GPOZaurr`
|
||||
- [x] Added support for `Disabled`. It's now possbile to backup `All` (default), `Empty`,`Unlinked`,`Disabled` or a mix of them
|
||||
- [x] Removed useless `GPOPath` parameter
|
||||
- ☑ Improved `Invoke-GPOZaurr`
|
||||
- ☑ Type `GPOList` - added more data, added Optimization Step
|
||||
- ☑ Added `Set-GPOZaurrStatus`
|
||||
- ☑ Added `Optimize-GPOZaurr`
|
||||
- ☑ Fixed `Invoke-GPOZaurrPermission` which would not remove permission due to internal changes earlier on
|
||||
- ☑ Small change to `Backup-GPOZaurr`
|
||||
- ☑ Added support for `Disabled`. It's now possbile to backup `All` (default), `Empty`,`Unlinked`,`Disabled` or a mix of them
|
||||
- ☑ Removed useless `GPOPath` parameter
|
||||
- 0.0.95 - 04.12.2020
|
||||
- [x] Fix for too big int - [#4](https://github.com/EvotecIT/GPOZaurr/issues/4) - tnx neztach
|
||||
- [x] Improved `Invoke-GPOZaurr`
|
||||
- [x] Type `GPOList` - added ability for Exclusions
|
||||
- [x] All other types, small improvements
|
||||
- [x] Added HideSteps, ShowError, ShowWarning -> Disabled Warnings/Errors by default as they tend to show too much information
|
||||
- [x] Improved `Remove-GPOZaurr` - added Exclusions
|
||||
- ☑ Fix for too big int - [#4](https://github.com/EvotecIT/GPOZaurr/issues/4) - tnx neztach
|
||||
- ☑ Improved `Invoke-GPOZaurr`
|
||||
- ☑ Type `GPOList` - added ability for Exclusions
|
||||
- ☑ All other types, small improvements
|
||||
- ☑ Added HideSteps, ShowError, ShowWarning -> Disabled Warnings/Errors by default as they tend to show too much information
|
||||
- ☑ Improved `Remove-GPOZaurr` - added Exclusions
|
||||
- 0.0.93 - 03.12.2020
|
||||
- [x] Improved `Invoke-GPOZaurr`
|
||||
- [x] Type `GPOList` reverted charts colors for entries to match colors
|
||||
- ☑ Improved `Invoke-GPOZaurr`
|
||||
- ☑ Type `GPOList` reverted charts colors for entries to match colors
|
||||
- [ ] Added `Skip-GroupPolicy` to use within `Invoke-GPOZaurr`
|
||||
- [x] Improved `Invoke-GPOZaurr` with basic support for Exclusions
|
||||
- [x] Improved `Get-GPOZaurr` with basic support for Exclusions
|
||||
- [x] Improved `Remove-GPOZaurrPermission` error handling
|
||||
- ☑ Improved `Invoke-GPOZaurr` with basic support for Exclusions
|
||||
- ☑ Improved `Get-GPOZaurr` with basic support for Exclusions
|
||||
- ☑ Improved `Remove-GPOZaurrPermission` error handling
|
||||
- 0.0.92 - 01.12.2020
|
||||
- [x] Improved `Invoke-GPOZaurrSupport`
|
||||
- [x] Improved `Invoke-GPOZaurr`
|
||||
- [x] Type `GPOList` improved with more data, more problems and clearer information
|
||||
- [x] Improved `Remove-GPOZaurr`
|
||||
- [x] Added ability do remove disabed GPO
|
||||
- [x] Improved `Get-GPOZaurr` detecting more issues, delivering more data
|
||||
- ☑ Improved `Invoke-GPOZaurrSupport`
|
||||
- ☑ Improved `Invoke-GPOZaurr`
|
||||
- ☑ Type `GPOList` improved with more data, more problems and clearer information
|
||||
- ☑ Improved `Remove-GPOZaurr`
|
||||
- ☑ Added ability do remove disabed GPO
|
||||
- ☑ Improved `Get-GPOZaurr` detecting more issues, delivering more data
|
||||
- 0.0.91 - 24.11.2020
|
||||
- [x] Improves `Invoke-GPOZaurr` (WIP)
|
||||
- [x] Improve Type `GPOPermissionsUnknown`
|
||||
- ☑ Improves `Invoke-GPOZaurr` (WIP)
|
||||
- ☑ Improve Type `GPOPermissionsUnknown`
|
||||
- 0.0.90 - 23.11.2020
|
||||
- [x] Improves `Invoke-GPOZaurr` (WIP)
|
||||
- [x] Improves Type `GPODuplicates`
|
||||
- [x] Fix for chart color to be RED
|
||||
- [x] Add Type `GPOPermissionsUnknown`
|
||||
- [x] Improves logic for Data with 0/1 element
|
||||
- [x] Improves `Remove-GPOZaurrDuplicateObject` - removed `Confirm` requirement
|
||||
- [x] Improves `Get-GPOZaurrNetLogon` with more verbose
|
||||
- [x] Improves `Repair-GPOZaurrNetLogonOwner` with more verbose and fix for `LimitProcessing`
|
||||
- ☑ Improves `Invoke-GPOZaurr` (WIP)
|
||||
- ☑ Improves Type `GPODuplicates`
|
||||
- ☑ Fix for chart color to be RED
|
||||
- ☑ Add Type `GPOPermissionsUnknown`
|
||||
- ☑ Improves logic for Data with 0/1 element
|
||||
- ☑ Improves `Remove-GPOZaurrDuplicateObject` - removed `Confirm` requirement
|
||||
- ☑ Improves `Get-GPOZaurrNetLogon` with more verbose
|
||||
- ☑ Improves `Repair-GPOZaurrNetLogonOwner` with more verbose and fix for `LimitProcessing`
|
||||
- 0.0.89 - 22.11.2020
|
||||
- [x] Small update `Add-GPOZaurrPermission`
|
||||
- [x] Improves `Invoke-GPOZaurr` (WIP)
|
||||
- [x] Added Type `GPOPermissionsAdministrative`
|
||||
- ☑ Small update `Add-GPOZaurrPermission`
|
||||
- ☑ Improves `Invoke-GPOZaurr` (WIP)
|
||||
- ☑ Added Type `GPOPermissionsAdministrative`
|
||||
- 0.0.88 - 18.11.2020
|
||||
- [x] Fix for `Add-GPOZaurrPermission`
|
||||
- ☑ Fix for `Add-GPOZaurrPermission`
|
||||
- 0.0.87 - 18.11.2020
|
||||
- [x] Improve error handling `Remove-GPOZaurrBroken`
|
||||
- ☑ Improve error handling `Remove-GPOZaurrBroken`
|
||||
- 0.0.86 - 18.11.2020
|
||||
- [x] Improve error handling `Remove-GPOZaurrBroken`
|
||||
- ☑ Improve error handling `Remove-GPOZaurrBroken`
|
||||
- 0.0.85 - 17.11.2020
|
||||
- [x] Improves `Invoke-GPOZaurr` (WIP)
|
||||
- [x] Split `NetLogonPermissions` into `NetLogonPermissions` and `NetLogonOwners`
|
||||
- [x] Improved type `NetLogonPermissions`
|
||||
- [x] Improved type `NetLogonOwners`
|
||||
- [x] Improves `Get-GPOZaurrFiles`
|
||||
- [x] Improves `Get-GPOZaurrNetLogon`
|
||||
- [x] Fix for `Get-GPOZaurrNetLogon`
|
||||
- ☑ Improves `Invoke-GPOZaurr` (WIP)
|
||||
- ☑ Split `NetLogonPermissions` into `NetLogonPermissions` and `NetLogonOwners`
|
||||
- ☑ Improved type `NetLogonPermissions`
|
||||
- ☑ Improved type `NetLogonOwners`
|
||||
- ☑ Improves `Get-GPOZaurrFiles`
|
||||
- ☑ Improves `Get-GPOZaurrNetLogon`
|
||||
- ☑ Fix for `Get-GPOZaurrNetLogon`
|
||||
- 0.0.84 - 16.11.2020
|
||||
- [x] Improves `Invoke-GPOZaurr` (WIP)
|
||||
- [x] Type `NetLogonPermissions`
|
||||
- [x] Fix for `Get-GPOZaurrNetLogon`
|
||||
- ☑ Improves `Invoke-GPOZaurr` (WIP)
|
||||
- ☑ Type `NetLogonPermissions`
|
||||
- ☑ Fix for `Get-GPOZaurrNetLogon`
|
||||
- 0.0.83 - 14.11.2020
|
||||
- [x] Improves `Invoke-GPOZaurr` (WIP)
|
||||
- [x] Fix for wrong ActionRequired count
|
||||
- ☑ Improves `Invoke-GPOZaurr` (WIP)
|
||||
- ☑ Fix for wrong ActionRequired count
|
||||
- 0.0.82 - 14.11.2020
|
||||
- [x] Added `Get-GPOZaurrPermissionIssue` to detect permission issue with no rights
|
||||
- [x] Improves `Invoke-GPOZaurr` (WIP)
|
||||
- [x] Type `GPOPermissionsRead` improved detection of problems with low permissions
|
||||
- ☑ Added `Get-GPOZaurrPermissionIssue` to detect permission issue with no rights
|
||||
- ☑ Improves `Invoke-GPOZaurr` (WIP)
|
||||
- ☑ Type `GPOPermissionsRead` improved detection of problems with low permissions
|
||||
- 0.0.81 - 12.11.2020
|
||||
- [x] Fix for `Set-GPOZaurrOwner` in case of missing permissions to not throw errors
|
||||
- [x] Improves `Invoke-GPOZaurr` (WIP)
|
||||
- [x] Type `GPOPermissionsRead` added
|
||||
- ☑ Fix for `Set-GPOZaurrOwner` in case of missing permissions to not throw errors
|
||||
- ☑ Improves `Invoke-GPOZaurr` (WIP)
|
||||
- ☑ Type `GPOPermissionsRead` added
|
||||
- 0.0.80 - 12.11.2020
|
||||
- [x] Improves `Invoke-GPOZaurr` (WIP)
|
||||
- [x] Type `GPOOrphans` clearer options, updated texts, split per domain
|
||||
- [x] Type `GPOOwners` clearer options, updated texts, split per domain
|
||||
- [x] Improves `Add-GPOZaurrPermission`
|
||||
- [x] Fixes LimitProcessing to work correctly
|
||||
- [x] Added `All` to process all GPOs
|
||||
- [x] Fixes `Remove-GPOZaurrPermission`
|
||||
- [x] Improves `Set-GPOZaurrOwner`
|
||||
- [x] Added `Force` to force `GPO Owner` to any principal (normally only Domain Admins)
|
||||
- ☑ Improves `Invoke-GPOZaurr` (WIP)
|
||||
- ☑ Type `GPOOrphans` clearer options, updated texts, split per domain
|
||||
- ☑ Type `GPOOwners` clearer options, updated texts, split per domain
|
||||
- ☑ Improves `Add-GPOZaurrPermission`
|
||||
- ☑ Fixes LimitProcessing to work correctly
|
||||
- ☑ Added `All` to process all GPOs
|
||||
- ☑ Fixes `Remove-GPOZaurrPermission`
|
||||
- ☑ Improves `Set-GPOZaurrOwner`
|
||||
- ☑ Added `Force` to force `GPO Owner` to any principal (normally only Domain Admins)
|
||||
- 0.0.79 - 10.11.2020
|
||||
- Improved `Invoke-GPOZaurr` - type `GPOOrphans`
|
||||
- 0.0.78 - 10.11.2020
|
||||
|
||||
Reference in New Issue
Block a user