我正在我们的应用程序中实施许可。
如何阻止用户在 Windows 终端服务器上多次使用相同的登录。
Windows 终端服务器中是否可以将特定参数传递给 Win32_Process?
如果有,那么我可以从中读取并且不允许第二次登录。
或者必须有像中央 Windows 服务这样的东西,我的 exe 需要在启动之前对其进行身份验证。
有什么建议么?
我正在我们的应用程序中实施许可。
如何阻止用户在 Windows 终端服务器上多次使用相同的登录。
Windows 终端服务器中是否可以将特定参数传递给 Win32_Process?
如果有,那么我可以从中读取并且不允许第二次登录。
或者必须有像中央 Windows 服务这样的东西,我的 exe 需要在启动之前对其进行身份验证。
有什么建议么?
最好的方法是使用全局Mutex:
bool owned;
using (var mutex = new Mutex(true, @"Global\SingleUserNameLogon-" + CurrentUserName, out owned))
{
if (!owned)
{
MessageBox.Show("This program can only be run by one person at a time!");
closeTheForm();
}
//Put the rest of your program here
}
这将创建一个名为 的互斥锁Global\SingleUserNameLogon-Bhoomi
,如果程序检测到另一个程序已经创建了一个具有该确切名称的互斥锁,它将调用该closeTheForm()
函数。
通过在互斥锁的名称前加上Global\
它,将检查计算机上的所有会话以查找具有相同名称的互斥锁,而不仅仅是运行应用程序的会话。
需要注意的一点是,一旦释放了互斥锁,另一个程序就可以运行,因此您可能不需要将互斥锁放在using
语句中,而是将其保留为您在构造函数中创建并在关闭时释放的表单的局部变量。
经过大量搜索,我想出了一个自定义解决方案。
解决方案是这样的:
当用户打开 exe 时,用户名会附加到 exe 的文本(窗口标题)中,如下所示:
this.text = 当前用户名;
当 exe 加载时,它将检查所有正在运行的进程,如下所示:
Process[] processlist = Process.GetProcesses();
foreach (Process theprocess in processlist)
{
if (theprocess.ProcessName == "SingleUserNameLogon" || theprocess.ProcessName == "SingleUserNameLogon.exe")
if(CurrentUserName == theprocess.MainWindowTitle)
{
closeTheForm();
}
}
这是一个自定义解决方案。
欢迎任何其他优雅的解决方案。