4

我有一个小型应用程序,个人使用免费,但企业使用需要付费许可证。

在公司环境中,我的应用程序很可能会在多个工作站上运行。如果是免费软件版本,我想显示一条不显眼的信息。(并继续)

它不必是防弹的,如果不可能(即防火墙),那么应用程序应该继续。而且我不想让用户设置某种中央服务来跟踪实例。我不想惹恼我的用户(尤其不是付费用户 *g*)

有没有办法实现这种功能?

我记得旧版本的 Dreamweaver 有这种功能。您不能在同一个网络中多次运行它。

4

4 回答 4

4

一种方法:侦听特定端口上的 UDP 广播。让每个实例在此端口上向本地网络发送广播 UDP 数据包。如果应用程序接收到这样的数据包,并识别出它的结构,它就知道其他实例正在运行。

如果使用两个有效的许可证,您可以包含许可证详细信息以避免出现消息。

广播通常不会被路由,所以这只适用于本地网络。(并且用户也可以通过防火墙完全禁用它......但如果您使用一些标准端口,如 53(DNS),它不会被阻止)。

另一种方法是使用自定义服务器,它会了解世界各地所有正在运行的实例;-)

于 2009-02-14T18:46:22.607 回答
3

有两种主要方法可以实现这一目标:

首先,您可以在每个工作站上设置一个小型服务器应用程序,与网络上的其他工作站通信(我个人会使用 Bonjour 进行发现,但还有其他选项)。这里的缺点是您将编写比选项#2 更多的代码来完成这项工作。

第二个(可能更简单)是使用 WMI 枚举其他工作站上的进程(同样,可能使用类似 Bonjour 的系统进行发现),并找到您的进程在其他机器上运行。这样做的缺点是您的枚举代码将需要所有机器上的权限才能进行搜索。

于 2009-02-14T18:46:11.470 回答
3

当应用程序启动时,它会在特定端口上发送一个 UDP 广播。这将仅限于本地子网,并且可能无法通过防火墙。这是“还有其他人在跑步,还是我可以开始?” 询问。

如果没有响应,应用程序将正常启动,侦听此 UDP 广播。如果它看到一个,它会响应一个“我已经在运行;你无法启动”数据包。

刚刚启动的应用程序收到此响应数据包,然后拒绝启动或(如果您不想那么严格)向用户显示警告。

您希望在初始请求中包含产品 ID 和许可证密钥(或哈希),以便您可以在同一网络上拥有多个许可证。响应可能需要其中的机器名称,以便第二个用户可以找到第一个用户并询问他们是否真的需要使用该应用程序。

于 2009-02-14T18:54:26.940 回答
0

邪恶
的公司解决方案:每次启动时让应用程序回家。如果唤醒了多个许可证申请,请告诉它不要这样做。如果没有互联网连接,请不要开始。

于 2009-02-14T19:15:49.573 回答