Private/Dns/Schema.ps1

function Get-PSIDnsSchema {
    [ordered]@{
        dcs=@('Selected domain controllers',@('Name','Server','Domain','Site','OS','Inventory','Zones observed'))
        role=@('DNS role',@('Name','Server','DNS role present','Service state'))
        client=@('Client resolvers',@('Name','Server','Adapter','DNS search order','Preferred DNS','Alternate DNS','Additional DNS'))
        forwarders=@('Server forwarders',@('Name','Server','Forwarder','Order','Timeout seconds','Use root hints'))
        recursion=@('Recursion',@('Name','Server','Enabled','Additional timeout','Retry interval','Timeout','Secure response'))
        scavenging=@('Server scavenging',@('Name','Server','Enabled','Interval','Default no-refresh interval','Default refresh interval','Last scavenge time'))
        rootHints=@('Root hints',@('Name','Server','Name server','Addresses'))
        zones=@('Zones',@('Name','Server','Zone','Type','AD integrated','Directory partition','Dynamic updates','Reverse lookup','Paused','Shutdown','Zone file'))
        conditional=@('Conditional forwarders',@('Name','Server','Zone','Master servers','AD integrated','Directory partition','Timeout seconds','Use recursion'))
        aging=@('Zone aging',@('Name','Server','Zone','Aging enabled','No-refresh interval','Refresh interval','Scavenge servers','Available for scavenging'))
        delegations=@('Delegations',@('Name','Server','Zone','Child zone','Name servers','IP addresses'))
        nameServers=@('Zone NS records',@('Name','Server','Zone','Owner','Name server','TTL','Timestamp'))
        nsAddresses=@('Stored NS addresses',@('Name','Server','Zone','Name server','Address zone','Owner','Record type','Address','TTL'))
        scopes=@('Zone scopes',@('Name','Server','Zone','Scope','File name'))
        zoneQueries=@('Per-zone collection',@('Name','Server','Zone','Operation','Status','Duration ms','Error ID','Message','Collected at'))
        collection=@('Category collection',@('Name','Server','Section','Outcome','Method','Collected at','Message','Check ID','Status','Duration ms','Record count','Error ID','Started at'))
    }
}
function ConvertTo-PSIDnsModel {
    $schema=Get-PSIDnsSchema;$data=[ordered]@{};$coverage=[ordered]@{}
    foreach($k in $schema.Keys){
        $rows=New-Object collections.ArrayList
        foreach($source in $script:DCInvData[$k].ToArray()){
            $record=[ordered]@{};foreach($col in $schema[$k][1]){$record[$col]=Get-DCInvValue $source $col}
            $record.Server=$source.Name
            $record.Name=if($k -eq 'dcs'){$source.Name}elseif($k -eq 'collection'){$source.Name+' / '+$source.'Check ID'}elseif($null -ne (Get-DCInvValue $source 'Zone')){$source.Name+' / '+$source.Zone}else{$source.Name}
            [void]$rows.Add([pscustomobject]$record)
        }
        $data[$k]=@($rows.ToArray())
        $coverage[$k]=if($k -in @('dcs','collection')){$true}else{@($script:DCInvData.collection.ToArray()|Where-Object{$_.'Check ID' -eq $k -and $_.Status -notin @('Succeeded','NotApplicable')}).Count -eq 0}
    }
    [pscustomobject]@{Schema=$schema;Data=$data;Coverage=$coverage;Raw=[ordered]@{}}
}