Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > Программа мониторинга сети


Автор: Kamil 27.11.2006, 00:10
Здравствуйте. Мне нужна помощь в написании следующих методов:

- метод поиска количества logins и logouts в сети.
- метод, который бы по IP определял бы, если это возможно, какие приложения (процессы) запущены на клиенте
- последний метод, определить ссылки сайтов, посещенным конкретным пользователем на удаленной машине. 

Я недели три пытаюсь найти информацию с живыми примерами. Не могу найти. Помогите пожалуйста. Заранее спасибо.

Автор: LSD 27.11.2006, 11:01
1. Универсального способа это все реализовать нет. Для каждой конкретной ОС надо искать свой подход, и не факт что он будет существовать.
2. Ты собрался это все писать на Java?

Автор: Kamil 27.11.2006, 22:02
Цитата

Универсального способа это все реализовать нет. Для каждой конкретной ОС надо искать свой подход, и не факт что он будет существовать.


Первый метод, мне кажется надо делать с помощью RMI. Я правильно думаю или как ? 

Насчет второго метода. Что именно можно сделать?  Допустим, возьмем для начала к примеру ОС Windows у клиента. Реально получить информацию удаленно, какие процессы запущены у клиента? 

Третий метод. Тут я согласен. Если ОС у клиента опять та же Windows, то нужная мне инфа находится в папке C:\Documents and Settings\<название_учетки>\Local Settings\Temporary Internet Files. 
Не знаю, как в Linux, но там должен быть естественно другой путь. Насчет других ОС - не знаю. Здесь у меня возникает следующие проблемы: надо получить инфу о названии удаленной залогиненной учетки, это раз. Другая проблема, надо узнать какая ОС используется на клиенте.

Цитата

Ты собрался это все писать на Java?


Да

Автор: LSD 27.11.2006, 22:13
Цитата(Kamil @  27.11.2006,  22:02 Найти цитируемый пост)
Первый метод, мне кажется надо делать с помощью RMI. Я правильно думаю или как ?

Нет, RMI это просто удаленный вызов процедур. Никакого отношения к login/logout он не имеет.


Цитата(Kamil @  27.11.2006,  22:02 Найти цитируемый пост)
Насчет второго метода. Что именно можно сделать?  Допустим, возьмем для начала к примеру ОС Windows у клиента. Реально получить информацию удаленно, какие процессы запущены у клиента?

Можно, но надо иметь привелегии администратора на удаленной системе.


Цитата(Kamil @  27.11.2006,  22:02 Найти цитируемый пост)
Третий метод. Тут я согласен. Если ОС у клиента опять та же Windows, то нужная мне инфа находится в папке C:\Documents and Settings\<название_учетки>\Local Settings\Temporary Internet Files. Не знаю, как в Linux, но там должен быть естественно другой путь. Насчет других ОС - не знаю. Здесь у меня возникает следующие проблемы: надо получить инфу о названии удаленной залогиненной учетки, это раз. Другая проблема, надо узнать какая ОС используется на клиенте.

1. Там может быть залогинено несколько пользователей. Опять же без учетной записи администратора, тут нечего делать.

Автор: Kamil 27.11.2006, 22:32
Цитата

Нет, RMI это просто удаленный вызов процедур. Никакого отношения к login/logout он не имеет.


Может у клиента запущен объект с методом, который и возвращает булевое значение - он залогинился или нет?

Цитата

Можно, но надо иметь привелегии администратора на удаленной системе.


Ситуация здесь такая. Программа запускается на сервере. Ее запускает админ. Какие права у удаленной учетки - неизвестно. Хотя интересно было бы и это узнать. Но это пока не требуется знать в моем проекте.



Автор: Kamil 28.11.2006, 00:14
Ребята, если есть возможность подкиньте идеи с чего начать первые два метода: "logins-logouts" и  "Запущенные процессы". 

Могу показать полное название проекта и в чем заключается его проблема:

Project Title: 

Network monitoring and management system

Problem:

To find out the numbers of computers in all domains along with their IP-address. To find out the sites, visited by the clients on the Internet. Numbers of logins and logouts and the applications accessed by a particular user.

Автор: LSD 28.11.2006, 11:57
Цитата(Kamil @  27.11.2006,  22:32 Найти цитируемый пост)
Может у клиента запущен объект с методом, который и возвращает булевое значение - он залогинился или нет?

На чистой Java это не реализовать, надо будет поизвращаться.


Цитата(Kamil @  27.11.2006,  22:32 Найти цитируемый пост)
Ситуация здесь такая. Программа запускается на сервере. Ее запускает админ. Какие права у удаленной учетки - неизвестно. Хотя интересно было бы и это узнать. Но это пока не требуется знать в моем проекте.

Сервер понятие слишком общее. Если это контроллер домена и машина в домене, то тут можно получить практически полный контроль над удаленной машиной. А если это веб сервер, то тут отличия от рядовой машины нет.


Цитата(Kamil @  28.11.2006,  00:14 Найти цитируемый пост)
Ребята, если есть возможность подкиньте идеи с чего начать первые два метода: "logins-logouts" и  "Запущенные процессы". 

Есть такая штука PsUtils от Sysinternals, у них есть ряд консольных утилит которые могут помочь, во первых это PsLoggedOn:
Цитата
PsLoggedOn v1.31 - Logon Session Displayer
Copyright © 1999-2003 Mark Russinovich
Sysinternals - www.sysinternals.com

Users logged on locally:
     <Unknown> NT AUTHORITY\LOCAL SERVICE
     <Unknown> NT AUTHORITY\NETWORK SERVICE
     28.11.2006 10:58:03    ANIS\Administrator
     <Unknown> NT AUTHORITY\SYSTEM

Users logged on via resource shares:
     28.11.2006 11:49:39    ANIS\ZXION
     28.11.2006 11:54:15    PK-AL-PC\PK-AL
     28.11.2006 11:55:10    ANDRE-PC\ANDREJ
     28.11.2006 11:55:26    ANIS\ADMINISTRATOR
     28.11.2006 11:49:42    VADIM-PC\ADMINISTRATOR

и PsList:
Цитата
PsList 1.26 - Process Information Lister
Copyright © 1999-2004 Mark Russinovich
Sysinternals - www.sysinternals.com

Process information for srv:

Name                Pid Pri Thd  Hnd   Priv        CPU Time    Elapsed Time
Idle                  0   0   2    0      0     8:05:27.671     0:00:00.000
System                4   8  62 1160      0     0:00:28.625     0:00:00.000
smss                432  11   3   19    140     0:00:00.031     4:02:39.921
csrss               500  13  11  537   1508     0:00:02.140     4:02:39.234
winlogon            936  13  30  643   8652     0:00:01.156     4:02:35.687
services           1032   9  18  369   4048     0:00:02.187     4:02:35.593
lsass               960   9  52  873  20064     0:00:15.281     4:02:35.578
ati2evxx            156   8   4   64    508     0:00:00.015     4:02:35.312
svchost            1264   8   6   80    816     0:00:00.015     4:02:35.296
svchost            1148   8  10  229   1216     0:00:00.765     4:02:32.218
svchost            1392   8  10  152   3716     0:00:00.218     4:02:32.171
svchost            1496   8  13  154   1072     0:00:00.031     4:02:32.125
svchost            1528   8  40  875  11804     0:00:02.828     4:02:32.109
spoolsv            1500   8  19  192   5884     0:00:00.140     4:01:28.656
msdtc              1688   8  13  152   1496     0:00:00.015     4:01:28.609
dfssvc             1620   8  11  116   1780     0:00:04.031     4:01:28.281
DkService          1756   8   8  161   4416     0:00:00.078     4:01:28.234
dns                1888   8  14  186   7560     0:00:00.328     4:01:27.937
svchost            1936   8   2   56    464     0:00:00.000     4:01:27.859
IAANTMon           2032   8   3   96    352     0:00:00.000     4:01:27.765
InCDsrv             216   8  15  166   1632     0:00:00.062     4:01:27.687
ismserv            1892   8   9  111   1664     0:00:00.031     4:01:27.562
ntfrs              1932   8  20  269   9164     0:00:00.296     4:01:27.515
svchost             448   8   4  166   7204     0:00:00.109     4:01:27.156
SSService           508   8   3   74    952     0:00:00.015     4:01:27.125
svchost             480   8   5   91   2908     0:00:00.031     4:01:26.734
SVNService          252   8   2   28    460     0:00:00.000     4:01:26.734
svnserve            584   8   1   47   5932     0:00:05.140     4:01:26.703
wins                736   8  18  207   5804     0:00:00.125     4:01:26.609
svchost            2296   8  15  133   1344     0:00:00.031     4:00:57.656
wmiprvse           3020   8   5  165   1672     0:00:00.250     4:00:25.859
ati2evxx           2952   8   4   64    624     0:00:00.031     0:59:55.781
explorer            832   8   8  275  10964     0:00:01.437     0:59:55.656
IAAnotif           3968   8   2   36    564     0:00:00.015     0:59:54.375
InCD               2088   8   3  114   3412     0:00:00.203     0:59:54.250
ctfmon             3352   8   1   66    392     0:00:00.046     0:59:54.156
mmc                2420   8   7  250   5972     0:00:00.703     0:47:24.109
logon.scr          3692   4   1   37    396     0:00:00.000     0:42:01.578
wmiprvse           2616   8   7  129   1688     0:00:00.093     0:02:49.906

Они обе консольные и с ними можно работать черес Runtime.exec().

Автор: Kamil 28.11.2006, 13:12
Цитата

На чистой Java это не реализовать, надо будет поизвращаться.


Понятия не имею, как это будет работать. 

Насчет сервера. Понимаете, программа также будет контролировать, подключены клиенты к Интернету или нет, следовательно как я понимаю, программа должна запускаться на Proxy, а вот насчет контроллера домена... Вообще, у меня метод поиска клиентов используют метов isReachable у InetAddress-a. Думал использовать Multicasting, что то не работало у меня. Так вот, когда я получаю IP-шники, мне надо их отсортировать по доменам. Я запускал программу в простой локалке для поиска и мне возвращались неполные имена компов (т.е. без именем домена). Как тут мне поможет контроллер домена? 

Не совсем понял цитату 
Цитата
 Есть такая штука PsUtils от Sysinternals
 . Чо за Sysinternals? Эти утилиты для конкреной ОС как я понимаю, на верное для серверной ОС ? Правильно?

Добавлено @ 13:15 
Пробую у себя запустить PsList из командной строки. Ошибка. У меня XP. 

Возникает ошибка из-за моей ОС?

Добавлено @ 13:18 
Стоп. Извиняюсь, не уведел, что SysInternals это сайт. Поищу эти утилиты.

Автор: Kamil 28.11.2006, 13:28
Никогда не пользовался методом Runtime.exec(String str). Как я понял, чтобы получить результат выполнения этой утилиты , я получаю объект Process, у которого получаю входной поток с помощью  getInputStream(), а затем считываю результат из него. Верно?

Добавлено @ 13:32 
Только это грубый метод с использованем утилит, ведь у меня на сервере может быть какой - нибудь RedHat, который не знает что такой PsList.exe или PsLoggedOn.exe

Автор: LSD 28.11.2006, 15:24
Цитата(Kamil @  28.11.2006,  13:28 Найти цитируемый пост)
Только это грубый метод с использованем утилит, ведь у меня на сервере может быть какой - нибудь RedHat, который не знает что такой PsList.exe или PsLoggedOn.exe

Так об этом я и говорил!
Цитата(LSD @  27.11.2006,  11:01 Найти цитируемый пост)
Универсального способа это все реализовать нет. Для каждой конкретной ОС надо искать свой подход, и не факт что он будет существовать.


Цитата(Kamil @  28.11.2006,  13:28 Найти цитируемый пост)
Никогда не пользовался методом Runtime.exec(String str). Как я понял, чтобы получить результат выполнения этой утилиты , я получаю объект Process, у которого получаю входной поток с помощью  getInputStream(), а затем считываю результат из него. Верно?

Да.

Автор: Kamil 28.11.2006, 15:53
Если есть такие утилиты, то наверное их можно сделать на Java.

Неужели нет программ на подобие этой?

Цитата

Для каждой конкретной ОС надо искать свой подход, и не факт что он будет существовать


Не знаю верно это или нет, но как мне кажется может есть какой то протокол и порт по которому машины могут обмениваться информацией, а если конкретно, какая используется ОС, информация о пользователе, о параметрах машины.

Автор: tux 28.11.2006, 16:18
Цитата(Kamil @  28.11.2006,  15:53 Найти цитируемый пост)
Не знаю верно это или нет, но как мне кажется может есть какой то протокол и порт по которому машины могут обмениваться информацией, а если конкретно, какая используется ОС, информация о пользователе, о параметрах машины. 

Протокол и порт может и есть, вот только... Порт - это суть логический интерфейс, через которые приложения могут обмениваться данными. Чтобы порт выдавал какую-то информацию нужно чтобы на этот порт прослушивало какое-то приложение. В вашем случае это должен быть какой-то сервис, который будет выдавать информацию об ОС, пользователе, параметрах машины и т.п. Вы этот сервис сами собираетесь писать? Ни одна из известных мне операционных систем такого сервиса не предоставляет. Каким образом собираетесь гарантировать, что сервис запущен? 

Цитата(Kamil @  28.11.2006,  15:53 Найти цитируемый пост)
Если есть такие утилиты, то наверное их можно сделать на Java.

Наверное есть. Только поймите, наконец, программа на Java работает внутри Java-машины и не имеет никакого доступа ни к оборудованию машины ни к сервисам операционной системы за исключением того, что ей явно предоставляет JVM. Поэтому чтобы получить сведения о пользователе и аппаратуре машины придется использовать сервисы ОС либо напрямую работать с оборудованием. На Java это сделать НЕВОЗМОЖНО. Можно лишь вызвать из Java зависимый от платформы код, написанный для конкретной ОС и процессора. Разумеется, то, что у вас работало в одной операционной системе в другой скорее всего не будет, поэтому придется это учитывать.

Автор: LSD 28.11.2006, 18:19
Цитата(Kamil @  28.11.2006,  15:53 Найти цитируемый пост)
Не знаю верно это или нет, но как мне кажется может есть какой то протокол и порт по которому машины могут обмениваться информацией, а если конкретно, какая используется ОС, информация о пользователе, о параметрах машины.

По этому вопросу вообщем согласен с tux, за исключением одного:
Цитата(tux @  28.11.2006,  16:18 Найти цитируемый пост)
Ни одна из известных мне операционных систем такого сервиса не предоставляет.

Вообщем они предоставляют такие сервисы (чем PsUtils и пользуются), только:
а) для разных версий ОС они могут варьироваться или поддерживаться в неполном объеме
б) для разных ОС они совершенно различны
с) эта информация приватная, и для ее получения нужен доступ с соответсвующими правами к удаленной системе (пароль администратора в Windows, пароль root в *nix и т.п.)


Цитата(Kamil @  28.11.2006,  15:53 Найти цитируемый пост)
Если есть такие утилиты, то наверное их можно сделать на Java.

Теоретически можно, т.к. они работают по TCP/IP и UDP, а их поддержка в Java есть. Но практически это означает повторение API ОС, что как минимум трудоемко, как максимум нереализуемо т.к. у Microsoft многие протоколы закрытые. Так что проще, надежней и быстрей будет вызывать функции API через JNI.

Автор: Kamil 28.11.2006, 23:54
Сейчас у меня две главные проблемы:

- сроки выполнения проекта. 2 дня. 

- выбор решения. 

Вначале я увидел решение с этими утилитами, хотя у меня возник небольшой технический вопрос.

Потом другое решение 

Цитата

Так что проще, надежней и быстрей будет вызывать функции API через JNI.


Не знаю я что такое JNI, попробую разобраться. И еще. Опять стоит вопрос об используемой ОС у клиента. Не так ли? Ведь я должен знать какие API должен вызывать ? Или где я неправ ?

А технический вопроc такой:

Если я буду использовать утилиты, то я должен параллельно копировать данную утилиту в пакет с jar-файлом, в котором находится программа. Так вот. Когда я буду вызывать метод Runtime.exec(), то как программа найдет эту утилиту? В текущей папке искать будет? Или с помощью exec-a запустить bat-файл с командой утилиты? 

Автор: Kamil 29.11.2006, 00:38
Так. Как будто понял, что такое JNI и как он работает. Теперь другой вопрос.

Я удаленно запрашиваю JNI-функцию. Она должна вернуть мне результат. Пока будем считать, что используется ОС Windows на удаленном компе, вызывается эта функция из dll-ки. 

Теперь вопрос. Как удаленно вызвать JNI-функцию? Ведь, когда я объявил у себя, что использую native-метод в Java-коде, то подразумевается, что выполнение этого метода будет происходить на локальной библиотеке. Как быть?

Добавлено @ 00:49 
Цитата

эта информация приватная, и для ее получения нужен доступ с соответсвующими правами к удаленной системе (пароль администратора в Windows, пароль root в *nix и т.п.)


Еще и получается, что даже если я смогу запустить удаленно JNI-функцию, то потом мне может помешать незнание пароля админа на удаленном компе? Если да, то это очень плохо...... 

Так. Прежде всего мне надо узнать какие библиотеки использовать для вызова native-методов, потом узнать работает ли это дело удаленно, ну а потом узнать есть ли на это у меня права.


Может у кого есть полезная информация по этому поводу?

Автор: Kamil 29.11.2006, 11:12
Нашел информацию, что JNI -функцию можно вызвать удаленно с помощью RMI. Помогите с примерами. Я не знаю какие API функции использовать для решения моих методов

Автор: LSD 29.11.2006, 11:48
И пример использования JNI, и пример использования RMI есть у нас в FAQ.

Автор: Kamil 29.11.2006, 12:04
Мне нужен пример удаленного вызова JNI-функции

Автор: LSD 29.11.2006, 12:09
В чем проблема? Объявляешь функции которые реализует Remote interface - native и все (только не в интерфейсе их объявляй native, а в реализации).

Автор: Kamil 29.11.2006, 12:22
Я не знаю какую библиотеку у клиента вызывать

Автор: Kamil 29.11.2006, 13:31
Один вопрос, библиотеку я вызываю у клиента. Данные мне будут передаваться по RMI. Так? Это что получается у клиента должен быть запущен сервер, который будет слушать порт для нужного мне объекта ?

Или я совсем запутался что ли?

Автор: LSD 29.11.2006, 13:54
Цитата(Kamil @  29.11.2006,  13:31 Найти цитируемый пост)
Один вопрос, библиотеку я вызываю у клиента. Данные мне будут передаваться по RMI. Так? Это что получается у клиента должен быть запущен сервер, который будет слушать порт для нужного мне объекта ?

Да.

Автор: Kamil 29.11.2006, 22:41
Я не пойму. Мне что надо удаленно запустить RMI-сервер, который будет ждать, пока я не запрошу у него объект с native-методом?

Такое возможно?

Автор: shimopus 29.11.2006, 22:46
Да, именно так и надо делать по твоему замыслу.

Автор: Kamil 29.11.2006, 23:23
Я не видел примера, чтобы можно было запустить rmiregistry удаленно. ТАк еще же проблема в том, что у клиентов должна быть программа сервера, которая создаст мне объект с native-методом. 

Это же не правильно. 

И tux писал:
Цитата

Каким образом собираетесь гарантировать, что сервис запущен? 


Решение tux правильнее:

Цитата

Можно лишь вызвать из Java зависимый от платформы код, написанный для конкретной ОС и процессора. 


И надо добавить, что 
Цитата
 Программа запускается на сервере.
, а native-метод должен вызываться на удаленной машине. Вызов метода инициирует сервер. 

Моя проблема: создать на сервере класс с native-методом, реализация которой находится на удаленной машине.

Вызове метода на сервере приводит к выполнению метода у клиента. 

Где я не прав? Если нет, то как должно быть? 

Автор: LSD 30.11.2006, 12:05
Цитата(Kamil @  29.11.2006,  23:23 Найти цитируемый пост)
Я не видел примера, чтобы можно было запустить rmiregistry удаленно. ТАк еще же проблема в том, что у клиентов должна быть программа сервера, которая создаст мне объект с native-методом.

rmiregistry можно запустить где угодно, она используется только для того чтобы клиент и сервер могли друг друга найти. Единственное но, и клиент и сервер должны знать где находится rmiregistry.
А вот RMI-server действительно придется запускать у клиента, и как это сделать на автомате я не представляю.

Цитата(Kamil @  29.11.2006,  23:23 Найти цитируемый пост)
Где я не прав? Если нет, то как должно быть?

Везде smile
На клиенте запускается RMI-server который с помощью native методов получает информацию об этой системе и возвращает ее вызывающему.

Автор: Kamil 30.11.2006, 12:12
Цитата

На клиенте запускается RMI-server который с помощью native методов получает информацию об этой системе и возвращает ее вызывающему.


Чтобы запустить у клиента RMI-сервер, нужно передать клиенту этот сервер и запустить его.

Не так ли ? 

Автор: LSD 30.11.2006, 12:37
Да

Автор: Kamil 30.11.2006, 12:59
Получается, когда я открываю нужный мне IP-шник, чтобы посмотреть его данные: 

- я загружаю на удаленную машину RMI-сервер; 
- каким-то образом запускаю (неизвестно реально ли это сделать);
- затем у себя на сервере вызываю нужную мне объект, который выполнит JNI-функцию на удаленной машине (неизвестно что за JNI-функция, искал в справочнике по WinAPI - не нашел);

С первым шагом вроде бы все понятно.
Со вторым вообще не понятно (видел чо-то про RMI-callback. Это не то?).
C третим тоже, не знаю какую библиотеку надо использовать. Искал в google - чо то не ту. Кстати нет какой нибудь книжки где были бы перечислены все API-функции, библиотеки? Знаю, что в MSDN есть, но у меня проблема установить его сейчас на свой комп.

Автор: LSD 30.11.2006, 13:19
Цитата(Kamil @  30.11.2006,  12:59 Найти цитируемый пост)
Получается, когда я открываю нужный мне IP-шник, чтобы посмотреть его данные: 

- я загружаю на удаленную машину RMI-сервер; 
- каким-то образом запускаю (неизвестно реально ли это сделать);
- затем у себя на сервере вызываю нужную мне объект, который выполнит JNI-функцию на удаленной машине (неизвестно что за JNI-функция, искал в справочнике по WinAPI - не нашел);

Ни одна нормальная ОС не даст постороннему компьютеру залезть на нее и выполнить некий код. Я тебе об этом уже в который раз твержу!
Либо пользователь сам должен скачать и запустить твой код. Либо дать тебе нужные права на удаленной системе. Ты знаешь как решить эту проблему?

Автор: Kamil 30.11.2006, 13:30
Цитата

Ни одна нормальная ОС не даст постороннему компьютеру залезть на нее и выполнить некий код.


Каким то образом работает же PsLoggedOn. И нечего не загружается на клиента.


Как будто мне сейчас только эти утилиты помогут.

Кстати, как насчет вопроса:
Цитата

А технический вопроc такой:

Если я буду использовать утилиты, то я должен параллельно копировать данную утилиту в пакет с jar-файлом, в котором находится программа. Так вот. Когда я буду вызывать метод Runtime.exec(), то как программа найдет эту утилиту? В текущей папке искать будет? Или с помощью exec-a запустить bat-файл с командой утилиты? 

Автор: LSD 5.12.2006, 13:33
Цитата(Kamil @  30.11.2006,  13:30 Найти цитируемый пост)
Каким то образом работает же PsLoggedOn. И нечего не загружается на клиента.

1. Он использует сервисы предоставляемые Windows
2. Ему требуется указать логин и пароль администратора

Цитата(Kamil @  30.11.2006,  13:30 Найти цитируемый пост)
Кстати, как насчет вопроса:

Точно так же, как это будет делать Пуск\Выполнить, вначале будет искаться в текущем каталоге, потом в PATH.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)