Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使我的程序不在其他计算机上运行?_C#_Installation - Fatal编程技术网

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

C# 如何使我的程序不在其他计算机上运行?,c#,installation,C#,Installation,我有一项任务,其中包括两项要求: 制作安装程序 这样,如果它安装在一台计算机上,任何试图在另一台计算机上运行相同文件的人都会失败 我使用的是VS9(2008)express,我想我可以完成安装部分,但我不确定如何完成“安全”部分。我不需要任何难以破解的安全性,只需要一个愚蠢的条件就可以阻止大多数用户将文件复制到另一台计算机上。(比如检查MAC地址) 有什么想法吗 编辑: 我想检查MAC地址,但我希望程序在安装过程中完成。这意味着在我安装之后,我不能将程序移动到另一台机器上。它也不一定是一个非

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

  • 制作安装程序
  • 这样,如果它安装在一台计算机上,任何试图在另一台计算机上运行相同文件的人都会失败
我使用的是VS9(2008)express,我想我可以完成安装部分,但我不确定如何完成“安全”部分。我不需要任何难以破解的安全性,只需要一个愚蠢的条件就可以阻止大多数用户将文件复制到另一台计算机上。(比如检查MAC地址)

有什么想法吗

编辑:
我想检查MAC地址,但我希望程序在安装过程中完成。这意味着在我安装之后,我不能将程序移动到另一台机器上。它也不一定是一个非常聪明或困难的条件,只是最低限度。我只是不知道如何在安装中做到这一点

编辑:

遗憾的是,我没有完整的VS,这样我就可以轻松完成。

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

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

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

补充:如果你不需要非常复杂,你可以选择一些独特的值,比如你建议的MAC地址,可能是硬盘序列号,主板序列号,将它们连接成一个字符串,并从中生成散列

这种方法允许运行无限数量的拷贝(但每次安装只能在安装它的一台机器上运行)。如果您坚持按硬件(或操作系统产品密钥)进行标识,那么应用程序可以在同一台机器上的各种操作系统安装上运行


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

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

第一个请求许可的人将被允许,其他人将被阻止

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

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

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

[编辑2]
如果您正在查找有关如何构建自定义安装程序的信息,请尝试检查MAC地址的想法


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

一旦您有了一个像样的指纹,剩下的就很容易了。就我个人而言,我会使用诸如MAC地址和windows产品ID(在HKLM\Software\Microsoft\windows\CurrentVersion\ProductId)之类的内容,并使用哈希算法来获取一些合理模糊的内容

编辑:

这里有一个问题向您展示了如何以字符串形式获取MAC地址:

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


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

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

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

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

这不是最安全的选择或任何事,但你确实说过它不一定是智能的

在安装时,可以将程序变量设置为机器名(如果愿意,也可以将其设置为哈希)

比如:

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();
}

简单回答,假设此处的唯一要求是,如果通过安装程序安装,则软件应运行,如果复制到另一台计算机,则不会运行:

将一个简单的键写入注册表。很可能是您的产品的版本号,如果他们将较新的版本复制到计算机上,则需要检查该版本号

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

对于包装安装,我喜欢使用简单的方法