Imports System.Runtime.InteropServices
Module Module1
Private Enum Flags As Integer
DS_FLAGS_NONE = &H0
DS_FORCE_REDISCOVERY = &H1
DS_DIRECTORY_SERVICE_REQUIRED = &H10
DS_DIRECTORY_SERVICE_PREFERRED = &H20
DS_GC_SERVER_REQUIRED = &H40
DS_PDC_REQUIRED = &H80
DS_BACKGROUND_ONLY = &H100
DS_IP_REQUIRED = &H200
DS_KDC_REQUIRED = &H400
DS_TIMESERV_REQUIRED = &H800
DS_WRITABLE_REQUIRED = &H1000
DS_GOOD_TIMESERV_PREFERRED = &H2000
DS_AVOID_SELF = &H4000
DS_ONLY_LDAP_NEEDED = &H8000
DS_IS_FLAT_NAME = &H10000
DS_IS_DNS_NAME = &H20000
DS_RETURN_DNS_NAME = &H40000000
DS_RETURN_FLAT_NAME = &H80000000
End Enum
Private Enum AddressTypes As UInteger
DS_INET_ADDRESS = 1
DS_NETBIOS_ADDRESS = 2
End Enum
Sub Main()
Dim pDCI As IntPtr = IntPtr.Zero
Dim dcName As DOMAIN_CONTROLLER_INFO = Nothing
Console.WriteLine("Enter the domain to query:")
Dim Domain As String = Console.ReadLine
If Domain = "" Then End
Dim retval As Integer = DsGetDcName("", Domain, 0, "", Flags.DS_FLAGS_NONE, pDCI)
If retval = 0 Then
NetApiBufferFree(pDCI)
dcName = Marshal.PtrToStructure(pDCI, GetType(DOMAIN_CONTROLLER_INFO))
Console.WriteLine("Domain Controller Name: " & dcName.DomainControllerName)
Console.WriteLine("Domain Controller Address: " & dcName.DomainControllerAddress)
Console.WriteLine("Domain Controller Address Type: " & dcName.DomainControllerAddressType.ToString)
Console.WriteLine("Domain Guid: " & dcName.DomainGuid.ToString)
Console.WriteLine("Domain Name: " & dcName.DomainName)
Console.WriteLine("DNS Forest Name: " & dcName.DnsForestName)
Console.WriteLine("Domain Controller Site Name: " & dcName.DcSiteName)
Console.WriteLine("Client Site Name: " & dcName.ClientSiteName)
Console.WriteLine("Flags Passed: " & dcName.Flags)
Console.WriteLine()
Console.WriteLine("Any key to exit")
Console.ReadKey()
Else
Stop
End If
End Sub
Private Structure DOMAIN_CONTROLLER_INFO
<MarshalAs(UnmanagedType.LPWStr)> Dim DomainControllerName As String
<MarshalAs(UnmanagedType.LPWStr)> Dim DomainControllerAddress As String
<MarshalAs(UnmanagedType.U4)> Dim DomainControllerAddressType As AddressTypes
Dim DomainGuid As System.Guid
<MarshalAs(UnmanagedType.LPWStr)> Dim DomainName As String
<MarshalAs(UnmanagedType.LPWStr)> Dim DnsForestName As String
<MarshalAs(UnmanagedType.U4)> Dim Flags As Flags
<MarshalAs(UnmanagedType.LPWStr)> Dim DcSiteName As String
<MarshalAs(UnmanagedType.LPWStr)> Dim ClientSiteName As String
End Structure
<DllImport("Netapi32.dll", CharSet:=CharSet.Unicode)> Private Function DsGetDcName( _
ByVal ComputerName As String, _
ByVal DomainName As String, _
ByVal DomainGuid As Integer, _
ByVal SiteName As String, _
ByVal Flags As Flags, _
ByRef pDOMAIN_CONTROLLER_INFO As IntPtr) As Integer
End Function
<DllImport("Netapi32.dll")> Private Function NetApiBufferFree(ByRef buffer As IntPtr) As Integer
End Function
End Module