• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 894
  • Last Modified:

How to programatically query DNS for records soon to expire / be scavenged?

I would like to know if there is a way I can programatically query a windows based DNS server for records that have failed to be reregistered in a certain time frame and thus up for expiration and scavenging?

Is there a query-language for DNS? How does one use it to find this sort of information?

An example would be wonderful in c# or vb or a scripting language... anything, really.
0
DefyFate05
Asked:
DefyFate05
  • 3
1 Solution
 
Chris DentPowerShell DeveloperCommented:

Hey there,

It's all exposted in WMI.

I have VbScript or PowerShell versions to find this kind of thing. The PowerShell version is a hell of a lot neater / more flexible / more reliable.

Copy and paste this, fixing the Domain Name and Server Name.

Listing All Stale Records within a given Domain:

$DNSServer = "YourServerName"
$Domain = "YourDomain"

Get-WMIObject -Class "MicrosoftDNS_AType" -Namespace `
    "root\MicrosoftDNS" -Comp $DNSServer -Filter "DomainName='$Domain'" | `
    Select-Object `
    OwnerName,@{n="TimeStamp";e={(Get-Date("01/01/1601")).AddHours($_.TimeStamp)}} `
    | ?{($_.TimeStamp -lt ((Get-Date).AddDays(-14))) -and ($_.TimeStamp -ne (Get-Date("01/01/1601")))}

Note the use of "AddDays(-14)", that means we're only looking for entries where the TimeStamp is more than 14 days old, it assumes you're using 7 Days No-Refresh and 7 Days Refresh, change as appropriate.

HTH

Chris
0
 
Chris DentPowerShell DeveloperCommented:

Oh yeah, just for interest, this is a modification of it to show Static Records:

$DNSServer = "YourServerName"
$Domain = "YourDomain"

Get-WMIObject -Class "MicrosoftDNS_AType" -Namespace `
    "root\MicrosoftDNS" -Comp $DNSServer -Filter "DomainName='$Domain'" | `
    Select-Object `
    OwnerName,@{n="TimeStamp";e={(Get-Date("01/01/1601")).AddHours($_.TimeStamp)}} `
    | ?{$_.TimeStamp -eq (Get-Date("01/01/1601"))}

TimeStamp is always 0 for Static Records, so the adjusted time always ends up being 01/01/1601.

Chris
0
 
DefyFate05Author Commented:
Can you throw the vbscript version up?

0
 
Chris DentPowerShell DeveloperCommented:

Certainly, here we go.

Chris
' No-Refresh + Refresh
Const MAXIMUM_AGE = 4
 
' DNS Server Name ("." if run locally)
Const SERVER_NAME = "."
 
' Domain Name to check 
' WMI query returns A records from all zones without WHERE filter
' Domain Name should be lower case and should not include trailing "."
Const DOMAIN_NAME = "domain.local"
 
Set objWMIService = GetObject("winmgmts:\\" & SERVER_NAME & "\root\MicrosoftDNS")
 
Set colItems = objWMIService.ExecQuery("SELECT * FROM MicrosoftDNS_AType WHERE " &_
        "DomainName='" & DOMAIN_NAME & "'")
 
Set objFileSystem = CreateObject("Scripting.FileSystemObject")
Set objFile = objFileSystem.OpenTextFile("StaleRecords.csv", 2, True, 0)
 
objFile.WriteLine "FQDN,IPAddress,TimeStamp"
 
For Each objItem In colItems
	' If InStr(1, objItem.DomainName, DOMAIN_NAME, VbTextCompare) > 0 Then
	        If objItem.TimeStamp > 0 Then
        	        dtmTimeStamp = DateAdd("h", objItem.TimeStamp, "1/1/1601 00:00:00 AM")
 
 
 	               If dtmTimeStamp <= (Date - MAXIMUM_AGE) Then
                	        objFile.WriteLine objItem.OwnerName & "," & objItem.IPAddress &_
        	                        "," & dtmTimeStamp
	                End If
        	End If
	' End If
Next
 
Set objFile = Nothing
Set objFileSystem = Nothing
 
Set colItems = Nothing
Set objWMIService = Nothing

Open in new window

0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Cloud Class® Course: C++ 11 Fundamentals

This course will introduce you to C++ 11 and teach you about syntax fundamentals.

  • 3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now