Compare commits

...

4 Commits

Author SHA1 Message Date
Przemyslaw Klys 996621ab5c update readme 2020-06-15 16:01:50 +02:00
Przemyslaw Klys de890e5c12 Added new command Get-GPOZaurrLinkSummary 2020-06-15 16:01:11 +02:00
Przemyslaw Klys 3611028f5b Small display fix for canonical links 2020-06-15 16:00:54 +02:00
Przemyslaw Klys 1eb4f79cd8 Update 2020-06-08 08:40:43 +02:00
5 changed files with 181 additions and 10 deletions
+14
View File
@@ -0,0 +1,14 @@
Clear-Host
Import-Module "$PSScriptRoot\..\GPoZaurr.psd1" -Force
#Get-GPOZaurrLinkSummary | Format-Table *
#Get-GPOZaurrLinkSummary -UnlimitedProperties | Format-Table *
#Get-GPOZaurrLinkSummary -Report 'MultipleLinks' -UnlimitedProperties | Format-Table *
#Get-GPOZaurrLinkSummary -Report 'OneLink' -UnlimitedProperties | Format-Table *
#Get-GPOZaurrLinkSummary -Report 'LinksSummary' -UnlimitedProperties | Format-Table *
$Report = Get-GPOZaurrLinkSummary #-UnlimitedProperties
$Report | Format-Table *
$Report.MultipleLinks | Format-Table *
$Report.OneLink | Format-Table *
$Report.LinksSummary | Format-Table *
+3 -3
View File
@@ -5,9 +5,9 @@
CompatiblePSEditions = 'Desktop'
Copyright = '(c) 2011 - 2020 Przemyslaw Klys @ Evotec. All rights reserved.'
Description = 'Group Policy Eater'
FunctionsToExport = 'Add-GPOPermission', 'Add-GPOZaurrPermission', 'Backup-GPOZaurr', 'Get-GPOZaurr', 'Get-GPOZaurrAD', 'Get-GPOZaurrBackupInformation', 'Get-GPOZaurrLegacyFiles', 'Get-GPOZaurrLink', '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', 'Set-GPOOwner', 'Set-GPOZaurrOwner'
FunctionsToExport = 'Add-GPOPermission', 'Add-GPOZaurrPermission', 'Backup-GPOZaurr', 'Get-GPOZaurr', 'Get-GPOZaurrAD', 'Get-GPOZaurrBackupInformation', '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', 'Set-GPOOwner', 'Set-GPOZaurrOwner'
GUID = 'f7d4c9e4-0298-4f51-ad77-e8e3febebbde'
ModuleVersion = '0.0.34'
ModuleVersion = '0.0.36'
PowerShellVersion = '5.1'
PrivateData = @{
PSData = @{
@@ -17,7 +17,7 @@
}
}
RequiredModules = @{
ModuleVersion = '0.0.145'
ModuleVersion = '0.0.147'
ModuleName = 'PSSharedGoods'
Guid = 'ee272aa8-baaa-4edf-9f45-b6d6f7d844fe'
}, @{
+8 -6
View File
@@ -6,12 +6,14 @@
[System.Collections.IDictionary] $GPOCache
)
if ($Object.GpLink -and $Object.GpLink.Trim() -ne '') {
$Object.GpLink -split { $_ -eq '[' -or $_ -eq ']' } -replace ';0' -replace 'LDAP://' | ForEach-Object -Process {
if ($_) {
#$Object.GpLink -split { $_ -eq '[' -or $_ -eq ']' } -replace ';0' -replace 'LDAP://'
$Object.GpLink -split '\[LDAP://' -split ';' | ForEach-Object -Process {
#Write-Verbose $_
if ($_.Length -gt 10) {
$DomainCN = ConvertFrom-DistinguishedName -DistinguishedName $_ -ToDomainCN
$Output = [ordered] @{
DistinguishedName = $Object.DistinguishedName
CanonicalName = $Object.CanonicalName
CanonicalName = $Object.CanonicalName.TrimEnd('/');
Guid = [Regex]::Match( $_, '(?={)(.*)(?<=})').Value -replace '{' -replace '}'
}
$Search = -join ($DomainCN, $Output['Guid'])
@@ -30,12 +32,12 @@
}
}
} elseif ($Object.LinkedGroupPolicyObjects -and $Object.LinkedGroupPolicyObjects.Trim() -ne '') {
$Object.LinkedGroupPolicyObjects -split { $_ -eq '[' -or $_ -eq ']' } -replace ';0' -replace 'LDAP://' | ForEach-Object -Process {
if ($_) {
$Object.LinkedGroupPolicyObjects -split '\[LDAP://' -split ';' | ForEach-Object -Process {
if ($_.Length -gt 10) {
$DomainCN = ConvertFrom-DistinguishedName -DistinguishedName $_ -ToDomainCN
$Output = [ordered] @{
DistinguishedName = $Object.DistinguishedName
CanonicalName = $Object.CanonicalName
CanonicalName = $Object.CanonicalName.TrimEnd('/');
Guid = [Regex]::Match( $_, '(?={)(.*)(?<=})').Value -replace '{' -replace '}'
}
$Search = -join ($DomainCN, $Output['Guid'])
+155
View File
@@ -0,0 +1,155 @@
function Get-GPOZaurrLinkSummary {
[cmdletBinding()]
param(
[ValidateSet('All', 'MultipleLinks', 'OneLink', 'LinksSummary')][string[]] $Report = 'All',
[switch] $UnlimitedProperties
)
$HighestCount = 0 # to keep number of depth
$CacheSummaryLinks = [ordered] @{} # cache
# Get all links
$Links = Get-GPOZaurrLink
foreach ($Link in $Links) {
if (-not $CacheSummaryLinks["$($Link.DomainName)$($Link.Guid)"]) {
$CacheSummaryLinks["$($Link.DomainName)$($Link.Guid)"] = [System.Collections.Generic.List[System.Object]]::new()
}
$CacheSummaryLinks["$($Link.DomainName)$($Link.Guid)"].Add($Link)
}
$ReturnObject = [ordered] @{
MultipleLinks = [System.Collections.Generic.List[System.Object]]::new()
OneLink = [System.Collections.Generic.List[System.Object]]::new()
LinksSummary = [System.Collections.Generic.List[System.Object]]::new()
}
foreach ($Key in $CacheSummaryLinks.Keys) {
$GPOs = $CacheSummaryLinks[$Key]
[Array] $LinkingSummary = foreach ($GPO in $GPOs) {
$SplitttedOU = ($GPO.DistinguishedName -split ',')
[Array] $Clean = foreach ($_ in $SplitttedOU) {
if ($_ -notlike 'DC=*') { $_ -replace 'OU=' }
}
if ($Clean.Count -gt $HighestCount) {
$HighestCount = $Clean.Count
}
if ($Clean) {
$Test = [ordered] @{
GPOName = $GPO.DisplayName
#Test = $GPO.DistinguishedName
Level0 = ConvertFrom-DistinguishedName -DistinguishedName $GPO.DistinguishedName -ToDomainCN
}
for ($i = 1; $i -le 10; $i++) {
$Test["Level$i"] = $Clean[ - $i]
}
[PSCustomobject] $Test
} else {
$Test = [ordered] @{
GPOName = $GPO.DisplayName
#Test = $GPO.DistinguishedName
Level0 = $GPO.CanonicalName
}
for ($i = 1; $i -le 10; $i++) {
$Test["Level$i"] = $null
}
[PSCustomobject] $Test
}
}
if ($Report -contains 'MultipleLinks' -or $Report -contains 'All') {
foreach ($Link in $LinkingSummary) {
$ReturnObject.MultipleLinks.Add($Link)
}
#continue
}
if ($Report -eq 'OneLink' -or $Report -contains 'All') {
$List = [ordered] @{
GPOName = $GPO.DisplayName
DomainName = $GPO.DomainName
LinksCount = $GPOs.Count
}
for ($i = 0; $i -le 10; $i++) {
$List["Level$i"] = ($LinkingSummary."Level$i" | Select-Object -Unique).Count
$List["Level$($i)List"] = ($LinkingSummary."Level$i" | Select-Object -Unique)
}
<#
Level0 = ($LinkingSummary.Level0 | Select-Object -Unique).Count
Level0List = ($LinkingSummary.Level0 | Select-Object -Unique)
Level1 = ($LinkingSummary.Level1 | Select-Object -Unique).Count
Level1List = ($LinkingSummary.Level1 | Select-Object -Unique)
Level2 = ($LinkingSummary.Level2 | Select-Object -Unique).Count
Level2List = ($LinkingSummary.Level2 | Select-Object -Unique)
#>
$List.LinksDistinguishedName = $GPOs.DistinguishedName # = Computers, OU = ITR02, DC = ad, DC = evotec, DC = xyz
$List.LinksCanonicalName = $GPOs.CanonicalName
$ReturnObject.OneLink.Add( [PSCustomObject] $List)
}
if ($Report -eq 'LinksSummary' -or $Report -contains 'All') {
$Output = [PSCustomObject] @{
Guid = $GPOs[0].Guid #: AA782787 - 002B-4B8C-886F-05873F2DC0CA
DisplayName = $GPOs[0].DisplayName #: COMPUTERS | LAPS
DomainName = $GPOs[0].DomainName #: ad.evotec.xyz
LinksCount = $GPOs.Count
LinksDistinguishedName = $GPOs.DistinguishedName # = Computers, OU = ITR02, DC = ad, DC = evotec, DC = xyz
LinksCanonicalName = $GPOs.CanonicalName #: ad.evotec.xyz / ITR02 / Computers
#LinkSummary = $LinkingSummary
<#
Owner = $GPOs[0].Owner #: EVOTEC\Domain Admins
GpoStatus = $GPOs[0].GpoStatus #: AllSettingsEnabled
Description = $GPOs[0].Description #:
CreationTime = $GPOs[0].CreationTime #: 16.12.2019 21:25:32
ModificationTime = $GPOs[0].ModificationTime #: 30.05.2020 19:12:58
GPODomainDistinguishedName = $GPOs[0].GPODomainDistinguishedName #: DC = ad, DC = evotec, DC = xyz
GPODistinguishedName = $GPOs[0].GPODistinguishedName #: cn = { AA782787 - 002B-4B8C-886F-05873F2DC0CA }, cn = policies, cn = system, DC = ad, DC = evotec, DC = xy
#>
}
$ReturnObject.LinksSummary.Add($Output)
}
}
# Processing output
if (-not $UnlimitedProperties) {
if ($Report -contains 'MultipleLinks' -or $Report -contains 'All') {
$Properties = @(
'GPOName'
for ($i = 0; $i -le $HighestCount; $i++) {
"Level$i"
}
)
$ReturnObject.MultipleLinks = $ReturnObject.MultipleLinks | Select-Object -Property $Properties
}
if ($Report -contains 'OneLink' -or $Report -contains 'All') {
$Properties = @(
'GPOName'
'DomainName'
for ($i = 0; $i -le $HighestCount; $i++) {
"Level$i"
"Level$($i)List"
}
'LinksDistinguishedName'
'LinksCanonicalName'
)
$ReturnObject.OneLink = $ReturnObject.OneLink | Select-Object -Property $Properties
}
if ($Report -contains 'LinksSummary' -or $Report -contains 'All') {
# Not needed because there's no dynamic properties, but if there would be we need to uncomment and fix it
<#
$Properties = @(
'Guid'
'DisplayName'
'DomainName'
'LinksCount'
'LinksDistinguishedName'
'LinksCanonicalName'
)
$ReturnObject.LinksSummary = $ReturnObject.LinksSummary | Select-Object -Property $Properties
#>
}
}
if ($Report.Count -eq 1 -and $Report -notcontains 'All') {
$ReturnObject["$Report"]
} else {
$ReturnObject
}
}
+1 -1
View File
@@ -39,5 +39,5 @@ That's it. Whenever there's a new version, you run the command, and you can enjo
## Changelog
- 0.0.1 - Unreleased
- 0.0.36 - 15.06.2020
- Initial release