Understanding Active Directory-Integrated DNS: Storage Mechanism and LDAP Access Patterns


2 views

When DNS zones are integrated with Active Directory, the data isn't stored in traditional text files but rather within the AD database itself. This integration occurs through a specialized directory partition specifically designed for DNS storage.

AD-integrated DNS stores information in two primary locations:

1. DomainDNSZones partition: Replicates to all DCs in the domain
2. ForestDNSZones partition: Replicates across the entire forest

Each DNS zone becomes a container object in AD with the following hierarchy:

DC=DomainDNSZones,DC=example,DC=com
    CN=MicrosoftDNS
        DC=yourzone.com (the DNS zone)
            DC=@ (root node)
            DC=www (host record)
            DC=_tcp (service record)

To inspect DNS records using ADSIEdit:

1. Open ADSIEdit.msc
2. Connect to "DomainDNSZones" naming context
3. Navigate to CN=MicrosoftDNS
4. Explore zone containers and record objects

Here's how to query DNS records via PowerShell using ADSI:

$root = [ADSI]"LDAP://DC=DomainDNSZones,DC=example,DC=com"
$zone = $root.Children | Where-Object { $_.Name -eq "yourzone.com" }
$records = $zone.Children | Where-Object { $_.Name -eq "@" }
$records | Format-List *

Different DNS record types store data in distinct attributes:

A Records: dnsRecord attribute (binary format)
MX Records: dnsRecord attribute with MX-specific encoding
SRV Records: dnsRecord attribute with service location data

The dnsRecord attribute stores binary data that can be decoded:

$record = [ADSI]"LDAP://CN=www,CN=MicrosoftDNS,DC=DomainDNSZones,DC=example,DC=com"
$bytes = $record.Properties["dnsRecord"].Value
$ip = "$($bytes[12]).$($bytes[13]).$($bytes[14]).$($bytes[15])"
Write-Host "IP Address: $ip"

When modifying DNS records programmatically, consider:

- Replication latency across domain controllers
- Application partitions vs domain partitions
- Security descriptors on DNS objects

Unlike traditional DNS that uses zone files (.dns), AD-integrated DNS stores its data directly in the Active Directory database. This implementation leverages Active Directory's multi-master replication capabilities while maintaining DNS-specific data structures within the LDAP schema.

All DNS data resides in the DomainDnsZones and ForestDnsZones application directory partitions. These partitions appear as CN (container) objects in the AD hierarchy:

DC=DomainDnsZones,DC=contoso,DC=com
DC=ForestDnsZones,DC=contoso,DC=com

Each DNS zone becomes a dnsZone class object containing dnsNode objects for records. Here's the LDAP structure:

// Zone container
CN=example.com,CN=MicrosoftDNS,DC=DomainDnsZones,DC=contoso,DC=com
  objectClass: dnsZone
  
  // Host record example
  CN=www,CN=example.com,CN=MicrosoftDNS,DC=DomainDnsZones,DC=contoso,DC=com
    objectClass: dnsNode
    dnsRecord: [binary data representing A record]

To view DNS records using ADSIEdit:

  1. Open adsiedit.msc
  2. Connect to "Configuration" naming context
  3. Navigate to CN=MicrosoftDNS,DC=DomainDnsZones,DC=yourdomain,DC=com

Retrieve all DNS zones from AD:

Get-ADObject -SearchBase "DC=DomainDnsZones,DC=contoso,DC=com" 
             -Filter "objectClass -eq 'dnsZone'" 
             -Properties *

Query specific DNS records:

Get-ADObject -SearchBase "CN=example.com,CN=MicrosoftDNS,DC=DomainDnsZones,DC=contoso,DC=com" 
             -Filter "objectClass -eq 'dnsNode'" 
             -Properties dnsRecord

The dnsRecord attribute stores binary data in this structure:

typedef struct _DNS_RECORD {
  DWORD dwFlags;
  DWORD dwSerial;
  DWORD dwTtlSeconds;
  DWORD dwTimeStamp;
  DWORD dwReserved;
  [size_is(dwDataLength)] BYTE data[];
} DNS_RECORD;

AD uses these techniques for efficient DNS storage:

  • Duplicate elimination for identical records
  • Binary encoding compression
  • Hierarchical namespace mapping to LDAP tree

DNS data replicates as part of normal AD replication, with these characteristics:

Partition Replication Scope
DomainDnsZones All DCs in the domain
ForestDnsZones All DCs in the forest