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

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

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

Сообщение Vova_2581 » 22.12.2013 (Вс) 17:56

Суть проблемы (сначала обобщенно): на работе имеется одноранговая сеть состоящая из N-кол. компьютеров под руководством сервера. Иногда возникает необходимость в обновлении программы обучения для студентов, которая используется на всех машинах. Обновление осуществляется простым Copy/Paste папки с программой. Количество задействованных машин может быть разным. Соответственно список машин меняется.
Обновление делается вручную с сервера, но есть желание автоматизировать этот процесс. Тем более, что это, как мне кажется, не так уж и сложно.

Теперь в частности...
Чтобы скопировать папку с обновленной версией программы обучения на удаленный комп. с сервера, использую модель FSO такой код...
Код: Выделить всё
Set FSO = CreateObject("Scripting.FileSystemObject")
FSO.CopyFolder "C:\UTC\*", "\\Comp001\C\UTC", True     

Благо FSO поддерживает UNC-пути.

Остается дело за малым: поставить это в цикл с перебором Comp001, Comp002, Comp003 и т.д. Сразу оговорюсь CompXXX – название условное. На самом деле каждая машина имеет свое название.

Мне нужно программно получить список машин, которые в данный момент включены и находятся в сети, чтобы получить имя каждой машины.

Пробовал из WSH объект Shell.Application – перекопал методы, но ничего не нашел. WshNetwork тоже ничего не дал. Может быть можно как-то через API или WMI? Не знаю, где искать. Подскажите, пожалуйста.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 22.12.2013 (Вс) 23:14

Почему бы серверу не выдавать список тех, кто уже обновил программу?

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как получить список компьютеров рабочей группы

Сообщение Vova_2581 » 23.12.2013 (Пн) 20:50

Так наоборот... это с сервера нужно (точнее - было бы удобней) обновлять программу на каждом компьютере в зале. Или вы что-то другое имели ввиду?

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 24.12.2013 (Вт) 0:19

Эм.. Я думал про стандартный подход. Программа от сервера узнаёт о наличии обновления, как именно - зависит от самой программы. Если обновление есть, то она обновляется.

Почему-то я подумал про приблизительно одновременное обновление на большом числе компьютеров сети и необходимость скачивать программу не только с сервера, но и с уже обновившихся компьютеров... Да, что-то меня не в ту степь занесло, похоже.

Т. е. по твоему плану сервер должен сам перезаписать программы на компьютерах? А что если она там запущена - как обновлять-то? К тому же, получается, что сервер должен ещё и путь установки знать. В общем, какая-то сомнительная идея. Ну или я какие-то детали пропустил.

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re:

Сообщение Vova_2581 » 24.12.2013 (Вт) 10:33

Qwertiy писал(а):Т. е. по твоему плану сервер должен сам перезаписать программы на компьютерах? А что если она там запущена - как обновлять-то? К тому же, получается, что сервер должен ещё и путь установки знать. В общем, какая-то сомнительная идея. Ну или я какие-то детали пропустил.

Да, именно так: сервер должен сам (в автомате) обновить программу на всех компьютерах в зале. Путь установки сервер знает, он одинаковый для всех – это просто корневой каталог диска С. Что касается «запущенной программы» - так это не она обновляет саму себя, а я хочу написать отдельную(!) программу, которая будет это делать, в то время как программа которую обновляют будет выгружена естественно. Ничего сомнительного, нужно просто получить список всех компьютеров и их имена, как это просто и легко делается в проводнике винды «сетевое окружение». Но как это сделать программно? Как получить список? Ведь должно же быть решение.

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как получить список компьютеров рабочей группы

Сообщение Vova_2581 » 24.12.2013 (Вт) 11:21

Вот нашел функцию ANETRESOURCES, но никаких примеров на VB. Еще нашел WNetEnumResource - она вроде как перечисляет сетевые ресурсы, но пока не знаю получиться ли или нет, попробую.

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

Re: Как получить список компьютеров рабочей группы

Сообщение Viper » 24.12.2013 (Вт) 18:11

Vova_2581 писал(а):Еще нашел WNetEnumResource - она вроде как перечисляет сетевые ресурсы, но пока не знаю получиться ли или нет, попробую.
Использовать вместе WNetOpenEnum и WNetCloseEnum. Альтернативный вариант - функция NetServerEnum. На vb6 (и VB.NET) оба варианта вполне работоспособны, но надо долго вникать в документацию и примеры в MSDN (все дано для С++).
Весь мир матрица, а мы в нем потоки байтов!

Sam777e
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 157
Зарегистрирован: 16.09.2010 (Чт) 4:33

Re: Как получить список компьютеров рабочей группы

Сообщение Sam777e » 25.12.2013 (Ср) 8:14

Книга
Дон Джонс
Средства автоматизации в Microsoft Windows [ Справочник администратора ]
Издательство ЭКОМ, 2006

я в этом не разбираюсь,
там в ~похожем ? случае используют ADSI - Active Directory Server Information.
Set oRoot = GetObject("LDAP://rootDSE") ...
Здоровья и удачи

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как получить список компьютеров рабочей группы

Сообщение Vova_2581 » 25.12.2013 (Ср) 14:43

Чего-то не получается с WNetEnumResources. :( Скачал пример от самой Microsoft...
http://support.microsoft.com/kb/177697/ru
В строке...
Код: Выделить всё
res = WNetEnumResource(hEnum, cCount, lpBuff, cbBuff)

WNetEnumResource возвращает ошибку 259 и значение cCount = 0
Смущает то, что написано в аннотации: «WNetEnumResources могут использоваться для просмотра локальных дисков, порты принтера, которые могут быть перенаправлены и все подключения UNC на компьютерах под управлением Windows 2000, Windows NT, Windows Me, Windows 98 или Windows 95» - ХР в этом списке нет. Может в этом проблема?

Есть еще такая идея: использовать команду NET VIEW с перенаправлением вывода в текстовое поле моей проги Stdout. Но это как-то так словно чесать правое ухо левой рукой. :(

Может кто поможет понять в чем ошибка с WNetEnumResource?

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

Re: Как получить список компьютеров рабочей группы

Сообщение Viper » 25.12.2013 (Ср) 17:50

Vova_2581 писал(а):Может кто поможет понять в чем ошибка с WNetEnumResource?
Полный код выложи, телепаты в отпуске.
Весь мир матрица, а мы в нем потоки байтов!

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

Re: Как получить список компьютеров рабочей группы

Сообщение Viper » 25.12.2013 (Ср) 18:00

Я сегодня добрый :) Во вложении модуль MNetApi.bas для работы с функциями из NetApi.dll и модуль MArrays.bas содержащий полезные функции для работы с массивами. MArray.bas нужен для работы MNetApi.bas, да и вообще полезная штука. К сожалению в MNetApi.bas комментариев нет вообще, но модуль полностью работспособен. Функция возвращающая строковый массив содержащий имена компьютеров локальной сети называется GetServers.
З.Ы. Модуль написан пять лет назад, с тех пор не модифицировался.
Вложения
NetAPI.rar
(10.15 Кб) Скачиваний: 143
Весь мир матрица, а мы в нем потоки байтов!

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как получить список компьютеров рабочей группы

Сообщение Vova_2581 » 25.12.2013 (Ср) 19:26

Viper писал(а):Функция возвращающая строковый массив содержащий имена компьютеров локальной сети называется GetServers.

Если не сложно напишите как правильно вызвать GetServers? Что передавать в nCount?

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

Re: Как получить список компьютеров рабочей группы

Сообщение Viper » 25.12.2013 (Ср) 20:27

В nCount возвращается число компьютеров локальной сети = размеру возвращаемого массива.
Весь мир матрица, а мы в нем потоки байтов!

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как получить список компьютеров рабочей группы

Сообщение Vova_2581 » 25.12.2013 (Ср) 21:15

Блин... ну и запудрино в этих сетевых функциях.
Во-первых, существуют уровни иерархии... понятия не имею что это за хрень, но это вроде списка, что вызывается из проводника «Вся сеть».
Во-вторых, параметры lpLocalName, lpRemoteName, lpComment, lpProvider в структуре NETRESOURCE, оказывается, самими сетевыми функциями могут быть заданы значениями, тип которых VB вообще не поддерживает – это могут быть адреса строк в буфере.
Код: Выделить всё
Type NETRESOURCE
              dwScope As Long
              dwType As Long
              dwDisplayType As Long
              dwUsage As Long
              lpLocalName As Long
              lpRemoteName As Long
              lpComment As Long
              lpProvider As Long
      End Type

В тоже время функции WNetAddConnection2 и WNetAddConnection3 должны получить в качестве параметров структуру NETRESOURCE, где lpLocalName, lpRemoteName, lpComment, lpProvider – это уже строки, а не адреса! И сама структура задается по-другому соответственно.
Чтобы получить, скажем lpRemoteName в бейсике как строковую переменную, нужно особым образом «трахнуться», просто ахринеть! :( Мне казалось будет попроще.

Viper, вы имеете ввиду вот так?..
Код: Выделить всё
Dim с As Long
GetServers (с)
Print с

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

Re: Как получить список компьютеров рабочей группы

Сообщение Viper » 25.12.2013 (Ср) 21:42

Vova_2581 писал(а):Viper, вы имеете ввиду вот так?..
Я имею ввиду так:
Код: Выделить всё
Dim arNames() As String
Dim c As Long
arNames = GetServers(c)
Весь мир матрица, а мы в нем потоки байтов!

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

Re: Как получить список компьютеров рабочей группы

Сообщение Viper » 25.12.2013 (Ср) 21:45

Vova_2581 писал(а):Блин... ну и запудрино в этих сетевых функциях.
Так для того и сделана обертка над ними (GetServers, GetUsers и GetServerUsers), чтобы пользоваться было проще.
Весь мир матрица, а мы в нем потоки байтов!

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

Re: Как получить список компьютеров рабочей группы

Сообщение Viper » 25.12.2013 (Ср) 21:47

Vova_2581 писал(а):Чтобы получить, скажем lpRemoteName в бейсике как строковую переменную, нужно особым образом «трахнуться», просто ахринеть! Мне казалось будет попроще.
Последняя функция в модуле GetSTRW как раз и получает строку по ее адресу, ничего особо сложного.
Весь мир матрица, а мы в нем потоки байтов!

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как получить список компьютеров рабочей группы

Сообщение Vova_2581 » 25.12.2013 (Ср) 21:56

Вот так... все получается! Ура! :)
Код: Выделить всё
Dim arNames() As String
Dim c As Long
arNames = GetServers(c)
For i = 0 To c - 1
Print arNames(i)
Next

БОЛЬШОЕ СПАСИБО, Viper! :)


Вернуться в Visual Basic 1–6

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

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

    TopList  
cron