Solved

List of primary and Secondary DNS servers in VB.net

Posted on 2004-04-17
6
502 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
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 
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

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

1.0 - Introduction Converting Visual Basic 6.0 (VB6) to Visual Basic 2008+ (VB.NET). If ever there was a subject full of murkiness and bad decisions, it is this one!   The first problem seems to be that people considering this task of converting…
Calculating holidays and working days is a function that is often needed yet it is not one found within the Framework. This article presents one approach to building a working-day calculator for use in .NET.
Along with being a a promotional video for my three-day Annielytics Dashboard Seminor, this Micro Tutorial is an intro to Google Analytics API data.
As a trusted technology advisor to your customers you are likely getting the daily question of, ‘should I put this in the cloud?’ As customer demands for cloud services increases, companies will see a shift from traditional buying patterns to new…

911 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

26 Experts available now in Live!

Get 1:1 Help Now