下面代码中的 Private Const SV_TYPE_SQLSERVER As Long = &H4 代表 SQL Server ================================================================== Enumerating Servers and Machines in a Domain with Version InfoTo a form add a command button (Command1), a combo (Combo1) and list (List1). Add the following to the form: Private Const MAX_PREFERRED_LENGTH As Long = -1 Private Const NERR_SUCCESS As Long = 0& Private Const ERROR_MORE_DATA As Long = 234&Private Const SV_TYPE_WORKSTATION As Long = &H1 Private Const SV_TYPE_SERVER As Long = &H2 Private Const SV_TYPE_SQLSERVER As Long = &H4 Private Const SV_TYPE_DOMAIN_CTRL As Long = &H8 Private Const SV_TYPE_DOMAIN_BAKCTRL As Long = &H10 Private Const SV_TYPE_TIME_SOURCE As Long = &H20 Private Const SV_TYPE_AFP As Long = &H40 Private Const SV_TYPE_NOVELL As Long = &H80 Private Const SV_TYPE_DOMAIN_MEMBER As Long = &H100 Private Const SV_TYPE_PRINTQ_SERVER As Long = &H200 Private Const SV_TYPE_DIALIN_SERVER As Long = &H400 Private Const SV_TYPE_XENIX_SERVER As Long = &H800 Private Const SV_TYPE_SERVER_UNIX As Long = SV_TYPE_XENIX_SERVER Private Const SV_TYPE_NT As Long = &H1000 Private Const SV_TYPE_WFW As Long = &H2000 Private Const SV_TYPE_SERVER_MFPN As Long = &H4000 Private Const SV_TYPE_SERVER_NT As Long = &H8000 Private Const SV_TYPE_POTENTIAL_BROWSER As Long = &H10000 Private Const SV_TYPE_BACKUP_BROWSER As Long = &H20000 Private Const SV_TYPE_MASTER_BROWSER As Long = &H40000 Private Const SV_TYPE_DOMAIN_MASTER As Long = &H80000 Private Const SV_TYPE_SERVER_OSF As Long = &H100000 Private Const SV_TYPE_SERVER_VMS As Long = &H200000 Private Const SV_TYPE_WINDOWS As Long = &H400000 'Windows95 + Private Const SV_TYPE_DFS As Long = &H800000 'Root of a DFS tree Private Const SV_TYPE_CLUSTER_NT As Long = &H1000000 'NT Cluster Private Const SV_TYPE_TERMINALSERVER As Long = &H2000000 'Terminal Server Private Const SV_TYPE_DCE As Long = &H10000000'IBM DSS Private Const SV_TYPE_ALTERNATE_XPORT As Long = &H20000000'return alternate transport Private Const SV_TYPE_LOCAL_LIST_ONLY As Long = &H40000000'return local only Private Const SV_TYPE_DOMAIN_ENUM As Long = &H80000000 Private Const SV_TYPE_ALL As Long = &HFFFFFFFFPrivate Const SV_PLATFORM_ID_OS2 As Long = 400 Private Const SV_PLATFORM_ID_NT As Long = 500Private Const PLATFORM_ID_DOS As Long = 300 Private Const PLATFORM_ID_OS2 As Long = 400 Private Const PLATFORM_ID_NT As Long = 500 Private Const PLATFORM_ID_OSF As Long = 600 Private Const PLATFORM_ID_VMS As Long = 700'Mask applied to svX_version_major in 'order to obtain the major version number Private Const MAJOR_VERSION_MASK As Long = &HFPrivate Type SERVER_INFO_101 sv101_platform_id As Long sv101_name As Long sv101_version_major As Long sv101_version_minor As Long sv101_type As Long sv101_comment As Long End TypePrivate 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 LongPrivate Declare Function NetApiBufferFree Lib "netapi32" _ (ByVal Buffer As Long) As LongPrivate Declare Sub CopyMemory Lib "kernel32" _ Alias "RtlMoveMemory" _ (pTo As Any, uFrom As Any, _ ByVal lSize As Long)
Private Declare Function lstrlenW Lib "kernel32" _ (ByVal lpString As Long) As LongPrivate Sub Form_Load() Command1.Caption = "Net Server Enum"
With Combo1 .AddItem "All servers" .ItemData(.NewIndex) = SV_TYPE_ALL
'os-specific .AddItem "NT/2000 workstations or servers" .ItemData(.NewIndex) = SV_TYPE_NT
.AddItem "Windows 95 or later" .ItemData(.NewIndex) = SV_TYPE_WINDOWS
.AddItem "Servers running Windows for Workgroups" .ItemData(.NewIndex) = SV_TYPE_WFW
.AddItem "NT/2000 servers not domain controller" .ItemData(.NewIndex) = SV_TYPE_SERVER_NT
.AddItem "Servers maintained by the browser" .ItemData(.NewIndex) = SV_TYPE_LOCAL_LIST_ONLY
.AddItem "Primary Domain (ignore version info)" .ItemData(.NewIndex) = SV_TYPE_DOMAIN_ENUM
.ListIndex = 0
End With
End SubPrivate Sub Combo1_Click() Call GetServers(vbNullString)
End Sub Private Sub Command1_Click() Call GetServers(vbNullString)
End Sub Private Function GetServers(sDomain As String) As Long 'lists all servers of the specified type 'that are visible in a domain. Dim bufptr As Long Dim dwEntriesread As Long Dim dwTotalentries As Long Dim dwResumehandle As Long Dim dwServertype As Long Dim se101 As SERVER_INFO_101 Dim success As Long Dim nStructSize As Long Dim cnt As Long nStructSize = LenB(se101) dwServertype = Combo1.ItemData(Combo1.ListIndex)
List1.Clear success = NetServerEnum(0&, _ 101, _ bufptr, _ MAX_PREFERRED_LENGTH, _ dwEntriesread, _ dwTotalentries, _ dwServertype, _ 0&, _ dwResumehandle) 'if all goes well If success = NERR_SUCCESS And _ success <> ERROR_MORE_DATA Then
'loop through the returned data, adding each 'machine to the list For cnt = 0 To dwEntriesread - 1
'get one chunk of data and cast 'into an SERVER_INFO_101 struct 'in order to add the name to a list CopyMemory se101, ByVal bufptr + (nStructSize * cnt), nStructSize
'clean up, regardless of success Call NetApiBufferFree(bufptr)
GetServers = dwEntriesreadEnd Function Private Function GetPlatformString(ByVal dwPlatformID As Long) As String Select Case dwPlatformID Case PLATFORM_ID_DOS: GetPlatformString = "DOS" Case PLATFORM_ID_OS2: GetPlatformString = "Windows" Case PLATFORM_ID_NT: GetPlatformString = "Windows NT" Case PLATFORM_ID_OSF: GetPlatformString = "OSF" Case PLATFORM_ID_VMS: GetPlatformString = "VMS" End Select
End Function Private 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
Dim osqlserverdmoapp As New SQLDMO.Application For i = 1 To osqlserverdmoapp.ListAvailableSQLServers.Count Debug.Print osqlserverdmoapp.ListAvailableSQLServers.Item(1) Next i Set osqlserverdmoapp = Nothing
Private Const SV_TYPE_SQLSERVER As Long = &H4
代表 SQL Server
==================================================================
Enumerating Servers and Machines in a Domain with Version InfoTo a form add a command button (Command1), a combo (Combo1) and list (List1). Add the following to the form:
Private Const MAX_PREFERRED_LENGTH As Long = -1
Private Const NERR_SUCCESS As Long = 0&
Private Const ERROR_MORE_DATA As Long = 234&Private Const SV_TYPE_WORKSTATION As Long = &H1
Private Const SV_TYPE_SERVER As Long = &H2
Private Const SV_TYPE_SQLSERVER As Long = &H4
Private Const SV_TYPE_DOMAIN_CTRL As Long = &H8
Private Const SV_TYPE_DOMAIN_BAKCTRL As Long = &H10
Private Const SV_TYPE_TIME_SOURCE As Long = &H20
Private Const SV_TYPE_AFP As Long = &H40
Private Const SV_TYPE_NOVELL As Long = &H80
Private Const SV_TYPE_DOMAIN_MEMBER As Long = &H100
Private Const SV_TYPE_PRINTQ_SERVER As Long = &H200
Private Const SV_TYPE_DIALIN_SERVER As Long = &H400
Private Const SV_TYPE_XENIX_SERVER As Long = &H800
Private Const SV_TYPE_SERVER_UNIX As Long = SV_TYPE_XENIX_SERVER
Private Const SV_TYPE_NT As Long = &H1000
Private Const SV_TYPE_WFW As Long = &H2000
Private Const SV_TYPE_SERVER_MFPN As Long = &H4000
Private Const SV_TYPE_SERVER_NT As Long = &H8000
Private Const SV_TYPE_POTENTIAL_BROWSER As Long = &H10000
Private Const SV_TYPE_BACKUP_BROWSER As Long = &H20000
Private Const SV_TYPE_MASTER_BROWSER As Long = &H40000
Private Const SV_TYPE_DOMAIN_MASTER As Long = &H80000
Private Const SV_TYPE_SERVER_OSF As Long = &H100000
Private Const SV_TYPE_SERVER_VMS As Long = &H200000
Private Const SV_TYPE_WINDOWS As Long = &H400000 'Windows95 +
Private Const SV_TYPE_DFS As Long = &H800000 'Root of a DFS tree
Private Const SV_TYPE_CLUSTER_NT As Long = &H1000000 'NT Cluster
Private Const SV_TYPE_TERMINALSERVER As Long = &H2000000 'Terminal Server
Private Const SV_TYPE_DCE As Long = &H10000000'IBM DSS
Private Const SV_TYPE_ALTERNATE_XPORT As Long = &H20000000'return alternate transport
Private Const SV_TYPE_LOCAL_LIST_ONLY As Long = &H40000000'return local only
Private Const SV_TYPE_DOMAIN_ENUM As Long = &H80000000
Private Const SV_TYPE_ALL As Long = &HFFFFFFFFPrivate Const SV_PLATFORM_ID_OS2 As Long = 400
Private Const SV_PLATFORM_ID_NT As Long = 500Private Const PLATFORM_ID_DOS As Long = 300
Private Const PLATFORM_ID_OS2 As Long = 400
Private Const PLATFORM_ID_NT As Long = 500
Private Const PLATFORM_ID_OSF As Long = 600
Private Const PLATFORM_ID_VMS As Long = 700'Mask applied to svX_version_major in
'order to obtain the major version number
Private Const MAJOR_VERSION_MASK As Long = &HFPrivate Type SERVER_INFO_101
sv101_platform_id As Long
sv101_name As Long
sv101_version_major As Long
sv101_version_minor As Long
sv101_type As Long
sv101_comment As Long
End TypePrivate 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 LongPrivate Declare Function NetApiBufferFree Lib "netapi32" _
(ByVal Buffer As Long) As LongPrivate Declare Sub CopyMemory Lib "kernel32" _
Alias "RtlMoveMemory" _
(pTo As Any, uFrom As Any, _
ByVal lSize As Long)
Private Declare Function lstrlenW Lib "kernel32" _
(ByVal lpString As Long) As LongPrivate Sub Form_Load() Command1.Caption = "Net Server Enum"
With Combo1
.AddItem "All servers"
.ItemData(.NewIndex) = SV_TYPE_ALL
'os-specific
.AddItem "NT/2000 workstations or servers"
.ItemData(.NewIndex) = SV_TYPE_NT
.AddItem "Windows 95 or later"
.ItemData(.NewIndex) = SV_TYPE_WINDOWS
.AddItem "Servers running Windows for Workgroups"
.ItemData(.NewIndex) = SV_TYPE_WFW
.AddItem "Servers running Unix"
.ItemData(.NewIndex) = SV_TYPE_SERVER_UNIX
'function-specific
.AddItem "LAN Manager workstations"
.ItemData(.NewIndex) = SV_TYPE_WORKSTATION
.AddItem "LAN Manager servers"
.ItemData(.NewIndex) = SV_TYPE_SERVER
.AddItem "NT/2000 servers not domain controller"
.ItemData(.NewIndex) = SV_TYPE_SERVER_NT
.AddItem "Servers maintained by the browser"
.ItemData(.NewIndex) = SV_TYPE_LOCAL_LIST_ONLY
.AddItem "Primary Domain (ignore version info)"
.ItemData(.NewIndex) = SV_TYPE_DOMAIN_ENUM
.ListIndex = 0
End With
End SubPrivate Sub Combo1_Click() Call GetServers(vbNullString)
End Sub
Private Sub Command1_Click() Call GetServers(vbNullString)
End Sub
Private Function GetServers(sDomain As String) As Long 'lists all servers of the specified type
'that are visible in a domain.
Dim bufptr As Long
Dim dwEntriesread As Long
Dim dwTotalentries As Long
Dim dwResumehandle As Long
Dim dwServertype As Long
Dim se101 As SERVER_INFO_101
Dim success As Long
Dim nStructSize As Long
Dim cnt As Long nStructSize = LenB(se101)
dwServertype = Combo1.ItemData(Combo1.ListIndex)
List1.Clear
success = NetServerEnum(0&, _
101, _
bufptr, _
MAX_PREFERRED_LENGTH, _
dwEntriesread, _
dwTotalentries, _
dwServertype, _
0&, _
dwResumehandle) 'if all goes well
If success = NERR_SUCCESS And _
success <> ERROR_MORE_DATA Then
'loop through the returned data, adding each
'machine to the list
For cnt = 0 To dwEntriesread - 1
'get one chunk of data and cast
'into an SERVER_INFO_101 struct
'in order to add the name to a list
CopyMemory se101, ByVal bufptr + (nStructSize * cnt), nStructSize
List1.AddItem GetPointerToByteStringW(se101.sv101_name) & vbTab & _
GetPlatformString(se101.sv101_platform_id) & " " & _
(se101.sv101_version_major And MAJOR_VERSION_MASK) & "." & _
se101.sv101_version_minor
Next
End If
'clean up, regardless of success
Call NetApiBufferFree(bufptr)
GetServers = dwEntriesreadEnd Function
Private Function GetPlatformString(ByVal dwPlatformID As Long) As String Select Case dwPlatformID
Case PLATFORM_ID_DOS: GetPlatformString = "DOS"
Case PLATFORM_ID_OS2: GetPlatformString = "Windows"
Case PLATFORM_ID_NT: GetPlatformString = "Windows NT"
Case PLATFORM_ID_OSF: GetPlatformString = "OSF"
Case PLATFORM_ID_VMS: GetPlatformString = "VMS"
End Select
End Function
Private 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
利用API获得当前网络中的所有计算机名称以及获得当前可用的服务器、SQL服务器、RAS服务器的名称、属性等。在Win2K下运行,Win9X下部分功能不支持。
For i = 1 To osqlserverdmoapp.ListAvailableSQLServers.Count
Debug.Print osqlserverdmoapp.ListAvailableSQLServers.Item(1)
Next i
Set osqlserverdmoapp = Nothing
不错不错。
收 !!