2010-10-21 59 views
3

這種情況是我想讓用戶打開該程序的多個實例,但我不想讓多個登錄用戶一次使用該程序。因此,例如,如果程序安裝在服務器上,並且多個用戶可以將遠程桌面安裝到服務器上,我只希望一個用戶能夠運行該程序,但仍能夠運行多個實例。我已經研究過使用互斥鎖,但是從我發現的互斥鎖只會允許該程序的一個實例。這是C#可能的東西嗎?如何只允許一個用戶運行我的C#程序,但也允許多個實例?

+0

你能更具體嗎?你想限制只有一個特定的用戶,或任何用戶,但一次只有一個? – slugster 2010-10-21 21:27:18

+0

我希望能夠允許任何用戶,但只有該用戶可以一次運行一個或多個實例。 – 2010-10-21 21:37:16

回答

2

我會使用一個命名的互斥體。在其保護內部,記錄當前登錄的用戶。如果存在,並且它不是當前用戶,則退出 - 否則,記錄當前用戶正在運行該應用程序。

+0

感謝您的建議。我最終使用了兩個名爲mutexes的系統,它似乎工作得很好。現在我要看看QA是否能夠打破它。 – 2010-10-22 17:09:37

0

我會禁用內置的一個實例功能並編寫自己的。只需單步執行所有正在運行的進程,並且如果找到了您的進程,請查看用戶是否與當前用戶相同。如果是,退出其中一個實例。

編輯:這將要求用戶擁有管理員權限,這在您提出的情況下不太可能。可能有更好的方法來做到這一點,但你總是可以在文件或註冊表中進行一些鎖定......所有用戶都有讀寫權限的區域。使用當前用戶名和時間戳更新該鎖定文件,每隔x秒左右。如果另一個用戶試圖打開該程序,那麼你可以告訴他們誰打開了它。如果當前用戶已經打開它,沒什麼大不了的。如果鎖定文件已過期,請忽略它......您可以假定創建該文件的實例不再存在。

+0

這將要求所有登錄到遠程服務器的用戶都具有管理員權限。否則,他們無法列出在不同憑據下運行的進程。 – 2010-10-21 21:14:35

+0

啊,好點!編輯我的答案... – Brad 2010-10-21 21:18:51

3

這是通常通過作爲許可證管理器運行的獨立應用程序處理的東西。您可以擁有提供許可證的服務,並跟蹤當前的使用情況,並使您的應用程序在啓動時連接到管理器。管理員可以檢查憑證,並根據任何標準(包括只有1個用戶(具有多個副本),最多N個用戶等)來回應是否允許應用程序運行。

Windows Communication Foundation適用於實施與服務之間的通信。

+0

不幸的是,我沒有選擇讓我們的用戶安裝一個單獨的應用程序來運行這個應用程序。 – 2010-10-21 23:16:17

+0

@Alex:遺憾的是,沒有提升權限,沒有真正有效的方法來控制不同的用戶(通過設計)。您可以限制一個用戶登錄內的應用程序數量,但不能通過沒有管理員權限或主管服務的計算機。 – 2010-10-21 23:34:40

0

使用一個有名的Mutex。互斥體名稱將爲MyMutex_ [用戶名] 這樣,您將爲每個用戶使用不同的單個互斥體。

相關問題