1

我在这里重新问了这个问题,因为 ServerFault 的人认为这是问这个问题的合适地方

我试图防止人们多次登录到一台计算机并同时使用我的应用程序。换句话说,我想防止它在同一台计算机上同时运行两次。在任何给定时间,只有一个用户运行我的应用程序

我有理由将许可证使用设置得如此严格;我的应用服务于一个非常专业且非常利基的市场。因此,每个副本的成本约为数万。如果这种多重远程登录技术受到重视,我很快就会倒闭。

这是因为我想阻止他们购买一个许可证,将其安装在机器上,并使用某些远程桌面技术进行多用户登录。我想防止他们在技术上违反许可协议,而不是执法。

无论如何,我可以在我的申请中为此做些什么?还是根本不可能同时登录多个?

我更喜欢非加密狗解决方案。我的应用程序仅在 Windows 上运行。

编辑:为了使事情进一步复杂化,我允许同时访问不同的版本(我的客户可以在一台机器上安装同一软件的多个版本并同时启动它们)。我只是不允许同时远程登录。

4

2 回答 2

2

您想防止它在同一台计算机上运行两次吗?

如果是这种情况,解决方案可能非常简单;取出一个系统范围的互斥锁或一些类似的方法,然后检查它并确保它不存在。您可以打开一个套接字或其他任何东西来实现这一点。

或者您想以某种方式停止一个帐户,而不是安装它的帐户,运行它?

于 2009-08-20T06:58:01.120 回答
2

让我稍微澄清一下我的立场。至少丝滑,我似乎以不同的方式解释这一点。

据我了解,您试图阻止多个用户(或同一用户的多个实例)同时登录机器。在这种情况下,您假设机器的唯一目的是运行您的应用程序,但通常情况并非如此。

使用 Silky 的方法(系统范围的互斥锁)来防止多个实例在同一台机器上运行是可以接受的。就个人而言,在采用这种方法之前,我想确保单个用户没有有效的用例来运行应用程序的两个实例来完成任务。

另请参阅此程序员的烦恼。防止多个用户使用同一台机器属于同一类别;)

至于您的多版本问题:为应用程序的每个(主要?)版本的系统范围互斥锁选择一个唯一名称。

具有系统范围互斥锁的基本示例:

static class Program
{
    private static Mutex appMutex = new Mutex(false, "Global\\MyApp 1.0");

    [STAThread]
    static void Main()
    {
        if (!appMutex.WaitOne(0))
        {
            MessageBox.Show("Application is already running. Have a nice day.");
            return;
        }

        // ...
    }
}

Global\前缀使互斥锁在多个终端服务器会话中共享。没有它,它只会阻止用户在同一个会话中运行两个实例。

You should test this approach on an account that has limited rights, as it might be possible that restricted accounts cannot create such a mutex at all.

于 2009-08-20T07:31:59.193 回答