Как я могу обнаружить другой экземпляр того же приложения Win32, запущенного на другой рабочей станции? - PullRequest
4 голосов
/ 14 февраля 2009

У меня есть небольшое приложение, которое бесплатно для личного использования, но требует платной лицензии для корпоративного использования.

Скорее всего, в корпоративной среде мое приложение будет работать на нескольких рабочих станциях. Если это бесплатная версия, я хочу показать ненавязчивое сообщение. (и продолжить)

Это не должно быть пуленепробиваемым, если это невозможно (например, брандмауэр), тогда приложение должно просто продолжаться. И я не хочу, чтобы пользователь настраивал какую-то центральную службу для отслеживания экземпляров. Я не хочу раздражать своих пользователей (особенно не платящих * g *)

Есть ли способ реализовать такую ​​функциональность?

Я помню, что более старая версия Dreamweaver имела такую ​​функцию. Вы не могли запустить его более одного раза в одной сети.

Ответы [ 4 ]

4 голосов
/ 14 февраля 2009

В одну сторону: прослушивание UDP-трансляции на определенных портах. Пусть каждый экземпляр отправляет широковещательный пакет UDP на этом порту в локальную сеть. Если приложение получает такой пакет и распознает его структуру, оно знает, что запущен другой экземпляр.

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

Широковещательные рассылки обычно не маршрутизируются, поэтому это работает только в локальной сети. (И пользователь может полностью отключить его через брандмауэр ... но если вы будете использовать какой-то стандартный порт, например 53 (DNS), он не будет заблокирован).

Другой способ - использовать пользовательский сервер, который информирует обо всех запущенных экземплярах по всему миру; -)

3 голосов
/ 14 февраля 2009

Когда приложение запускается, оно отправляет широковещательную UDP-рассылку на определенный порт. Это будет ограничено локальной подсетью и может не пройти через брандмауэры. Это "кто-нибудь еще работает, или я могу начать?" запрос.

Если ответов нет, приложение запускается в обычном режиме, прослушивая эту передачу UDP. Если он его видит, он отвечает пакетом «Я уже запущен; вы не можете запустить».

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

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

3 голосов
/ 14 февраля 2009

Есть два основных способа добиться этого:

Во-первых, вы можете настроить небольшое серверное приложение на каждой рабочей станции, которое обменивается данными с другими рабочими станциями в сети (лично я бы использовал Bonjour для обнаружения, но есть и другие варианты). Недостатком здесь является то, что вы собираетесь написать немного больше кода, чтобы сделать эту работу, чем вариант № 2.

Во-вторых (возможно, проще) было бы использовать WMI для перечисления процессов на других рабочих станциях (опять же, возможно, использовать Bonjour-подобную систему для обнаружения) и обнаружить, что ваш процесс работает на других машинах. Недостатком этого является то, что ваш код перечисления потребует привилегий на всех машинах для проведения поиска.

0 голосов
/ 14 февраля 2009

Зло корпорация решение:
Попросите приложение звонить домой каждый раз, когда оно запускается. Если просыпается несколько заявлений на получение лицензии, скажите не Если нет подключения к Интернету, не запускайте вообще.

...