2013-04-05 57 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

相关问题