| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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, но там должен быть естественно другой путь. Насчет других ОС - не знаю. Здесь у меня возникает следующие проблемы: надо получить инфу о названии удаленной залогиненной учетки, это раз. Другая проблема, надо узнать какая ОС используется на клиенте.
Да |
| Автор: Kamil 27.11.2006, 22:32 | ||||
Может у клиента запущен объект с методом, который и возвращает булевое значение - он залогинился или нет?
Ситуация здесь такая. Программа запускается на сервере. Ее запускает админ. Какие права у удаленной учетки - неизвестно. Хотя интересно было бы и это узнать. Но это пока не требуется знать в моем проекте. |
| Автор: 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 | ||||||||||
На чистой Java это не реализовать, надо будет поизвращаться.
Сервер понятие слишком общее. Если это контроллер домена и машина в домене, то тут можно получить практически полный контроль над удаленной машиной. А если это веб сервер, то тут отличия от рядовой машины нет.
Есть такая штука PsUtils от Sysinternals, у них есть ряд консольных утилит которые могут помочь, во первых это PsLoggedOn:
и PsList:
Они обе консольные и с ними можно работать черес Runtime.exec(). |
| Автор: Kamil 28.11.2006, 13:12 | ||||
Понятия не имею, как это будет работать. Насчет сервера. Понимаете, программа также будет контролировать, подключены клиенты к Интернету или нет, следовательно как я понимаю, программа должна запускаться на Proxy, а вот насчет контроллера домена... Вообще, у меня метод поиска клиентов используют метов isReachable у InetAddress-a. Думал использовать Multicasting, что то не работало у меня. Так вот, когда я получаю IP-шники, мне надо их отсортировать по доменам. Я запускал программу в простой локалке для поиска и мне возвращались неполные имена компов (т.е. без именем домена). Как тут мне поможет контроллер домена? Не совсем понял цитату
Добавлено @ 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, 15:53 | ||
| Если есть такие утилиты, то наверное их можно сделать на Java. Неужели нет программ на подобие этой?
Не знаю верно это или нет, но как мне кажется может есть какой то протокол и порт по которому машины могут обмениваться информацией, а если конкретно, какая используется ОС, информация о пользователе, о параметрах машины. |
| Автор: tux 28.11.2006, 16:18 | ||
Протокол и порт может и есть, вот только... Порт - это суть логический интерфейс, через которые приложения могут обмениваться данными. Чтобы порт выдавал какую-то информацию нужно чтобы на этот порт прослушивало какое-то приложение. В вашем случае это должен быть какой-то сервис, который будет выдавать информацию об ОС, пользователе, параметрах машины и т.п. Вы этот сервис сами собираетесь писать? Ни одна из известных мне операционных систем такого сервиса не предоставляет. Каким образом собираетесь гарантировать, что сервис запущен? Наверное есть. Только поймите, наконец, программа на Java работает внутри Java-машины и не имеет никакого доступа ни к оборудованию машины ни к сервисам операционной системы за исключением того, что ей явно предоставляет JVM. Поэтому чтобы получить сведения о пользователе и аппаратуре машины придется использовать сервисы ОС либо напрямую работать с оборудованием. На Java это сделать НЕВОЗМОЖНО. Можно лишь вызвать из Java зависимый от платформы код, написанный для конкретной ОС и процессора. Разумеется, то, что у вас работало в одной операционной системе в другой скорее всего не будет, поэтому придется это учитывать. |
| Автор: LSD 28.11.2006, 18:19 | ||||
По этому вопросу вообщем согласен с tux, за исключением одного:
Вообщем они предоставляют такие сервисы (чем PsUtils и пользуются), только: а) для разных версий ОС они могут варьироваться или поддерживаться в неполном объеме б) для разных ОС они совершенно различны с) эта информация приватная, и для ее получения нужен доступ с соответсвующими правами к удаленной системе (пароль администратора в Windows, пароль root в *nix и т.п.) Теоретически можно, т.к. они работают по TCP/IP и UDP, а их поддержка в Java есть. Но практически это означает повторение API ОС, что как минимум трудоемко, как максимум нереализуемо т.к. у Microsoft многие протоколы закрытые. Так что проще, надежней и быстрей будет вызывать функции API через JNI. |
| Автор: Kamil 28.11.2006, 23:54 | ||
| Сейчас у меня две главные проблемы: - сроки выполнения проекта. 2 дня. - выбор решения. Вначале я увидел решение с этими утилитами, хотя у меня возник небольшой технический вопрос. Потом другое решение
Не знаю я что такое JNI, попробую разобраться. И еще. Опять стоит вопрос об используемой ОС у клиента. Не так ли? Ведь я должен знать какие API должен вызывать ? Или где я неправ ? А технический вопроc такой: Если я буду использовать утилиты, то я должен параллельно копировать данную утилиту в пакет с jar-файлом, в котором находится программа. Так вот. Когда я буду вызывать метод Runtime.exec(), то как программа найдет эту утилиту? В текущей папке искать будет? Или с помощью exec-a запустить bat-файл с командой утилиты? |
| Автор: Kamil 29.11.2006, 00:38 | ||
| Так. Как будто понял, что такое JNI и как он работает. Теперь другой вопрос. Я удаленно запрашиваю JNI-функцию. Она должна вернуть мне результат. Пока будем считать, что используется ОС Windows на удаленном компе, вызывается эта функция из dll-ки. Теперь вопрос. Как удаленно вызвать JNI-функцию? Ведь, когда я объявил у себя, что использую native-метод в Java-коде, то подразумевается, что выполнение этого метода будет происходить на локальной библиотеке. Как быть? Добавлено @ 00:49
Еще и получается, что даже если я смогу запустить удаленно 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, 22:41 |
| Я не пойму. Мне что надо удаленно запустить RMI-сервер, который будет ждать, пока я не запрошу у него объект с native-методом? Такое возможно? |
| Автор: shimopus 29.11.2006, 22:46 |
| Да, именно так и надо делать по твоему замыслу. |
| Автор: Kamil 29.11.2006, 23:23 | ||||||
| Я не видел примера, чтобы можно было запустить rmiregistry удаленно. ТАк еще же проблема в том, что у клиентов должна быть программа сервера, которая создаст мне объект с native-методом. Это же не правильно. И tux писал:
Решение tux правильнее:
И надо добавить, что
Моя проблема: создать на сервере класс с native-методом, реализация которой находится на удаленной машине. Вызове метода на сервере приводит к выполнению метода у клиента. Где я не прав? Если нет, то как должно быть? |
| Автор: LSD 30.11.2006, 12:05 | ||
rmiregistry можно запустить где угодно, она используется только для того чтобы клиент и сервер могли друг друга найти. Единственное но, и клиент и сервер должны знать где находится rmiregistry. А вот RMI-server действительно придется запускать у клиента, и как это сделать на автомате я не представляю. Везде На клиенте запускается RMI-server который с помощью native методов получает информацию об этой системе и возвращает ее вызывающему. |
| Автор: Kamil 30.11.2006, 12:12 | ||
Чтобы запустить у клиента 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, 13:30 | ||||
Каким то образом работает же PsLoggedOn. И нечего не загружается на клиента. Как будто мне сейчас только эти утилиты помогут. Кстати, как насчет вопроса:
|
| Автор: LSD 5.12.2006, 13:33 | ||
1. Он использует сервисы предоставляемые Windows 2. Ему требуется указать логин и пароль администратора Точно так же, как это будет делать Пуск\Выполнить, вначале будет искаться в текущем каталоге, потом в PATH. |