Solved

List of primary and Secondary DNS servers in VB.net

Posted on 2004-04-17
6
491 Views
Last Modified: 2007-12-19
Hello,

Can anyone tell me how to get the ip addresses of primary and secondary DNS servers using VB.net. I need this info very urgently.

Thanks a million.

Dheenu
0
Comment
Question by:dheenu27
  • 3
  • 3
6 Comments
 
LVL 41

Accepted Solution

by:
graye earned 500 total points
ID: 10856416
I'd suggest you use Windows Management Instrumentation (WMI)....

The code would look something like this:

' add a reference to System.Management in Solution Explorer
Imports System.management

        Dim wmi As ManagementClass
        Dim obj As ManagementObject
        Dim objs As ManagementObjectCollection

        wmi = New ManagementClass("Win32_NetworkAdapterConfiguration")
        objs = wmi.GetInstances()
        For Each obj In objs
              If Not IsNothing(obj("DNSServerSearchOrder")) AndAlso UBound(obj("DNSServerSearchOrder")) >= 0 Then
                     msgbox("DNS1=" & obj("DNSServerSearchOrder")(0))
              End If
              If Not IsNothing(obj("DNSServerSearchOrder")) AndAlso UBound(obj("DNSServerSearchOrder")) >= 1 Then
                      msgbox("DNS2=" & obj("DNSServerSearchOrder")(1))
              End If
        Next
        objs.Dispose()
        wmi.Dispose()
0
 
LVL 2

Author Comment

by:dheenu27
ID: 10873288
Thanks a lot Graye, that information was really very helpful in my project.

Is there any way to test the DNS servers detected, I mean a sort of ping to validate the detected DNS servers.

Thanks.
0
 
LVL 41

Expert Comment

by:graye
ID: 10873329
I have a VB.Net version of ping.... (shamelessly stolen from the Microsoft examples)

I use it like this:

                Dim Packet As New ICMP_Packet.CPing
                Dim oops as boolean

                oops = False
                Packet.HostName = RemotePC
                If Packet.Open Then
                    ' Establish a socket connection, and then send a packet by using ICMP.
                    retValue = Packet.Ping
                    If retValue < 0 Then
                        oops = True
                        msgbox(RemotePC & ": Host Unreachable")
                    End If
                    Packet.Close()
                Else
                    oops = True
                    msgbox(RemotePC & ": Host Unknown")
                End If

------------------------------------------------------------------------------
Imports System.Net.Sockets
Imports System.Net
Imports System
Imports System.Runtime.InteropServices

Namespace ICMP_Packet

    ' Define the structure of an ICMP packet.
    ' This structure contains packet information.
    Structure IcmpPacket

        Dim type_message As Byte                ' type of message
        Dim subCode_type As Byte                ' type of sub-code
        Dim complement_checkSum As UInt16       ' one's complement checksum for the structure
        Dim identifier As UInt16                ' identifier
        Dim sequenceNumber As UInt16            ' sequence number  
        Dim data() As Byte                      ' data


        Public Sub Initialize(ByVal type As Byte, ByVal subCode As Byte, ByVal payload() As Byte)
            Dim index As Integer
            Dim buffer_icmpPacket() As Byte
            Dim cksumBuffer() As UInt16
            Dim icmpHeaderBufferIndex As Int32 = 0
            Me.type_message = type
            Me.subCode_type = subCode
            complement_checkSum = UInt16.Parse("0")
            identifier = UInt16.Parse("45")
            sequenceNumber = UInt16.Parse("0")
            data = payload

            ' Declare a variable to store the total packet size.
            ' Call the Serialize method to count the total number of bytes in the packet.
            buffer_icmpPacket = Serialize()

            ' Resize a UInt16 array to half the size of the packet.
            ReDim cksumBuffer((buffer_icmpPacket.Length() \ 2) - 1)

            ' Initialize the UInt16 array.
            For index = 0 To (cksumBuffer.Length() - 1)
                cksumBuffer(index) = BitConverter.ToUInt16(buffer_icmpPacket, icmpHeaderBufferIndex)
                icmpHeaderBufferIndex += 2
            Next index

            'Call a method that returns a checksum.
            complement_checkSum = MCheckSum.Calculate(cksumBuffer, cksumBuffer.Length())
        End Sub

        Public Function Size() As Integer
            Return (8 + data.Length())
        End Function

        ' The Serialize method converts the packet to a byte array to calculate the total size.
        Public Function Serialize() As Byte()
            Dim b_seq() As Byte = BitConverter.GetBytes(sequenceNumber)
            Dim b_cksum() As Byte = BitConverter.GetBytes(complement_checkSum)
            Dim b_id() As Byte = BitConverter.GetBytes(identifier)
            Dim index As Int32 = 0
            Dim buffer() As Byte
            ReDim buffer(Size() - 1)

            ' Serialize the structure into the array.
            buffer(0) = type_message
            buffer(1) = subCode_type
            index += 2
            Array.Copy(b_cksum, 0, buffer, index, 2)
            index += 2
            Array.Copy(b_id, 0, buffer, index, 2)
            index += 2
            Array.Copy(b_seq, 0, buffer, index, 2)
            index += 2

            ' Copy the data.
            If (data.Length() > 0) Then
                Array.Copy(data, 0, buffer, index, data.Length())
            End If
            Return buffer
        End Function
    End Structure

    ' The CPing class.
    Public Class CPing

        Private Const DEFAULT_TIMEOUT As Integer = 1000
        Private Const SOCKET_ERROR As Integer = -1
        Private Const PING_ERROR As Integer = -1
        Private Const ICMP_ECHO As Integer = 8
        Private Const DATA_SIZE As Integer = 32
        Private Const RECV_SIZE As Integer = 128

        Private _open As Boolean = False
        Private _initialized As Boolean
        Private _recvBuffer() As Byte
        Private _packet As IcmpPacket
        Private _hostName As String
        Private _server As EndPoint
        Private _local As EndPoint
        Private _socket As Socket

        Public Sub New(ByVal hostName As String)
            Me.HostName() = hostName
            ReDim _recvBuffer(RECV_SIZE - 1)
        End Sub

        Public Sub New()
            ' Set the default host name to the local host.
            Me.HostName() = Dns.GetHostName()
            ReDim _recvBuffer(RECV_SIZE - 1)
        End Sub

        Private Overloads Sub finalize()
            ' Ensure that you close the socket.
            Me.Close()
            Erase _recvBuffer
        End Sub

        ' Get and set the current host name.
        Public Property HostName() As String
            Get
                Return _hostName
            End Get
            Set(ByVal Value As String)
                _hostName = Value
                ' If the CPing object is already open, close it and then reopen it by using a new host name.
                If (_open) Then
                    Me.Close()
                    Me.Open()
                End If
            End Set
        End Property

        ' Get the state (open or closed).
        Public ReadOnly Property IsOpen() As Boolean
            Get
                Return _open
            End Get
        End Property

        ' Create a socket to host remote end points and local end points.
        Public Function Open() As Boolean
            Dim payload() As Byte

            If (Not _open) Then
                Try
                    ' Initialize the packet.
                    ReDim payload(DATA_SIZE)
                    _packet.Initialize(ICMP_ECHO, 0, payload)

                    ' Initialize an ICMP socket.
                    _socket = New Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp)

                    ' Set the server end point.
                    If _hostName.ToLower.IndexOfAny("abcdefghijklmnopqrstuvwxyz-") >= 0 Then
                        _server = New IPEndPoint(Dns.GetHostByName(_hostName).AddressList(0), 0)
                    Else
                        _server = New IPEndPoint(IPAddress.Parse(_hostName), 0)
                    End If

                    ' Set the receiving end point as your client computer.
                    _local = New IPEndPoint(Dns.GetHostByName(Dns.GetHostName()).AddressList(0), 0)
                    _open = True
                Catch
                    Return False
                End Try
            End If
            Return True
        End Function

        ' Destroy the socket and end points (if necessary).
        Public Function Close() As Boolean
            If (_open) Then
                _socket.Close()
                _socket = Nothing
                _server = Nothing
                _local = Nothing
                _open = False
            End If
            Return True
        End Function

        ' Perform a PING operation.
        Public Overloads Function Ping() As Integer
            Return Ping(DEFAULT_TIMEOUT)
        End Function

        ' The Ping method performs a PING operation.
        Public Overloads Function Ping(ByVal timeOutMilliSeconds As Integer) As Integer

            ' Initialize the time-out value.
            Dim timeOut As Integer = timeOutMilliSeconds + Environment.TickCount()

            ' Send the packet.
            Try
                If (SOCKET_ERROR = _socket.SendTo(_packet.Serialize(), _packet.Size(), 0, _server)) Then
                    Return PING_ERROR
                End If
            Catch
                Return PING_ERROR
            End Try

            ' Use the following loop to check the response time until you receive a time-out.
            Do
                ' Poll the read buffer every millisecond.
                ' If data exists, read the data and return the round-trip time.
                If (_socket.Poll(1000, SelectMode.SelectRead)) Then
                    _socket.ReceiveFrom(_recvBuffer, RECV_SIZE, 0, _local)
                    Return (timeOutMilliSeconds - (timeOut - Environment.TickCount()))
                ElseIf (Environment.TickCount() >= timeOut) Then
                    Return PING_ERROR
                End If
            Loop While (True)
        End Function
    End Class

    ' The MCheckSum module contains the static Calculate method.
    Module MCheckSum
        <StructLayout(LayoutKind.Explicit)> _
                   Structure UNION_INT16
            <FieldOffset(0)> Dim lsb As Byte      ' Least significant byte
            <FieldOffset(1)> Dim msb As Byte      ' Most significant byte
            <FieldOffset(0)> Dim w16 As Short
        End Structure

        <StructLayout(LayoutKind.Explicit)> _
        Structure UNION_INT32
            <FieldOffset(0)> Dim lsw As UNION_INT16     ' Most significant word
            <FieldOffset(2)> Dim msw As UNION_INT16     ' Least significant word
            <FieldOffset(0)> Dim w32 As Integer
        End Structure

        ' The Calculate method calculates the checksum value.
        Public Function Calculate(ByRef buffer() As UInt16, ByVal size As Int32) As UInt16
            Dim counter As Int32 = 0
            Dim cksum32 As UNION_INT32
            Do While (size > 0)
                cksum32.w32 += Convert.ToInt32(buffer(counter))
                counter += 1
                size -= 1
            Loop

            cksum32.w32 = cksum32.msw.w16 + cksum32.lsw.w16 + cksum32.msw.w16
            Return Convert.ToUInt16(cksum32.lsw.w16 Xor &HFFFF)
        End Function
    End Module
End Namespace


0
Maximize Your Threat Intelligence Reporting

Reporting is one of the most important and least talked about aspects of a world-class threat intelligence program. Here’s how to do it right.

 
LVL 2

Author Comment

by:dheenu27
ID: 10885126
I tried using your code. I copied the namespace thing in a different class and used the above code to ping the dns servers.

but even when the DNS servers are reachable it says"host unreachable". i tried changing this Unreachable to Reachable thinking it is a typo. But this didnt serve my purpose. i entered some random ip address, and it said host reachable.
is the logic correct ?

thanks.....  waiting for your help.
0
 
LVL 41

Expert Comment

by:graye
ID: 10888073
That's odd... I copied that right out of a program that I wrote.   So, unless the "copy and paste" failed somehow, I'd think the code was correct as is.

A successful ping (using the code snipet posted above) doesn't return anything at all...
0
 
LVL 2

Author Comment

by:dheenu27
ID: 10894864
Thanx!!
0

Featured Post

How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

Join & Write a Comment

This tutorial demonstrates one way to create an application that runs without any Forms but still has a GUI presence via an Icon in the System Tray. The magic lies in Inheriting from the ApplicationContext Class and passing that to Application.Ru…
A while ago, I was working on a Windows Forms application and I needed a special label control with reflection (glass) effect to show some titles in a stylish way. I've always enjoyed working with graphics, but it's never too clever to re-invent …
It is a freely distributed piece of software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages.
Excel styles will make formatting consistent and let you apply and change formatting faster. In this tutorial, you'll learn how to use Excel's built-in styles, how to modify styles, and how to create your own. You'll also learn how to use your custo…

760 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

21 Experts available now in Live!

Get 1:1 Help Now