Как получить список имен компьютеров локальной сети

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

kav
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 18.10.2004 (Пн) 10:55

Как получить список имен компьютеров локальной сети

Сообщение kav » 17.07.2006 (Пн) 14:56

Уважаемые, подскажите как получить список (лучше NETBIOS) имен компьютеров локальной сети, все переыл а путного не нашел.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 17.07.2006 (Пн) 15:14

Либо поиск здесь, либо поиск в MSDN по именам функций начинающихся с Net
Весь мир матрица, а мы в нем потоки байтов!

kav
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 18.10.2004 (Пн) 10:55

Сообщение kav » 17.07.2006 (Пн) 15:18

Смотрел, но не шашел, мне бы примерчик какой

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 17.07.2006 (Пн) 15:31

Как это ты искал интересно знать? Например вот тут есть зерно истины http://bbs.vbstreets.ru/viewtopic.php?t=24184 Или вот функция NetServerEnum. И вообще вопрос этот жевался неоднократно
Весь мир матрица, а мы в нем потоки байтов!

kav
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 18.10.2004 (Пн) 10:55

Сообщение kav » 17.07.2006 (Пн) 15:39

это видимо api, я думал у vb что то есть свое

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 17.07.2006 (Пн) 15:43

это именно API, в самом VB.NET почему то функция возвращающая список компов локальной сети отсутствует.
Весь мир матрица, а мы в нем потоки байтов!

kav
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 18.10.2004 (Пн) 10:55

Сообщение kav » 17.07.2006 (Пн) 16:11

это видимо функция netapi32.dll, а есть ли описание этой библиотеки и как ее подключить?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 18.07.2006 (Вт) 8:07

Эта функция оттуда, описание есть (с примерами) в MSDN. Стоит поглядетью
Ее не надо подключать, ее надо правильно объявлять (функцию естественно). Например так:

Код: Выделить всё
<Flags()> Public Enum ServerType As Integer
    SV_TYPE_WORKSTATION = &H1
    SV_TYPE_SERVER = &H2
    SV_TYPE_SQLSERVER = &H4
    SV_TYPE_DOMAIN_CTRL = &H8
    SV_TYPE_DOMAIN_BAKCTRL = &H10
    SV_TYPE_TIME_SOURCE = &H20
    SV_TYPE_AFP = &H40
    SV_TYPE_NOVELL = &H80
    SV_TYPE_DOMAIN_MEMBER = &H100
    SV_TYPE_PRINTQ_SERVER = &H200
    SV_TYPE_DIALIN_SERVER = &H400
    SV_TYPE_XENIX_SERVER = &H800
    SV_TYPE_SERVER_UNIX = SV_TYPE_XENIX_SERVER
    SV_TYPE_NT = &H1000
    SV_TYPE_WFW = &H2000
    SV_TYPE_SERVER_MFPN = &H4000
    SV_TYPE_SERVER_NT = &H8000
    SV_TYPE_POTENTIAL_BROWSER = &H10000
    SV_TYPE_BACKUP_BROWSER = &H20000
    SV_TYPE_MASTER_BROWSER = &H40000
    SV_TYPE_DOMAIN_MASTER = &H80000
    SV_TYPE_SERVER_OSF = &H100000
    SV_TYPE_SERVER_VMS = &H200000
    SV_TYPE_WINDOWS = &H400000                 ' Windows95 and above '
    SV_TYPE_DFS = &H800000                     ' Root of a DFS tree '
    SV_TYPE_CLUSTER_NT = &H1000000             ' NT Cluster '
    SV_TYPE_TERMINALSERVER = &H2000000         ' Terminal Server(Hydra) '
    SV_TYPE_CLUSTER_VS_NT = &H4000000          ' NT Cluster Virtual Server Name '
    SV_TYPE_DCE = &H10000000                   ' IBM DSS (Directory and Security Services) or equivalent '
    SV_TYPE_ALTERNATE_XPORT = &H20000000       ' return list for alternate transport '
    SV_TYPE_LOCAL_LIST_ONLY = &H40000000       ' Return local list only '
    SV_TYPE_DOMAIN_ENUM = &H80000000
    SV_TYPE_ALL = &HFFFFFFFF                   ' handy for NetServerEnum2 '
End Enum


<DllImport("Netapi32.dll")> Private Shared Function NetServerEnum(ByVal servername As String, ByVal level As Integer, ByRef bufptr As IntPtr, ByVal prefmaxlen As Integer, ByRef entriesread As Integer, ByRef totalentries As Integer, ByVal servertype As ServerType, ByVal domain As String, ByRef resume_handle As Integer) As Integer


Пример использования лучше посмотреть в MSDN. Там правда сишный код, но особых сложностей нет. Готовый пример дать не могу, поскольку у меня использование этой функции забито в класс, который делает еще много чего нужного, а выкидывать лишнее лениво.
Весь мир матрица, а мы в нем потоки байтов!

kav
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 18.10.2004 (Пн) 10:55

Сообщение kav » 18.07.2006 (Вт) 13:19

Вот что вышло, только дает нули в именах хостов:
Const ERROR_SUCCESS = 0
Const ERROR_MORE_DATA = 234
Const SIZE_SI_101 = 24
Const SV_TYPE_SERVER = &H2 'или &H1

Structure SERVER_INFO_100
Dim sv100_platform_id As Integer 'DWORD
Dim sv100_name As Integer 'LPWSTR
End Structure

Private Declare Function NetServerEnum Lib "netapi32" (ByVal servername As String, ByVal level As Integer, ByRef bufptr As Integer, ByVal prefmaxlen As Integer, ByRef entriesread As Integer, ByRef totalentries As Integer, ByVal servertype As Integer, ByVal domain As String, ByRef resume_handle As Integer) As Integer

Private Declare Function NetApiBufferFree Lib "netapi32.dll" (ByVal bufptr As Integer) As Integer

Private Declare Sub RtlMoveMemory Lib "KERNEL32" (ByVal hpvDest As SERVER_INFO_100, ByVal hpvSource As Long, ByVal cbCopy As Long)

Private Declare Function lstrcpyW Lib "KERNEL32" (ByVal lpszDest As String, ByVal lpszSrc As Long) As Long

Private Function PointerToString(ByVal lpszString As Long) As String

Dim ascii As New ASCIIEncoding

Dim unicodeString As String = lpszString

' Save positions of the special characters for later reference.
Dim indexOfPi As Integer = unicodeString.IndexOf(ChrW(928))
Dim indexOfSigma As Integer = unicodeString.IndexOf(ChrW(931))

Dim encodedBytes As Byte() = ascii.GetBytes(unicodeString)
Dim b As Byte
For Each b In encodedBytes
'Console.Write("[{0}]", b)
Next b
'Console.WriteLine()

' Notice that the special characters have been replaced with
' the value 63, which is the ASCII character code for '?'.
'Console.WriteLine()
'Console.WriteLine("Value at position of Pi character: {0}", encodedBytes(indexOfPi))
'Console.WriteLine("Value at position of Sigma character: {0}", encodedBytes(indexOfSigma))

' Decode bytes back to string.
' Notice missing Pi and Sigma characters.
Dim decodedString As String = ascii.GetString(encodedBytes)
'Console.WriteLine()
'Console.WriteLine("Decoded bytes:")
'Console.WriteLine(decodedString)
PointerToString = decodedString

End Function

Private Sub frmAddHost_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim servername As String = vbNullString
Dim level As Integer = 100
Dim bufptr As Integer = 0
Dim prefmaxlen As Integer = &HFFFFFFFF
Dim entriesread As Integer = 0
Dim totalentries As Integer = 0
Dim domain As String = vbNullString
Dim servertype = SV_TYPE_SERVER
Dim resume_handle As Integer = 0
Dim ServerInfo As New SERVER_INFO_100
Dim res As Integer
'Dim SIZE_SI_100 As Long

Dim tmpbufptr As Integer
Dim i As Integer

'SIZE_SI_100 = Len(ServerInfo)

Do
res = NetServerEnum(servername, level, bufptr, prefmaxlen, entriesread, totalentries, servertype, domain, resume_handle)
MsgBox(entriesread.ToString & " " & totalentries.ToString)
If ((res = ERROR_SUCCESS) Or (res = ERROR_MORE_DATA)) And (entriesread > 0) Then
tmpbufptr = bufptr
For i = 1 To entriesread
RtlMoveMemory(ServerInfo, tmpbufptr, SIZE_SI_101)

lbNetHosts.Items.Add(ServerInfo.sv100_name.ToString & " " & PointerToString(ServerInfo.sv100_name))
tmpbufptr = tmpbufptr + SIZE_SI_101
Next i
Else
MsgBox("NetServerEnum failed: " & res)
End If
NetApiBufferFree(bufptr)
Loop While entriesread < totalentries

End Sub

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 18.07.2006 (Вт) 14:06

Теги примени к коду, а то мягко говоря нечитаемо
Весь мир матрица, а мы в нем потоки байтов!

Alexander Tsioka
Начинающий
Начинающий
 
Сообщения: 1
Зарегистрирован: 07.06.2005 (Вт) 23:54

Сообщение Alexander Tsioka » 24.07.2006 (Пн) 11:17

Ну если на коленке быстренько, то вот, что получается

Код: Выделить всё

Public Const SRV_TYPE_SERVER = &H2
Public Const SRV_TYPE_SQLSERVER = &H4
Public Const SRV_TYPE_NT_PDC = &H8
Public Const SRV_TYPE_NT_BDC = &H10
Public Const SRV_TYPE_PRINT = &H200
Public Const SRV_TYPE_NT = &H1000
Public Const SRV_TYPE_ALL = &HFFFF
Public Const SRV_TYPE_RAS = &H400

Public Const NERR_Success = 0&
Public Const NERR_Access_Denied = 5&
Public Const NERR_MoreData = 234&

Type ServerInfo
    PlatformId As Long
    ServerName As String
    Type As Long
    VerMajor As Long
    VerMinor As Long
    Comment As String
    Platform As String
    ServerType As Integer
    LanGroup As String
    LanRoot As String
End Type

Type ListOfServer
    Init As Boolean
    LastErr As Long
    list() As ServerInfo
End Type

Private Type SERVER_INFO_API
    PlatformId As Long
    ServerName As Long
    Type As Long
    VerMajor As Long
    VerMinor As Long
    Comment As Long
End Type

Declare Function NetServerEnum Lib "netapi32" _
        (lpServer As Any, ByVal lLevel As Long, vBuffer As Any, _
         lPreferedMaxLen As Long, lEntriesRead As Long, lTotalEntries As Long, _
         ByVal lServerType As Long, ByVal sDomain$, vResume As Any) As Long
Declare Function NetApiBufferFree Lib "netapi32" _
        (ByVal lBuffer&) As Long

Public Function EnumServer(lServerType As Long) As ListOfServer
    Dim nRet As Long, x As Integer, i As Integer
    Dim lRetCode As Long
    Dim tServerInfo As SERVER_INFO_API
    Dim lServerInfo As Long
    Dim lServerInfoPtr As Long
    Dim ServerInfo As ServerInfo
    Dim lPreferedMaxLen As Long
    Dim lEntriesRead As Long
    Dim lTotalEntries As Long
    Dim sDomain As String
    Dim vResume As Variant
    Dim yServer() As Byte
    Dim SrvList As ListOfServer
   
    yServer = MakeServerName(ByVal "")
    lPreferedMaxLen = 65536
   
    nRet = NERR_MoreData
    Do While (nRet = NERR_MoreData)
       
        'Вызов NetServerEnum для получения списка серверов нужного типа
        nRet = NetServerEnum(yServer(0), 101, lServerInfo, _
                             lPreferedMaxLen, lEntriesRead, _
                             lTotalEntries, lServerType, _
                             sDomain, vResume)
       
        If (nRet <> NERR_Success And _
             nRet <> NERR_MoreData) Then
            SrvList.Init = False
            SrvList.LastErr = nRet
            NetError nRet
            Exit Do
        End If
       
        ' NetServerEnum массив начинается с индекса 1
        x = 1
        lServerInfoPtr = lServerInfo
       
        Do While x <= lTotalEntries
           
            CopyMem tServerInfo, ByVal lServerInfoPtr, Len(tServerInfo)
           
            ServerInfo.Comment = PointerToStringW(tServerInfo.Comment)
            ServerInfo.ServerName = PointerToStringW(tServerInfo.ServerName)
            ServerInfo.Type = tServerInfo.Type
            ServerInfo.PlatformId = tServerInfo.PlatformId
            ServerInfo.VerMajor = tServerInfo.VerMajor
            ServerInfo.VerMinor = tServerInfo.VerMinor
           
            ReDim Preserve SrvList.list(1 To x-1) As ServerInfo
            SrvList.list(i) = ServerInfo
           
            x = x + 1
            lServerInfoPtr = lServerInfoPtr + Len(tServerInfo)
           
        Loop
       
        lRetCode = NetApiBufferFree(lServerInfo)
        SrvList.Init = (x > 1)
       
    Loop
   
    EnumServer = SrvList
   
End Function


И вот пример вызова:
Dim ServerList As ListOfServer
ServerList = EnumServer(SRV_TYPE_SQLSERVER)

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 24.07.2006 (Пн) 14:02

2 Alexander Tsioka... и какой смысл в повторении ответа? Может быть стоило топик прочитать полностью?
Весь мир матрица, а мы в нем потоки байтов!

программист
Новичок
Новичок
Аватара пользователя
 
Сообщения: 42
Зарегистрирован: 19.07.2007 (Чт) 20:27
Откуда: Донецк

Сообщение программист » 16.03.2008 (Вс) 1:09

Люди добрые, подскажите пожалуйста хорошую литературку по программированию для локальной сетии - в стиле чатов, проверок и т.п.
Имя ничего не значит, НО ...
... я работаю над собой!

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 17.03.2008 (Пн) 7:50

программист, и причем этот вопрос здесь? Не говоря уж о некрофилии?
З.Ы. Топик закрываю.
Весь мир матрица, а мы в нем потоки байтов!


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList