2009-02-14 74 views
4

我有一個小應用程序,它是免費供個人使用的,但需要付費許可證才能供公司使用。如何檢測在另一個工作站上運行的相同Win32應用程序的另一個實例?

這很可能是在公司環境中,我的應用程序將在多個工作站上運行。如果它是免費版本,我想顯示一個不顯眼的消息。 (並繼續)

它不一定是防彈的,如果它不可能(即防火牆),那麼應用程序應該繼續。我不想讓用戶設置某種中央服務來跟蹤實例。我不想惹惱我的用戶(特別是不支付的* g *)

有什麼方法可以實現這種功能嗎?

我記得Dreamweaver的舊版本有這種功能。您不能在同一個網絡中多次運行它。

+0

如果你在我的機器上這樣做了,那麼我的防火牆會彈出一條消息,說「應用程序Foo想訪問網絡,是嗎?」。可以嗎?如果我是您的最終用戶之一,我是否會被告知您的應用程序正在進入網絡? – ChrisW 2009-02-14 18:51:51

回答

4

單程:監聽特定端口上的UDP廣播。讓每個實例將此端口上的廣播UDP數據包發送到本地網絡。如果應用程序收到這樣的數據包,並識別其結構,則知道其他實例正在運行。

如果使用兩個有效的許可證,可以包含許可證詳細信息以避免消息。

廣播通常不會路由,所以只適用於本地網絡。 (用戶也可以通過防火牆完全禁用它...但是如果你將使用像53(DNS)這樣的標準端口,它將不會被阻止)。

另一種方法是使用自定義的服務器,這是所有正在運行的實例世界;-)

3

主要有兩種方式來實現這一目標:

首先,你可以設置與其他工作站在網絡上通信的每個工作站上的小型服務器應用程序(我個人會使用Bonjour的發現,但也有其他選項)。這裏的缺點是你會寫更多的代碼來完成這個工作,而不是選項#2。

其次(可能更簡單)是使用WMI來枚舉其他工作站上的進程(也可能使用類似Bonjour的系統進行發現),並查找在其他計算機上運行的進程。這樣做的缺點是您的枚舉代碼將需要在所有機器上執行搜索的權限。

3

應用程序啓動時左右獲悉,它會發出特定端口上的UDP廣播。這將僅限於本地子網,並且可能無法通過防火牆。這是「是否有其他人在跑步,還是我可以開始?」查詢。

如果沒有響應,應用程序將正常啓動,偵聽此UDP廣播。如果它看到一個,它會迴應一個「我已經運行;你無法啓動」數據包。

剛剛啓動的應用程序接收到此響應數據包,然後拒絕啓動或(如果您不想那麼嚴格)向用戶顯示警告。

您希望在初始請求中包含產品ID和許可證密鑰(或散列),以便您可以在同一網絡上擁有多個許可證。響應可能需要其中的機器名稱,以便第二個用戶可以去找到第一個用戶並詢問他們是否真的需要使用該應用程序。

0

Evil corporation解決方案:
每次啓動應用程序時都會將應用程序調用回家。如果一個以上的許可申請醒來,告訴它不要。如果沒有互聯網連接,請不要啓動。

+0

這似乎是現在所有主要公司的標準解決方案:) – 2009-02-14 19:30:57

相關問題