如何让我的程序不在其他计算机上运行?

时间:2009-07-01 15:55:40

标签: c# installer

我有一项任务,它有(其中包括)两项要求:

  • 制作安装程序
  • 使它如果安装在一台计算机上,任何试图在另一台计算机上运行相同文件的人都将失败。

我正在使用VS9(2008)快递,我想我可以做安装程序部分,但我不知道如何做“安全”部分。我不需要任何难以破解的安全性,只是一个愚蠢的条件,将阻止大多数用户将文件复制到另一台计算机。 (比如检查MAC地址)。

有什么想法吗?

修改
我想检查MAC地址,但我希望程序在安装过程中完成。这意味着我安装后无法将程序移动到另一台机器。它也不一定非常聪明或困难,只是最低限度。我只是不知道如何在安装中这样做。

修改
很遗憾我没有完整的VS然后我就能轻松完成。

9 个答案:

答案 0 :(得分:8)

如果您正在寻找某种方法将第一台计算机标记为“授权”计算机,那么您需要一些外部服务,您可以要求获得启动许可。

第一个获得许可的人将被允许,其余的将被阻止。

您还需要想出一些方法来识别每次安装时不同的应用程序的特定实例。

如果您的应用需要获得机器授权,那么您需要为每次可以使用的机器计算一些指纹(例如,跨安装)。

<强> [编辑] 当您担心正在分发的安装程序副本时,此方法很有用。您确实指定可以在多台计算机上安装,因此在这种情况下MasterMind的方法更优越。它可以工作,不需要第三方服务器

[编辑2] 如果您正在寻找有关如何构建自定义安装程序的信息,请尝试here

答案 1 :(得分:6)

首先,提出一些函数来生成一个独特的PC签名,就像Windows一样用于激活。

您的安装程序将创建此签名并将其写入本地文件(更好地加密)。您可以创建一个简单的控制台可执行文件来生成此文件,并将该可执行文件包含在安装程序包中,并将其设置为在安装成功后以静默方式运行。

启动时,您的程序将使用相同的算法再次创建签名,并将其与安装期间创建的算法进行比较。如果新签名与原始签名不同或签名文件丢失,则退出而不加载UI。

增加:如果您不需要它非常复杂,您可以选择一些独特的值,例如您建议的MAC地址,可能是硬盘序列号,主板序列号,将它们连接成一个字符串并生成哈利出来。

此方法允许运行无限数量的副本(但每个安装只能在安装它的一台计算机上运行)。如果您坚持使用硬件(或OS产品密钥)进行识别,则应用程序可以在同一台机器上的各种操作系统上运行。

但是,此策略意味着您可以控制所有安装(或自行执行)或绝对信任您的客户端,不在其他地方安装其他副本或分发安装程序。如果您还需要这种保护,那么您应该考虑产品激活。如果你自己做的话可能会很复杂。然而,有第三方产品可以帮助您。有些提供产品激活服务:Google: activation service

答案 2 :(得分:5)

一旦你有一个像样的指纹,其余的很容易。就个人而言,我会采取类似MAC地址和Windows产品ID(在HKLM \ Software \ Microsoft \ Windows \ CurrentVersion \ ProductId),并使用散列算法来得到一些相当模糊的东西。

编辑:

这是一个问题,向您展示如何将MAC地址作为字符串: Read MAC Address from network adapter in .NET

然后从上面的注册表项中获取您的Windows产品ID(如果它们没有网络适配器)。连接两个字符串并对结果执行GetHashCode()(或使用您最喜欢的散列算法)。这是获取计算机UID的简单方法。

在安装程序执行时将散列写入文件或注册表项,并在程序启动时进行检查。

答案 3 :(得分:2)

考虑使用两个或多个可能识别机器的值,例如

  • Windows产品代码
  • C:驱动器的卷序列号
  • 以太网接口的MAC地址

如果只是其中一个更改但其他更改匹配,请更新注册表中的一个值并继续正常运行。硬盘驱动器被更换(定期),Windows升级(偶尔),以太网适配器被替换(很少但确实发生了。)当旧软件因此停止工作时,这可能非常令人沮丧。

答案 4 :(得分:2)

最低答案,假设这里唯一的要求是如果通过安装程序安装软件应该运行,如果复制到另一台计算机则不会运行:

将一个简单的密钥写入注册表。很可能是您的产品的版本号,如果他们将新版本复制到计算机,它有不同的号码可供检查。

在您的软件中,只需确保此注册表值存在。

对于打包安装,我喜欢使用NSIS,它有简单的方法写入注册表。

答案 5 :(得分:0)

我喜欢检查MAC地址的想法。

我还看到了产品密钥/在线激活组合,您可以在其中输入产品密钥,软件会联系记录产品密钥和安装数量的Web服务。

答案 6 :(得分:0)

这不是最安全的选择或任何东西,但你确实说它不一定要聪明......

在安装时,您可以将程序变量设置为计算机名称(如果您愿意,可以将其设置为哈希)。

喜欢:

myProgram.Properties.Settings.Default.Machine = System.Environment.MachineName;
myProgram.Properties.Settings.Default.Save();

然后在启动时检查:

if (System.Environment.MachineName != myProgram.Properties.Settings.Default.Machine)
{
    MessageBox.Show("Can't run on this computer");
    this.Close();
}

答案 7 :(得分:-1)

要使安装程序仅适用于一台计算机,您几乎必须为目标计算机构建它。我不认为有可能制作一个安装程序,假设它看到的第一台机器是它的妈妈,并且终生使用。

答案 8 :(得分:-2)

-1用于坚持过时的许可限制政策,这种做法一般都是不好的做法。硬件加密狗和“设备检测”是SO 1990。

人们拥有多台计算机。他们买新电脑。他们升级他们的电脑。计算机坏了,导致更换主板或网卡。

所有这些,根据您的设计,将导致诚实的付费客户被锁定他们已付款,并且将不得不打电话给您支持“重置”他们的激活。

每次这样做,您的开销将增加,很可能会超过许可的实际成本。

我不是建议你放弃,只是将你的应用程序发送给torrent,但是你应该认为更具创造性关于如何让客户自由使用他们支付的费用,保持你的支持成本低,并阻止海盗。

一个有创意的解决方案是将用户的设置缓存在服务器上,并按其序列号键入,并在每次应用程序启动并连接到网络时同步它们。

这将允许用户在笔记本电脑和台式机上安装应用程序,并且实际上是客户的增值服务,因为他们的设置在设备之间同步。

但是它主动阻止用户共享他们的许可证密钥,因为这样做意味着他们将与每个盗版用户共享他们的设置,或者他们必须记住在他们打开或关闭应用程序时保持与Interwebs断开连接

相关问题