This commit is contained in:
Przemyslaw Klys
2020-06-28 10:08:09 +02:00
parent 27bd83eaba
commit 97ffc8bfd5
12 changed files with 154 additions and 67 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
Import-Module "$PSScriptRoot\..\GPoZaurr.psd1" -Force Import-Module "$PSScriptRoot\..\GPoZaurr.psd1" -Force
$Output = Find-GPO #-NoTranslation $Output = Invoke-GPOZaurr #-NoTranslation
New-HTML { New-HTML {
foreach ($GPOCategory in $Output.Keys) { foreach ($GPOCategory in $Output.Keys) {
@@ -0,0 +1,25 @@
Import-Module "$PSScriptRoot\..\GPoZaurr.psd1" -Force
# Use Save-GPOZaurrFiles -GPOPath $ENV:USERPROFILE\Desktop\GPOExport
$OutputTranslation = Invoke-GPOZaurr -GPOPath 'C:\Support\GitHub\GpoZaurr\Ignore\GPOExport'
$OutputTranslation | Format-Table
$Output = Invoke-GPOZaurr -GPOPath 'C:\Support\GitHub\GpoZaurr\Ignore\GPOExport' -NoTranslation
$Output | Format-Table *
#$Output.LugsSettings.LocalUsersAndGroups | Format-List *
$GPOEntry = $Output.LugsSettings.LocalUsersAndGroups[0]
$CreateGPO = @{}
foreach ($User in $GPOEntry.User) {
# $User | Format-Table
# $User.Properties | Format-Table
}
foreach ($Group in $GPOEntry.Group) {
#$Group | Format-Table
$Group.Properties | Format-Table
$Group.Properties.Members | Format-Table
}
+1 -1
View File
@@ -2,5 +2,5 @@
# Use Save-GPOZaurrFiles -GPOPath $ENV:USERPROFILE\Desktop\GPOExport # Use Save-GPOZaurrFiles -GPOPath $ENV:USERPROFILE\Desktop\GPOExport
$Output = Find-GPO -GPOPath 'C:\Support\GitHub\GpoZaurr\Ignore\GPOExportTest' -NoTranslation $Output = Invoke-GPOZaurr -GPOPath 'C:\Support\GitHub\GpoZaurr\Ignore\GPOExportTest' -NoTranslation
$Output | Format-Table * $Output | Format-Table *
@@ -2,7 +2,7 @@
# This is purely for building GPO Dictionary, mostly for development needs to help asses what is there # This is purely for building GPO Dictionary, mostly for development needs to help asses what is there
$Output = Find-GPO -GPOPath 'C:\Support\GitHub\GpoZaurr\Ignore\GPOExportTest' -NoTranslation $Output = Invoke-GPOZaurr -GPOPath 'C:\Support\GitHub\GpoZaurr\Ignore\GPOExportTest' -NoTranslation
#$Output | Format-Table * #$Output | Format-Table *
$LookingFor = $Output | Select-GPOTranslation -Category 'SecuritySettings' -Settings 'UserRightsAssignment' $LookingFor = $Output | Select-GPOTranslation -Category 'SecuritySettings' -Settings 'UserRightsAssignment'
+8 -4
View File
@@ -2,16 +2,20 @@
# Use Save-GPOZaurrFiles -GPOPath $ENV:USERPROFILE\Desktop\GPOExport # Use Save-GPOZaurrFiles -GPOPath $ENV:USERPROFILE\Desktop\GPOExport
$Output = Find-GPO -GPOPath 'C:\Support\GitHub\GpoZaurr\Ignore\GPOExportTest' #-NoTranslation $Output = Invoke-GPOZaurr -GPOPath 'C:\Support\GitHub\GpoZaurr\Ignore\GPOExportTest' #-NoTranslation
$Output | Format-Table * $Output | Format-Table *
New-HTML { New-HTML {
foreach ($GPOCategory in $Output.Keys) { foreach ($GPOCategory in $Output.Keys) {
New-HTMLTab -Name $GPOCategory { New-HTMLTab -Name $GPOCategory {
foreach ($GpoSettings in $Output.$GPOCategory.Keys) { if ($Output["$GPOCategory"] -is [System.Collections.IDictionary]) {
New-HTMLTab -Name $GpoSettings { foreach ($GpoSettings in $Output["$GPOCategory"].Keys) {
New-HTMLTable -DataTable $Output[$GPOCategory][$GpoSettings] -ScrollX -DisablePaging -AllProperties -Title $Key New-HTMLTab -Name $GpoSettings {
New-HTMLTable -DataTable $Output[$GPOCategory][$GpoSettings] -ScrollX -DisablePaging -AllProperties -Title $Key
}
} }
} else {
New-HTMLTable -DataTable $Output[$GPOCategory] -ScrollX -DisablePaging -AllProperties -Title $Key
} }
} }
} }
+2 -2
View File
@@ -1,11 +1,11 @@
@{ @{
AliasesToExport = '' AliasesToExport = 'Find-GPO'
Author = 'Przemyslaw Klys' Author = 'Przemyslaw Klys'
CompanyName = 'Evotec' CompanyName = 'Evotec'
CompatiblePSEditions = 'Desktop' CompatiblePSEditions = 'Desktop'
Copyright = '(c) 2011 - 2020 Przemyslaw Klys @ Evotec. All rights reserved.' Copyright = '(c) 2011 - 2020 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 easy fixing for issues that you may expect finding in them.' Description = 'Group Policy Eater is a PowerShell module that aims to gather information about Group Policies but also allows easy fixing for issues that you may expect finding in them.'
FunctionsToExport = 'Add-GPOPermission', 'Add-GPOZaurrPermission', 'Backup-GPOZaurr', 'Find-GPO', 'Get-GPOZaurr', 'Get-GPOZaurrAD', 'Get-GPOZaurrBackupInformation', 'Get-GPOZaurrFiles', 'Get-GPOZaurrLegacyFiles', 'Get-GPOZaurrLink', 'Get-GPOZaurrLinkSummary', 'Get-GPOZaurrOwner', 'Get-GPOZaurrPassword', 'Get-GPOZaurrPermission', 'Get-GPOZaurrPermissionConsistency', 'Get-GPOZaurrSysvol', 'Get-WMIFilter', 'Get-GPOZaurrWMI', 'Invoke-GPOZaurrPermission', 'New-GPOZaurrWMI', 'Remove-GPOPermission', 'Remove-GPOZaurr', 'Remove-GPOZaurrLegacyFiles', 'Remove-GPOZaurrOrphanedSysvolFolders', 'Remove-GPOZaurrPermission', 'Remove-GPOZaurrWMI', 'Repair-GPOZaurrPermissionConsistency', 'Restore-GPOZaurr', 'Save-GPOZaurrFiles', 'Select-GPOTranslation', 'Set-GPOOwner', 'Set-GPOZaurrOwner' FunctionsToExport = 'Add-GPOPermission', 'Add-GPOZaurrPermission', 'Backup-GPOZaurr', 'Get-GPOZaurr', 'Get-GPOZaurrAD', 'Get-GPOZaurrBackupInformation', 'Get-GPOZaurrFiles', 'Get-GPOZaurrLegacyFiles', 'Get-GPOZaurrLink', 'Get-GPOZaurrLinkSummary', 'Get-GPOZaurrOwner', 'Get-GPOZaurrPassword', 'Get-GPOZaurrPermission', 'Get-GPOZaurrPermissionConsistency', 'Get-GPOZaurrSysvol', 'Get-WMIFilter', 'Get-GPOZaurrWMI', 'Invoke-GPOZaurr', 'Invoke-GPOZaurrPermission', 'New-GPOZaurrWMI', 'Remove-GPOPermission', 'Remove-GPOZaurr', 'Remove-GPOZaurrLegacyFiles', 'Remove-GPOZaurrOrphanedSysvolFolders', 'Remove-GPOZaurrPermission', 'Remove-GPOZaurrWMI', 'Repair-GPOZaurrPermissionConsistency', 'Restore-GPOZaurr', 'Save-GPOZaurrFiles', 'Select-GPOTranslation', 'Set-GPOOwner', 'Set-GPOZaurrOwner'
GUID = 'f7d4c9e4-0298-4f51-ad77-e8e3febebbde' GUID = 'f7d4c9e4-0298-4f51-ad77-e8e3febebbde'
ModuleVersion = '0.0.46' ModuleVersion = '0.0.46'
PowerShellVersion = '5.1' PowerShellVersion = '5.1'
+77
View File
@@ -0,0 +1,77 @@
$SecurityOptions = @{
Category = 'SecuritySettings'
Settings = 'SecurityOptions'
# This is to make sure we're not loosing anything
# We will detect this and if something is missing provide details
PossibleProperties = @(
'KeyName'
'SettingNumber'
'Display'
'SystemAccessPolicyName'
'SettingString'
)
Translate = [ordered] @{
'KeyName' = 'KeyName'
'KeyDisplayName' = 'Display', 'Name'
'KeyDisplayUnits' = 'Display', 'Units'
'KeyDisplayBoolean' = 'Display', 'DisplayBoolean'
'KeyDisplayString' = 'Display', 'DisplayString'
'SystemAccessPolicyName' = 'SystemAccessPolicyName'
'SettingString' = 'SettingString'
'SettingNumber' = 'SettingNumber'
}
Types = [ordered] @{
'KeyDisplayBoolean' = { try { [bool]::Parse($args) } catch { $null } }
}
}
$LugsSettingsLocalUsersAndGroups = @{
PossibleProperties = @(
'clsid'
'Group'
'User'
)
CustomCode = {
}
<#
LoopOver = @{
User = @{
}
Group = @{
}
}
#>
<#
Translate = [ordered] @{
Name = #= $Entry.name
Changed = #= [DateTime] $Entry.changed
GPOSettingOrder = #= $Entry.GPOSettingOrder
Filters = #= $Entry.Filters
ActionType = #= $NestedType
Action = #= $Entry.Properties.Action
UserName = #= $Entry.Properties.userName
NewName = #= $Entry.Properties.newName
Description = #= $Entry.Properties.description
DeleteAllUsers = #= [bool] $Entry.Properties.deleteAllUsers
DeleteAllGroups = #= [bool] $Entry.Properties.deleteAllGroups
RemoveAccounts = #= [bool] $Entry.Properties.removeAccounts
GroupSid = #= $Entry.Properties.groupSid
GroupName = #= $Entry.Properties.groupName
MembersName = #= $Member.Name
MembersAction = #= $Member.Action
MembersSid = #= $Member.Sid
FullName = #= $Entry.Properties.fullName
AccountCpassword = #= $Entry.Properties.cpassword
AccountChangeLogon = #= [bool] $Entry.Properties.changeLogon
AccountNoChange = #= [bool] $Entry.Properties.noChange
AccountNeverExpires= #= [bool] $Entry.Properties.neverExpires
AccountDisabled = #= [bool] $Entry.Properties.acctDisabled
SubAuthority = #= $Entry.Properties.subAuthority
}
#>
}
@@ -1,24 +0,0 @@
$SecuritySettingsSecurityOptions = @{
# This is to make sure we're not loosing anything
# We will detect this and if something is missing provide details
PossibleProperties = @(
'KeyName'
'SettingNumber'
'Display'
'SystemAccessPolicyName'
'SettingString'
)
Translate = [ordered] @{
'KeyName' = 'KeyName'
'KeyDisplayName' = 'Display', 'Name'
'KeyDisplayUnits' = 'Display', 'Units'
'KeyDisplayBoolean' = 'Display', 'DisplayBoolean'
'KeyDisplayString' = 'Display', 'DisplayString'
'SystemAccessPolicyName' = 'SystemAccessPolicyName'
'SettingString' = 'SettingString'
'SettingNumber' = 'SettingNumber'
}
Types = [ordered] @{
'KeyDisplayBoolean' = { try { [bool]::Parse($args) } catch { $null } }
}
}
+6 -5
View File
@@ -2,6 +2,7 @@
[cmdletBinding()] [cmdletBinding()]
param( param(
[System.Collections.IDictionary] $InputData, [System.Collections.IDictionary] $InputData,
[string] $Report,
[string] $Category, [string] $Category,
[string] $Settings [string] $Settings
) )
@@ -15,7 +16,7 @@
$AllProperties = Select-Properties -AllProperties -Objects $InputData.$Category.$Settings $AllProperties = Select-Properties -AllProperties -Objects $InputData.$Category.$Settings
$MissingProperties = $AllProperties | Where-Object { $_ -notin 'DisplayName', 'DomainName', 'GUID', 'Linked', 'LinksCount', 'Links', 'GPOType', 'GPOCategory', 'GPOSettings' } $MissingProperties = $AllProperties | Where-Object { $_ -notin 'DisplayName', 'DomainName', 'GUID', 'Linked', 'LinksCount', 'Links', 'GPOType', 'GPOCategory', 'GPOSettings' }
foreach ($Property in $MissingProperties) { foreach ($Property in $MissingProperties) {
if ($Property -notin $Script:GPODitionary[$Category][$Settings]['PossibleProperties']) { if ($Property -notin $Script:GPODitionary[$Report]['PossibleProperties']) {
Write-Warning "Invoke-Translation - We're missing property for $Category / $Settings - $Property" Write-Warning "Invoke-Translation - We're missing property for $Category / $Settings - $Property"
} }
} }
@@ -33,9 +34,9 @@
} }
# Lets loop thru each Translate Property # Lets loop thru each Translate Property
foreach ($PropertyName in $Script:GPODitionary[$Category][$Settings]['Translate'].Keys) { foreach ($PropertyName in $Script:GPODitionary[$Report]['Translate'].Keys) {
# We get property that we expect on our $GPOEntry object # We get property that we expect on our $GPOEntry object
$Property = $Script:GPODitionary[$Category][$Settings]['Translate'][$PropertyName] $Property = $Script:GPODitionary[$Report]['Translate'][$PropertyName]
# Since it's possible we may be interested in something that is a nested property we need to do some looping into the object # Since it's possible we may be interested in something that is a nested property we need to do some looping into the object
$Value = $GPOEntry $Value = $GPOEntry
@@ -44,9 +45,9 @@
} }
# Now we simply assing that value to new GPO Entry # Now we simply assing that value to new GPO Entry
# But before we do so, we need to check if it has required type # But before we do so, we need to check if it has required type
if ($Script:GPODitionary[$Category][$Settings]['Types'][$PropertyName]) { if ($Script:GPODitionary[$Report]['Types'][$PropertyName]) {
# This basically checks in dictionary if we want to convert the type from a string to lets say boolean or something else # This basically checks in dictionary if we want to convert the type from a string to lets say boolean or something else
$CreateGPO["$PropertyName"] = Invoke-Command -Command $Script:GPODitionary[$Category][$Settings]['Types'][$PropertyName] -ArgumentList $Value $CreateGPO["$PropertyName"] = Invoke-Command -Command $Script:GPODitionary[$Report]['Types'][$PropertyName] -ArgumentList $Value
} else { } else {
$CreateGPO["$PropertyName"] = $Value $CreateGPO["$PropertyName"] = $Value
} }
+4 -3
View File
@@ -1,5 +1,6 @@
$Script:GPODitionary = @{ $Script:GPODitionary = @{
SecuritySettings = @{ SecurityOptions = $SecurityOptions
SecurityOptions = $SecuritySettingsSecurityOptions #LugsSettings = @{
} # LocalUsersAndGroups = $LugsSettingsLocalUsersAndGroups
} }
@@ -1,4 +1,5 @@
function Find-GPO { function Invoke-GPOZaurr {
[alias('Find-GPO')]
[cmdletBinding(DefaultParameterSetName = 'Default')] [cmdletBinding(DefaultParameterSetName = 'Default')]
param( param(
[Parameter(ParameterSetName = 'Default')][alias('ForestName')][string] $Forest, [Parameter(ParameterSetName = 'Default')][alias('ForestName')][string] $Forest,
@@ -10,18 +11,7 @@
[Parameter(ParameterSetName = 'Default')] [Parameter(ParameterSetName = 'Default')]
[Parameter(ParameterSetName = 'Local')] [Parameter(ParameterSetName = 'Local')]
[ValidateSet('LocalUsersAndGroups', 'Autologon', 'RegistrySettings', 'RegistryPolicies', 'Scripts')][string[]] $Type = @( [string[]] $Type,
'LocalUsersAndGroups'
'Autologon'
'RegistrySettings'
'RegistryPolicies'
'Scripts'
'SoftwareInstallation'
'SecurityOptions'
'Account'
'SystemServices'
),
[Parameter(ParameterSetName = 'Default')] [Parameter(ParameterSetName = 'Default')]
[Parameter(ParameterSetName = 'Local')] [Parameter(ParameterSetName = 'Local')]
[switch] $NoTranslation, [switch] $NoTranslation,
@@ -29,8 +19,13 @@
[Parameter(ParameterSetName = 'Default')] [Parameter(ParameterSetName = 'Default')]
[Parameter(ParameterSetName = 'Local')] [Parameter(ParameterSetName = 'Local')]
[string] $Splitter = [System.Environment]::NewLine, [string] $Splitter = [System.Environment]::NewLine,
[switch] $FullObjects [switch] $FullObjects,
[ValidateSet('HTML', 'Object')][string] $OutputType = 'Object'
) )
if ($Type.Count -eq 0) {
$Type = $Script:GPODitionary.Keys
}
if ($GPOPath) { if ($GPOPath) {
if (Test-Path -LiteralPath $GPOPath) { if (Test-Path -LiteralPath $GPOPath) {
<# <#
@@ -159,19 +154,27 @@
$Output $Output
} else { } else {
$TranslatedOutput = [ordered] @{} $TranslatedOutput = [ordered] @{}
foreach ($Category in $Script:GPODitionary.Keys) { foreach ($Report in $Type) {
if (-not $TranslatedOutput[$Category]) { $Category = $Script:GPODitionary[$Report]['Category']
$TranslatedOutput[$Category] = [ordered] @{} $Settings = $Script:GPODitionary[$Report]['Settings']
}
foreach ($Setting in $Script:GPODitionary[$Category].Keys) { #if (-not $TranslatedOutput[$Report]) {
if (-not $TranslatedOutput[$Category][$Setting]) { # $TranslatedOutput[$Report] = [ordered] @{}
$TranslatedOutput[$Category][$Setting] = [ordered] @{} #}
} #foreach ($Setting in $Settings) {
$TranslatedOutput[$Category][$Setting] = Invoke-GPOTranslation -InputData $Output -Category $Category -Settings $Setting # if (-not $TranslatedOutput[$Category][$Settings]) {
} # $TranslatedOutput[$Category][$Settings] = [ordered] @{}
# }
$TranslatedOutput[$Report] = Invoke-GPOTranslation -InputData $Output -Category $Category -Settings $Settings -Report $Report
#}
} }
$TranslatedOutput $TranslatedOutput
} }
} }
#Select-Properties -AllProperties -Objects ($Output.SecuritySettings.SecurityOptions | Where-Object { $_.Display -ne $null }) [scriptblock] $SourcesAutoCompleter = {
param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters)
$Script:GPODitionary.Keys | Sort-Object | Where-Object { $_ -like "*$wordToComplete*" }
}
Register-ArgumentCompleter -CommandName Find-GPO -ParameterName Type -ScriptBlock $SourcesAutoCompleter
+1 -1
View File
@@ -42,7 +42,7 @@ That's it. Whenever there's a new version, you run the command, and you can enjo
- 0.0.46 - Unreleased - 0.0.46 - Unreleased
- Additional protection for `Get-GPOZaurrAD` for CNF duplicates - Additional protection for `Get-GPOZaurrAD` for CNF duplicates
- Update to `Save-GPOZaurrFiles` - Update to `Save-GPOZaurrFiles`
- Added `Find-GPO` (heavy work in progress) - Added `Invoke-GPOZaurr` (alias: `Find-GPO`) (heavy work in progress)
- 0.0.45 - 26.06.2020 - 0.0.45 - 26.06.2020
- During publishing ADEssentials required functions are now merged to prevent cyclic dependency bug [Using ModuleSpec syntax in RequiredModules causes incorrect "cyclic dependency" failures](https://github.com/PowerShell/PowerShell/issues/2607) - During publishing ADEssentials required functions are now merged to prevent cyclic dependency bug [Using ModuleSpec syntax in RequiredModules causes incorrect "cyclic dependency" failures](https://github.com/PowerShell/PowerShell/issues/2607)
- 0.0.44 - 24.06.2020 - 0.0.44 - 24.06.2020