2013-04-05 59 views
0

我的WinForm應用程序必須根據登錄的用戶打開特定表單。在登錄表單中,用戶認證完成,用戶提供用戶名密碼。有效憑據位於.csv文件中。如果用戶有效,登錄表單將被隱藏並顯示Form2。阻止用戶打開表單,如果其他實例有此用戶

我想要做的是阻止打開應用程序(登錄表單)的用戶,併爲已經運行此應用程序的用戶提供相同的用戶名 - 密碼。 我目前的解決辦法是添加到每個流程(例如)環境變量與登錄的用戶名是這樣的:

Process proc = System.Diagnostics.Process.GetCurrentProcess(); 
proc.StartInfo.EnvironmentVariables.Add("G2GUser",username); 

,用另一個實例打開時,checkes如果誰試圖登錄已經是用戶使用應用。因此,此變量正在檢查:

List<Process> processes =  System.Diagnostics.Process.GetProcessesByName(System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location)).ToList(); 
foreach (Process proc in processes) 
{ 
    StringDictionary sd = proc.StartInfo.EnvironmentVariables; 
    if (!String.IsNullOrEmpty(sd["G2GUser"])) 
     if (sd["G2GUser"] == username) {; //block this user} 
} 

問題是我可以看到進程的列表,但EnvironmentVariables不存儲。你能否爲這種方法提出另一種方法?

+1

你想阻止更多的用戶在同一臺​​機器或不同的機器(局域網)?或者你想簡單地阻止在同一臺計算機上重新打開相同的應用程序? – Steve 2013-04-05 13:57:07

+0

如果你想阻止用戶打開另一個應用程序的'Instance',那麼你將需要創建一個'Mutex' – MethodMan 2013-04-05 13:58:53

+0

@DJKRAZE互斥量對於限制多個實例非常有用,但是看起來他想限制一些如果另一個實例正在用登錄到應用程序的相同用戶運行,則應用內行爲;毫無疑問,他希望這樣做可以限制對某些州的共享訪問或防止同時進行修改。 – Clint 2013-04-05 14:10:50

回答

1

我不會推薦使用環境變量。

鑑於您可以有任意數量的應用程序實例,您需要維護某種形式的跟蹤這些用戶。通過反覆交流的實例之間,你可以在它們之間做出決定Example named pipes IPC with read/write timeout

然後:

你可以在應用程序之間通過使用進程間通信,如Named pipes見通信。

+0

感謝您的回答,但對於我的問題似乎非常困惑。我想在用戶登錄時檢查的唯一事情是來自其他實例的變量。爲什麼環境變量不是解決方案? – 2013-04-07 17:04:12

+0

@kk_nou環境變量通常用於搜索路徑等,您可以**使用它們,但它們會產生問題,例如:如果用戶註銷實例會發生什麼情況?然後每個其他實例可能會有關於當前用戶的過時信息。我會用這個答案發布一些例子來幫助你開始。 – Clint 2013-04-07 18:38:09

+0

@kk_nou你需要知道有多少其他實例有該用戶登錄,或者只需要知道另一個實例有特定用戶登錄? – Clint 2013-04-07 18:58:10

相關問題