#Export-DNSEntries.ps1 #Alan dot Kaplan at VA dot Gov #3/4/2015 #Exports selected DNS record from server #This is my Select-PropertiesForm with some changes Function Select-TypesForm { #Requires -version 3 #Initial code generated by #SAPIEN Technologies PrimalForms (Community Edition) v1.0.10.0 [CmdletBinding()] [OutputType([psObject])] Param ( # InputObject help description [Parameter(Mandatory=$True, Position=0)] $InputObject, # FormTitle help description [Parameter(Mandatory=$False, Position=1)] [string]$FormTitle="Select in order the properties to report, then accept list" ) $inputObject = $InputObject | select -ExpandProperty RecordType #Region Import Assemblies Add-Type -assemblyname System.Windows.Forms Add-Type -assemblyname System.Drawing #EndRegion Import Assemblies #Region Clear Variables $Script:NewList ="" #EndRegion Clear Variables #region Form Objects $SelectForm = New-Object System.Windows.Forms.Form $CancelBtn = New-Object System.Windows.Forms.Button $AcceptBtn = New-Object System.Windows.Forms.Button $MoveLftBtn = New-Object System.Windows.Forms.Button $MoveRtBtn = New-Object System.Windows.Forms.Button $lb_NewList = New-Object System.Windows.Forms.ListBox $lb_OrigList = New-Object System.Windows.Forms.ListBox $InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState #EndRegion Form Objects #---------------------------------------------- #Event Script Blocks #---------------------------------------------- $On_AcceptBtn_Click= { $Script:NewList = @() foreach ($item in $lb_NewList.Items){$Script:NewList += $item} $SelectForm.Close() } # Don't need this, because Cancel action is set in form definition, below # $On_CancelBtn_Click= # Begin by loading data passed to function $On_SelectForm_Load= { foreach($item in $InputObject) {$lb_OrigList.items.add($item)} } #Click the move left button removes from New list and puts back item to the original list $On_MoveLftBtn_Click= { $movelist = @() foreach ($item in $lb_NewList.SelectedItems){$movelist += $item} foreach($item in $movelist){ $lb_NewList.items.remove($item) $lb_OrigList.items.add($item) } } #Click the move right button removes from original list and puts item to the new list $On_MoveRtBtn_Click= { $movelist = @() foreach ($item in $lb_OrigList.SelectedItems){$movelist += $item} foreach($item in $movelist){ $lb_OrigList.items.remove($item) $lb_NewList.items.add($item) } } $OnLoadForm_StateCorrection= {#Sapien says this corrects the initial state of the form to prevent the .Net maximized form issue $SelectForm.WindowState = $InitialFormWindowState } #---------------------------------------------- #region Form Code $SelectForm.CancelButton = $CancelBtn $SysDrawSize = New-Object System.Drawing.Size $SysDrawSize.Height = 378 $SysDrawSize.Width = 632 $SelectForm.ClientSize = $SysDrawSize $SelectForm.DataBindings.DefaultDataSourceUpdateMode = 0 $SelectForm.Name = "SelectForm" $SelectForm.Text = $FormTitle $SelectForm.add_Load($On_SelectForm_Load) #Cancel Button $CancelBtn.DataBindings.DefaultDataSourceUpdateMode = 0 $CancelBtn.DialogResult = 2 $SysDrawPoint = New-Object System.Drawing.Point $SysDrawPoint.X = 255 $SysDrawPoint.Y = 219 $CancelBtn.Location = $SysDrawPoint $CancelBtn.Name = "CancelBtn" $SysDrawSize = New-Object System.Drawing.Size $SysDrawSize.Height = 26 $SysDrawSize.Width = 75 $CancelBtn.Size = $SysDrawSize $CancelBtn.TabIndex = 5 $CancelBtn.Text = "Cancel" $CancelBtn.UseVisualStyleBackColor = $True $CancelBtn.add_Click($On_CancelBtn_Click) $SelectForm.Controls.Add($CancelBtn) #Accept Button $AcceptBtn.DataBindings.DefaultDataSourceUpdateMode = 0 $SysDrawPoint = New-Object System.Drawing.Point $SysDrawPoint.X = 255 $SysDrawPoint.Y = 177 $AcceptBtn.Location = $SysDrawPoint $AcceptBtn.Name = "AcceptBtn" $SysDrawSize = New-Object System.Drawing.Size $SysDrawSize.Height = 23 $SysDrawSize.Width = 75 $AcceptBtn.Size = $SysDrawSize $AcceptBtn.TabIndex = 4 $AcceptBtn.Text = "Accept List" $AcceptBtn.UseVisualStyleBackColor = $True $AcceptBtn.add_Click($On_AcceptBtn_Click) $SelectForm.Controls.Add($AcceptBtn) #Move Left Button $MoveLftBtn.DataBindings.DefaultDataSourceUpdateMode = 0 $SysDrawPoint = New-Object System.Drawing.Point $SysDrawPoint.X = 255 $SysDrawPoint.Y = 111 $MoveLftBtn.Location = $SysDrawPoint $MoveLftBtn.Name = "MoveLftBtn" $SysDrawSize = New-Object System.Drawing.Size $SysDrawSize.Height = 45 $SysDrawSize.Width = 75 $MoveLftBtn.Size = $SysDrawSize $MoveLftBtn.TabIndex = 3 $MoveLftBtn.Text = "<< Move" $MoveLftBtn.UseVisualStyleBackColor = $True $MoveLftBtn.add_Click($On_MoveLftBtn_Click) $SelectForm.Controls.Add($MoveLftBtn) #Move Right Button $MoveRtBtn.DataBindings.DefaultDataSourceUpdateMode = 0 $MoveRtBtn.Enabled = $True $SysDrawPoint = New-Object System.Drawing.Point $SysDrawPoint.X = 255 $SysDrawPoint.Y = 38 $MoveRtBtn.Location = $SysDrawPoint $MoveRtBtn.Name = "MoveRtBtn" $SysDrawSize = New-Object System.Drawing.Size $SysDrawSize.Height = 45 $SysDrawSize.Width = 75 $MoveRtBtn.Size = $SysDrawSize $MoveRtBtn.TabIndex = 2 $MoveRtBtn.Text = "Move >>" $MoveRtBtn.UseVisualStyleBackColor = $True $MoveRtBtn.add_Click($On_MoveRtBtn_Click) $SelectForm.Controls.Add($MoveRtBtn) #Left Panel original data $lb_OrigList.DataBindings.DefaultDataSourceUpdateMode = 0 $lb_OrigList.FormattingEnabled = $True $SysDrawPoint = New-Object System.Drawing.Point $SysDrawPoint.X = 12 $SysDrawPoint.Y = 2 $lb_OrigList.Location = $SysDrawPoint $lb_OrigList.Name = "listBox1" $SysDrawSize = New-Object System.Drawing.Size $SysDrawSize.Height = 355 $SysDrawSize.Width = 235 $lb_OrigList.Size = $SysDrawSize $lb_OrigList.TabIndex = 0 $lb_origList.SelectionMode = "multiExtended" $SelectForm.Controls.Add($lb_OrigList) #Right Panel new data $lb_NewList.DataBindings.DefaultDataSourceUpdateMode = 0 $lb_NewList.FormattingEnabled = $True $SysDrawPoint = New-Object System.Drawing.Point $SysDrawPoint.X = 344 $SysDrawPoint.Y = 2 $lb_NewList.Location = $SysDrawPoint $lb_NewList.Name = "listBox2" $SysDrawSize = New-Object System.Drawing.Size $SysDrawSize.Height = 355 $SysDrawSize.Width = 235 $lb_NewList.Size = $SysDrawSize $lb_NewList.TabIndex = 1 $lb_NewList.SelectionMode = "multiExtended" $SelectForm.Controls.Add($lb_NewList) #EndRegion Form Code #Save the initial state of the form $InitialFormWindowState = $SelectForm.WindowState #Init the OnLoad event to correct the initial state of the form $SelectForm.add_Load($OnLoadForm_StateCorrection) #Show the Form $SelectForm.ShowDialog()| Out-Null #Return the value from the function if ($Script:NewList[0].Count -eq 0){ Write-Warning "Nothing selected" Exit }ELSE{ $Script:NewList Return } } #End Function ## AD file output, default zone $TZoffset = ([system.timezoneinfo]::local).BaseUtcOffset.Hours $Server = ($env:logonserver).Substring(2)+'.'+$env:userdnsdomain $prompt = "This script exports records from a DNS server from a selected zone(s). `n ` Enter a DC to query name, ENTER or `"OK`" for default, " +$Server Add-Type -assemblyname Microsoft.visualBasic $DNSServer = [Microsoft.VisualBasic.Interaction]::InputBox($prompt, "DNS Server Name", $Server) if ($DNSServer.Length -eq 0){ write-warning "Quitting. No DNS server selected." Break} Function Get-LogPath{ $Script:Logfile = "$env:Userprofile\desktop\"+$DNSServer+'_DNSRecords.csv' $prompt = "Enter log path, ENTER or `"OK`" for default." $Script:Logfile = [Microsoft.VisualBasic.Interaction]::InputBox($prompt, "CSV Log File Path", $Script:Logfile) if ($Script:Logfile.Length -eq 0){ write-warning "Quitting. No path for logfile." Break} if (Test-Path $Script:Logfile) { $prompt = "$Script:Logfile exists. Overwrite it?" $retval = [Microsoft.VisualBasic.Interaction]::MsgBox($prompt,'YesNoCancel,defaultbutton2,Question', "Overwrite Log?") switch ($Retval) { 'Yes' {remove-item $Script:Logfile} 'Cancel' {Exit} 'No' {Get-LogPath} } } } Get-LogPath $Error.Clear() $DNSZones = Get-WmiObject -ComputerName $DNSServer -Namespace Root\MicrosoftDNS -Class "MicrosoftDNS_Zone" -ErrorAction SilentlyContinue | select name | Out-GridView -OutputMode Multiple -Title "Select Zone(s) to Query" if ($error){ $ErMsg = "Error connecting to WMI on $DNSServer`:`n"+$Error[0].Exception.Message write-warning $ErMsg break } #takes care of ok with no selection and cancel if ($DNSZones.name.Length -lt 1){ write-warning "Quitting. No zone selected." break } Write "Getting list of record types ... " $TypeList = Get-WmiObject -ComputerName $DNSServer -Namespace Root\MicrosoftDNS -list | where-object {$_.name -match $class -and $_.name -match ".Type"}| select @{Name="RecordType";Expression={ ($_.name).Replace("MicrosoftDNS_","").Replace("Type","") }} | sort recordtype $props = "IPAddress,OwnerName,RecordData,Status,Timestamp,containername".Split(",") $RecordTypes = Select-TypesForm -InputObject $TypeList -FormTitle "Choose Record Type(s) to Query" foreach ($DNZ in $DNSZones){ foreach ($RecordType in $RecordTypes){ $DNSZone = $DNZ.name.tostring() write "Exporting $RecordType records from the $DnsZone zone..." $WQL = "SELECT * from MicrosoftDNS_"+$recordType+"Type WHERE ContainerName=`'$DNSZone`'" $data = Get-WmiObject -ComputerName $DNSServer -Namespace Root\MicrosoftDNS -Query $WQL $toExport = $data | select @{Name="Name";Expression={$_."Ownername"}}, IPAddress,RecordData, @{Name="RecordType";Expression={"$RecordType"}}, @{Name="Timestamp";Expression={ if ($_.TimeStamp -eq 0){"Static"} ELSE { $hours = $_.Timestamp + $TZoffset ([datetime]"1/1/1601").AddHours($hours)} }}, @{Name="DNSZone";Expression={$_.ContainerName}} $toExport| Export-Csv -NoTypeInformation -Path $Script:Logfile -Append -Force } } Write "Done. Logfile is $Script:Logfile"