diff --git a/Private/ConvertTo-XMLCertificates.ps1 b/Private/ConvertTo-XMLCertificates.ps1 new file mode 100644 index 0000000..fe22221 --- /dev/null +++ b/Private/ConvertTo-XMLCertificates.ps1 @@ -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 + } + } +} \ No newline at end of file diff --git a/Private/Script.GPODictionary.ps1 b/Private/Script.GPODictionary.ps1 index 8a24ccb..a9e6f1b 100644 --- a/Private/Script.GPODictionary.ps1 +++ b/Private/Script.GPODictionary.ps1 @@ -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 } } <# diff --git a/README.md b/README.md index 5bfaac8..4863f1e 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,9 @@ To understand the usage I've created blog post you may find useful ## Changelog +- 0.0.128 Alpha 2 + - ☑ Improved `Invoke-GPOZaurrContent` - type `PublicKeyPoliciesCertificates` - added more certificate information for + - ☑ 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