'IN A MODULE
Option Explicit
Public Type SERVER_INFO_100
sv100_platform_id As Long
sv100_name As Long
End Type
Public Const SV_TYPE_DOMAIN_ENUM As Long = &H80000000
Public Const SV_TYPE_ALL As Long = &HFFFFFFFF
Public Const MAX_PREFERRED_LENGTH As Long = -1
Public Const NERR_SUCCESS As Long = 0&
Public Const ERROR_REQ_NOT_ACCEP = 71&
Public Const ERROR_MORE_DATA As Long = 234&
Public Const NERR_BASE = 2100
Public Const NERR_InvalidComputer = (NERR_BASE + 251)
Public Declare Function NetServerEnum Lib "netapi32" (ByVal servername As Long, ByVal level As Long, buf As Any, _
ByVal prefmaxlen As Long, entriesread As Long, totalentries As Long, ByVal servertype As Long, ByVal domain As Long, _
resume_handle As Long) As Long
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pTo As Any, uFrom As Any, ByVal lSize As Long)
Public Declare Function NetApiBufferFree Lib "netapi32" (ByVal Buffer As Long) As Long
Public Declare Function lstrlenW Lib "kernel32" (ByVal lpString As Long) As Long
Public Function GetServers(sDomain As String, sType As Long) As String()
Dim bufptr As Long
Dim dwEntriesread As Long
Dim dwTotalentries As Long
Dim dwResumehandle As Long
Dim se100 As SERVER_INFO_100
Dim success As Long
Dim nStructSize As Long
Dim Cnt As Long
nStructSize = LenB(se100)
success = NetServerEnum(0&, 100, bufptr, MAX_PREFERRED_LENGTH, dwEntriesread, dwTotalentries, sType, StrPtr(sDomain), dwResumehandle)
'success = 71 'NO ACTIVE 'DOMAIN'
If success = NERR_SUCCESS And success <> ERROR_MORE_DATA Then
Dim compNames() As String
ReDim compNames(dwEntriesread)
For Cnt = 0 To dwEntriesread - 1
CopyMemory se100, ByVal bufptr + (nStructSize * Cnt), nStructSize
compNames(Cnt) = GetPointerToByteStringW(se100.sv100_name)
DoEvents
Next
End If
Call NetApiBufferFree(bufptr)
GetServers = compNames
End Function
Public Function GetPointerToByteStringW(ByVal dwData As Long) As String
Dim tmp() As Byte
Dim tmplen As Long
If dwData <> 0 Then
tmplen = lstrlenW(dwData) * 2
If tmplen <> 0 Then
ReDim tmp(0 To (tmplen - 1)) As Byte
CopyMemory tmp(0), ByVal dwData, tmplen
GetPointerToByteStringW = tmp
End If
End If
End Function
'BEHIND A FORM WITH TWO COMBOS (cboDomain AND cboComputer)
Private Sub Form_Load()
Dim compNames() As String
Dim x As Integer
'SETUP THE DOMAIN COMBO BOX
compNames = GetServers(vbNullString, SV_TYPE_DOMAIN_ENUM)
For x = LBound(compNames) To UBound(compNames) - 1
cboDomain.AddItem compNames(x)
Next
cboDomain.ListIndex = 0
End Sub
Private Sub cboDomain_Click()
'NEED TO CLEAR CBOCOMPUTER AND RELOAD WITH COMPUTERS IN THE NEWLY SELECTED DOMAIN
'SETUP THE COMPUTER COMBO BOX
On Error GoTo No_Bugs
Dim compNames() As String
Dim x As Integer
cboComputer.Clear
x = 0
compNames = GetServers(cboDomain.Text, SV_TYPE_ALL)
If UBound(compNames) > 0 Then
For x = LBound(compNames) To UBound(compNames) - 1
cboComputer.AddItem compNames(x)
Next
cboComputer.ListIndex = 0
End If
Exit Sub
No_Bugs:
If Err.Number = "9" Then
cboDomain.RemoveItem (cboDomain.ListIndex)
cboDomain.ListIndex = 0
compNames = GetServers(cboDomain.Text, SV_TYPE_ALL)
Resume
Else
MsgBox Err.Number & " - " & Err.Description, vbOKOnly + vbExclamation, App.ProductName
End If
End Sub