Как извлечь информацию о конкретном открытии ресурса

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

Как извлечь информацию о конкретном открытии ресурса

Сообщение Vova_2581 » 29.01.2019 (Вт) 15:29

Здравствуйте!
Мне нужно получить сведения, какие именно расшаренные ресурсы на локальной машине открываются удаленно в LAN. «files opened remotely on server». Иными словами, - имеется Server, на нем расшарены ресурсы, например: Installs, Clips, Films, Porn&Girls, Music, Books, Pictures, Foto, Games и т.д. К серверу подключился User1, User2 и User3. Каждый из них куда-то влез и «шарит» соответствующую папку. Мне нужно получить информацию о том, кто и что конкретно шарит? Какую папку открыл и т.д.? Покопавшись в инете, нашел вроде как подходящую функцию NetFileGetInfo Она заполняет структуру FILE_INFO_3 или FILE_INFO_2 в зависимости от параметра Level этой функции. Как я понимаю, мне нужно получить сведение полей: fi3_username, fi3_pathname и еще неплохо бы получить fi3_permissions в структуре FILE_INFO_3. Проблема в том, что мне не хватает знаний грамотно ее воспользоваться, а в инете нет ни одного примера, хотя бы самого захудалого на VB. К сожалению, только теория и то очень скудная. :cry: Буду очень благодарен за любую помощь в данном отношении.
Набросал небольшой черновичек...
Код: Выделить всё
Private Declare Function NetFileGetInfo Lib "Netapi32" _
  (ByVal servername As Long, _
   ByVal fileid As Long, _
   ByVal level As Long, _
   ByRef bufptr As Any) As Long

Где: servername = 0& - локальная машина
fileid = 0& - идентификатор файла открытого ресурса, ставлю в данном случае «0».
level = 3 – уровень данных. В данном случае нужно FILE_INFO_3
bufptr – Указатель на адрес буфера, который получает информацию.

Далее сопутствующая информация...

Код: Выделить всё
Private Declare Sub MoveMemory Lib "kernel32.dll" _
  Alias "RtlMoveMemory" ( _
  Destination As Any, _
  Source As Any, _
  ByVal Length As Long)

Private Const NERR_SUCCESS As Long = 0&
Private Const ERROR_FILE_NOT_FOUND = 2&
Private Const ERROR_ACCESS_DENIED = 5&
Private Const ERROR_INVALID_LEVEL = 124&
Private Const ERROR_NOT_ENOUGH_MEMORY = 8

Private Type FILE_INFO_3
   fi3_id As Long
   fi3_permissions As Long
   fi3_num_locks As Long
   fi3_pathname As Long
   fi3_username As Long
End Type

Dim fi3 As FILE_INFO_3
Dim bufptr As Long


Далее вроде так...

Success = NetFileGetInfo(0&, 0&, 3, bufptr)
...и далее уже извлечь из памяти по адресу указателя bufptr. Правильно???
Типа: MoveMemory(ByVal fi3, ByVal bufptr, Len(fi3)) С работой с памятью я не силён...
Но Success все время равен - ERROR_FILE_NOT_FOUND. Даже когда ресурсы открываются удаленно.
Помогите, пожалуйста, разобраться. Как правильно описать параметр bufptr и получить FILE_INFO_3 ??? :roll:

ВСЕ! Начинайте бить... :cheese:
Последний раз редактировалось Vova_2581 30.01.2019 (Ср) 12:03, всего редактировалось 1 раз.

Teranas
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 152
Зарегистрирован: 13.12.2008 (Сб) 4:26
Откуда: Новосибирск

Re: Как извлечь информацию о конкретном открытии ресурса

Сообщение Teranas » 29.01.2019 (Вт) 16:21

Чтобы бить, надо понимать за что, а я ничего не понял. :alien:

Код: Выделить всё
Declare Function NetFileEnum lib "netapi32" (ByVal lptstr As String, ByVal lptstr As String, ByVal lptstr As String, ByVal dword As Long, ByVal pbyte As String, ByVal dword As Long, ByRef pdword As Long, ByRef pdword As Long, ByRef pdword As Long) As Long
Declare Function NetFileGetInfo lib "netapi32" (ByVal lptstr As String, ByVal dword As Long, ByVal dword As Long, ByVal pbyte As String) As Long
Declare Function NetGetAnyDCName lib "NETAPI32" (ByVal servername As String, ByVal domainname As String, ByVal bufptr As String) As Long
Declare Function NetGetDCName lib "NETAPI32" (ByVal servername As String, ByVal domainname As String, ByVal bufptr As String) As Long
Declare Function NetGetDisplayInformationIndex lib "NETAPI32" (ByVal servername As String, ByVal level As Long, ByVal Prefix As String, ByRef index As Long) As Long


А с чтением строк по указателю, нужно смотреть в каком формате строка и конвертировать в нужную.
С уважением, Андрей.

Vova_2581
Бывалый
Бывалый
 
Сообщения: 200
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как извлечь информацию о конкретном открытии ресурса

Сообщение Vova_2581 » 30.01.2019 (Ср) 11:39

Так декларирование функций... с этим проблем нет, проблема в том, что нигде нет ни одного более-менее внятного примера, только одна теория и какие-то черновые наброски (куски оторванного кода). Вот функции с префиксом WNet описаны с примерами гораздо лучше, а просто с префиксом Net почему-то рассказано мало, примеров особо никаких. Поэтому, нужно решить описанную мною задачу, не знаю, как конкретно это сделать?

Vova_2581
Бывалый
Бывалый
 
Сообщения: 200
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как извлечь информацию о конкретном открытии ресурса

Сообщение Vova_2581 » 30.01.2019 (Ср) 12:02

Teranas писал(а):...я ничего не понял.

Имеется локальная машина, назовем ее Server, на ней открыта папка (папки) с общим доступом, например SuperGirls. В момент X времени к этой машине по сети LAN подключился пользователь User1 и очень сильно возжелал увидеть содержимое папки SuperGirls на Server, неожиданно для себя самого и совершенно случайно он открыл эту папку на Server по сети. Строгий администратор локальной машины Server в момент времени X запустил программу... (которую и нужно сделать), которая показала ему информацию следующего содержания:

Opened remotely on server
User: User1
Path: D:\SuperGirls
Permissions: READ
Time: 10:32:35

kill user [Yes/No] ??? _

Teranas
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 152
Зарегистрирован: 13.12.2008 (Сб) 4:26
Откуда: Новосибирск

Re: Как извлечь информацию о конкретном открытии ресурса

Сообщение Teranas » 31.01.2019 (Чт) 17:14

Vova_2581

Приветствую!

Порылся в своих завалах и ничего не нашёл.
Хотя думал есть всё. :wink:
В тырнете нащупал исходники на делфях и с++.
Думаю, тебе придётся опираться на них.
С уважением, Андрей.

Vova_2581
Бывалый
Бывалый
 
Сообщения: 200
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как извлечь информацию о конкретном открытии ресурса

Сообщение Vova_2581 » 01.02.2019 (Пт) 0:00

Teranas писал(а):
Приветствую!

Порылся в своих завалах и ничего не нашёл.
В тырнете нащупал исходники на делфях и с++.


Здравия желаю!

Так вот и я о том же!.. НИХТ-где ни фига нет! :scratch: А С++ и Делфи я не знаю. :?: Поэтому нужна помощь...
Иначе - Хитлер капут! :alien:
Есть, правда, другие варианты... "чесать ухо левой пяткой"... и поэтому мне они не очень нравятся. :(

Vova_2581
Бывалый
Бывалый
 
Сообщения: 200
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как извлечь информацию о конкретном открытии ресурса

Сообщение Vova_2581 » 01.02.2019 (Пт) 0:59

Погодите ка!... Кажется я кое-что нашел, только через другой поисковик... :bounce: Завтра на работе проверю все, а потом отпишусь здесь о результатах. Надеюсь, то что надо.

Vova_2581
Бывалый
Бывалый
 
Сообщения: 200
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как извлечь информацию о конкретном открытии ресурса

Сообщение Vova_2581 » 03.02.2019 (Вс) 1:56

Итак, все проверил, есть результат, но!.. начну с анекдота...
Вот все говорят Гугл... Гугл... а Гугл-то уже не тот, что был вчера! Не так давно, в некотором царстве, тридесятом государстве жил… короче... искал я в инете одну хрень. Хрень продавалась и интернет-магазине, а где и по чем... нужно было найти. Запузырил я, значит, поиск в этом самом Google.com и нашел аж целых пару(!) штук ссылок! Говорю, значит, бате: «короче... это... дифициТА, стало быть, вАще нигде нету!!!». А он меня спрашивает: «А ты короче... это... через что искал-то, добрый молодец???». «Через Хугл!», - с гордостью ответил я, и нос к верху задрал, пытаясь изобразить умный вид. Он ухмыльнулся так, и за комп засел. Через пару минут зовет меня... «Смотри, салага, и учись уму разуму!», - говорит мне и пальцем в экран тычет, а другой рукой подзатыльник выписывает. Гляжу, значит, и ничЁ понять не могу. Ту хрень, что я искал 2 часа в Хугл и ни хрена толком не нашел, тута вдруг аж 12 742 796 859 ссылок нарисовалось!! Я глаза, значит, вылупил... а батя мне: «Эх, ты... Вася!». Он то считал меня ГИПЕР(!!!)хакером, а тут сделал... как пацана из детского сада – отделение Ясли! Пришлось мне краснеть и по углам прятаться. :oops: А батя мой еще неделю с растопыренными пальцами ходил, и подзатыльники мне выписывал. Ну а потом я узнал, что Гугл, нынче, это фуфло в натуре! А пользовался он поисковиком DuckDuckGo.com. Отаки дела, малята!

Так вот, и в этот раз та же история по ходу... В Гугле найти не мог, а в DuckDuckGo.com первая(!) же ссылка! Только искал я уже другую функцию, то есть – NetFileEnum, поскольку мне то нужно перечисление не одного пользователя, а столько, сколько подключится. И я нашел пример кода VB от Рэнди Берч (Randy Birch) сайта VBnet... За что ему большое спасибо и низкий поклон! Но и тут не все гладко, как мне надо. Пришлось опять, в который раз уже, биться в истерике и плакать в подушку... :cry: Эксперименты показали, что параметр fi3_username в структуре FILE_INFO_3 возвращает имя НЕ подключенного пользователя, а ЛОКАЛЬНОГО пользователя! То есть, иными словами: с помощью этой функции я смогу узнать, что кто-то юзает папку D:\SuperGirls на Server, но кто это делает, узнать не получится, поскольку fi3_username вернет имя локального пользователя! Не знаю, поняли вы или нет??? Говоря еще проще: на свой комп Server вы зашли под именем Admin, к вам подключился User1 и вздручил у вас на компе папку с общим доступом SuperGirls у вас на диске D:\. Так вот функция покажет следующее...

Opened remotely on server
User: Admin
Path: D:\SuperGirls
Permissions: READ

... вместо User1 будет Admin ...словно вы сами у себя эту самую папку дрючите! Может я чего-то недоперепонял, то поправьте, пожалуйста. Что-то тут явно не так.
Чтобы вы не мучались... выкладываю исходник кода от Randy Birch в готовом проекте... Попробуйте открыть у себя общий доступ какой-нибудь папки, открыть ее, и потом зайти сами к себе по сети – программа все покажет. Результат будет одинаковый, что вы сами к себе зайдете... что через другой комп в сети – по фиг.
Может нужно что-то в коде перенедоправить и тогда все получится??? :scratch:
Вложения
NetFileEnum.rar
(2.6 Кб) Скачиваний: 7

Vova_2581
Бывалый
Бывалый
 
Сообщения: 200
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как извлечь информацию о конкретном открытии ресурса

Сообщение Vova_2581 » 04.02.2019 (Пн) 11:44

Немного модифицировал код... Если sServer присвоить указатель на пустую строку с нулевым символом = vbNullString, то можно избавиться от лишней ненужной информации, то есть \PIPE\... уже не появляется и не учитывается счетчиком подключений. Но все равно вопрос остается открытым: как узнать КТО именно юзает расшаренную папку?? :roll:
Вложения
NetFileEnum improved.rar
(2.88 Кб) Скачиваний: 5

Teranas
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 152
Зарегистрирован: 13.12.2008 (Сб) 4:26
Откуда: Новосибирск

Re: Как извлечь информацию о конкретном открытии ресурса

Сообщение Teranas » 04.02.2019 (Пн) 15:52

Возможно больше подойдёт, но я не уверен.

Код: Выделить всё
Type NETRESOURCE
        dwScope As Long
        dwType As Long
        dwDisplayType As Long
        dwUsage As Long
        lpLocalName As String
        lpRemoteName As String
        lpComment As String
        lpProvider As String
End Type

Const CONNECT_UPDATE_PROFILE = &H1

Declare Function WNetAddConnection Lib "mpr" Alias "WNetAddConnectionA" (ByVal lpszNetPath As String, ByVal lpszPassword As String, ByVal lpszLocalName As String) As Long
Declare Function WNetAddConnection2 Lib "mpr" Alias "WNetAddConnection2A" (lpNetResource As NETRESOURCE, ByVal lpPassword As String, ByVal lpUserName As String, ByVal dwFlags As Long) As Long
Declare Function WNetCancelConnection Lib "mpr" Alias "WNetCancelConnectionA" (ByVal lpszName As String, ByVal bForce As Long) As Long
Declare Function WNetCancelConnection2 Lib "mpr" Alias "WNetCancelConnection2A" (ByVal lpName As String, ByVal dwFlags As Long, ByVal fForce As Long) As Long
Declare Function WNetGetConnection Lib "mpr" Alias "WNetGetConnectionA" (ByVal lpszLocalName As String, ByVal lpszRemoteName As String, cbRemoteName As Long) As Long
Declare Function WNetOpenEnum Lib "mpr" Alias "WNetOpenEnumA" (ByVal dwScope As Long, ByVal dwType As Long, ByVal dwUsage As Long, lpNetResource As NETRESOURCE, lphEnum As Long) As Long
Declare Function WNetEnumResource Lib "mpr" Alias "WNetEnumResourceA" (ByVal hEnum As Long, lpcCount As Long, lpBuffer As Any, lpBufferSize As Long) As Long
Declare Function WNetCloseEnum Lib "mpr" Alias "WNetCloseEnum" (ByVal hEnum As Long) As Long

Declare Function WNetGetUser Lib "mpr" Alias "WNetGetUserA" (ByVal lpName As String, ByVal lpUserName As String, lpnLength As Long) As Long
Declare Function WNetConnectionDialog Lib "mpr" Alias "WNetConnectionDialog" (ByVal hwnd As Long, ByVal dwType As Long) As Long
Declare Function WNetDisconnectDialog Lib "mpr" Alias "WNetDisconnectDialog" (ByVal hwnd As Long, ByVal dwType As Long) As Long

С уважением, Андрей.

Vova_2581
Бывалый
Бывалый
 
Сообщения: 200
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как извлечь информацию о конкретном открытии ресурса

Сообщение Vova_2581 » 04.02.2019 (Пн) 17:55

Структуру NETRESOURCE как раз используют функции с префиксом WNet - это близко, но все же не то. Все эти функции работают именно с подключенными ресурсами, а именно, например, - сетевой диск или сетевая папка. То есть, это когда ты конкретно заходишь на чей-то комп, открываешь папку и делаешь ее у себя на компе дополнительным сетевым ресурсом - в Проводнике появляется еще один диск с пометкой, к примеру: SuperGirls на "Server" (Z:)

Мне нужно получать информацию о том, КТО юзает расшаренную у меня папку БЕЗ(!) подключения ее к удаленному компу в качестве дополнительного сетевого ресурса. Вот как это замутить, пока не ясно. :(

Teranas
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 152
Зарегистрирован: 13.12.2008 (Сб) 4:26
Откуда: Новосибирск

Re: Как извлечь информацию о конкретном открытии ресурса

Сообщение Teranas » 04.02.2019 (Пн) 19:21

Посмотри ещё тут, может что понравится.

Ещё есть отличная программа с мядалями, можно запустить монитор API и посмотреть какие функции она использует.
http://sharealarm.nsauditor.com/
Вложения
Network.7z
(12.28 Кб) Скачиваний: 7
001.7z
(2.52 Кб) Скачиваний: 6
С уважением, Андрей.

Vova_2581
Бывалый
Бывалый
 
Сообщения: 200
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как извлечь информацию о конкретном открытии ресурса

Сообщение Vova_2581 » 05.02.2019 (Вт) 10:38

Хорошо, спасибо, я посмотрю...

Vova_2581
Бывалый
Бывалый
 
Сообщения: 200
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как извлечь информацию о конкретном открытии ресурса

Сообщение Vova_2581 » 06.02.2019 (Ср) 12:06

В общем, те классы, что вы мне прислали тоже немного не то... В декларациях те же функции WNet, Net и много другое, но мимо... :(
Там почти везде имеется ввиду, что либо User уже известен, либо предоставляются методы получения его локального имя, а тут вся фишка в том, что User как раз и неизвестен!
Network.cls
Network.jpg
Network.jpg (231.57 Кб) Просмотров: 175

И второй класс 001... Кстати, в нем куда-то оторвалась "шапка" :scratch: , пришлось подправить немного, чтобы заработал...
001.jpg
001.jpg (227.04 Кб) Просмотров: 175

Мне так кажется, что нужно все-таки копать в сторону WinSock ??? Посмотрите, пожалуйста, может у вас что-то есть в этом направлении. :roll:

alibek
Большой Человек
Большой Человек
 
Сообщения: 14125
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Как извлечь информацию о конкретном открытии ресурса

Сообщение alibek » 06.02.2019 (Ср) 12:43

Vova_2581 писал(а):Там почти везде Мне так кажется, что нужно все-таки копать в сторону WinSock ???

Сокет просто отправляет и принимает байты (данные).
Что ты с ним собираешься делать, если не разобрался с готовыми библиотеками Windows Network?
Lasciate ogni speranza, voi ch'entrate.

Vova_2581
Бывалый
Бывалый
 
Сообщения: 200
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как извлечь информацию о конкретном открытии ресурса

Сообщение Vova_2581 » 06.02.2019 (Ср) 20:07

alibek писал(а):Сокет просто отправляет и принимает байты (данные). Что ты с ним собираешься делать?

Ну, это было чисто мое предположение...
alibek писал(а):...если не разобрался с готовыми библиотеками Windows Network?

Так вы загадками не говорите. Где именно то, что может спасти "гиганта мысли и отца русской демократии"??? :roll:

Vova_2581
Бывалый
Бывалый
 
Сообщения: 200
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как извлечь информацию о конкретном открытии ресурса

Сообщение Vova_2581 » 08.02.2019 (Пт) 11:38

Ммммда... видно тема непростая? :drunken:
Teranas
Спасибо Вам, что пытались помочь! Попробую еще "поковырять", но если не выйдет, придется закинуть, а жаль. :(


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

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

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

    TopList