Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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#_.net_Security_Macos_Vmware - Fatal编程技术网

C# 是否有唯一的计算机标识符,即使在虚拟机中也可以可靠地使用?

C# 是否有唯一的计算机标识符,即使在虚拟机中也可以可靠地使用?,c#,.net,security,macos,vmware,C#,.net,Security,Macos,Vmware,我正在编写一个在终端服务器上运行的小客户端程序。我正在寻找一种方法来确保它只在指定的服务器上运行,如果从服务器上删除它,它将停止运行 我知道没有任何方法可以使它100%安全,但我想让大多数超级用户很难做到这一点 我正在查看不同的唯一标识符,如处理器ID、Windows产品ID、计算机GUID和其他UI。因为终端服务器是一个虚拟机,所以我找不到这台机器所独有的任何东西 关于我应该调查什么以使其更安全的任何想法。我没有时间或需要使它尽可能安全,因为它会破坏应用程序本身的目的 我不想使用MAC地址。即

我正在编写一个在终端服务器上运行的小客户端程序。我正在寻找一种方法来确保它只在指定的服务器上运行,如果从服务器上删除它,它将停止运行

我知道没有任何方法可以使它100%安全,但我想让大多数超级用户很难做到这一点

我正在查看不同的唯一标识符,如处理器ID、Windows产品ID、计算机GUID和其他UI。因为终端服务器是一个虚拟机,所以我找不到这台机器所独有的任何东西

关于我应该调查什么以使其更安全的任何想法。我没有时间或需要使它尽可能安全,因为它会破坏应用程序本身的目的

我不想使用MAC地址。即使它对每台机器都是唯一的,但它也可以通过遵循互联网上的指令进行欺骗

至于Microsoft产品ID,因为我们的系统团队克隆了VM服务器,并且我们使用公司卷密钥,所以我发现已经有两台我可以访问的服务器具有相同的产品ID号。我不知道还有多少其他人有相同的产品ID


或者,与其尝试识别机器,不如识别用户并创建通过AD处理的基于组的权限来访问此软件。

如果您想要95%的权限,我会选择-它可以被欺骗,但默认情况下对于机器是唯一的。

最简单的解决方案是使用mac地址,但请注意,它很容易在Windows上被更改。我想说,只有不到5%的人知道如何做到这一点

下面是如何在C#中获取mac地址:


您可以将许可证绑定到网卡的MAC地址(如果有多个网卡,则可以绑定多个网卡)

当然,更换网卡会使软件停止工作


如果/当成为服务器上的标准配置时,您应该能够使用它对服务器进行身份验证。

您可以获得PC的MAC地址,如下所示:


当然,这种方法并非没有缺陷。这篇文章中还列出了其他类似的方法,但不是完全相同的:

扩展了macaddress方法。您可以使用macaddress,并在其周围使用md5函数,同时使用仅为系统所有者所知的。这样,macaddress在不知道地址的情况下是无用的

只有我的一便士值……)

[编辑]-另请参见此处有关散列/盐析等的c#示例:


根据设计,很难唯一地识别虚拟机;任何允许您唯一标识它的东西都意味着它不是完全虚拟的(因为克隆虚拟机应该产生相同的机器)

  • 在主机上创建通过环回网络适配器与VM通信的心跳应用程序
  • 如果heartbeat应用程序无法唯一标识主机,则让它拒绝运行
  • 如果heartbeat应用程序未运行,则让主应用程序拒绝运行
  • 您需要找到一种方法来确保heartbeat应用程序不会太容易被欺骗


    不可能100%保护终端程序。这个问题相当于试图防止软件盗版。

    我发现最好的东西是BIOS UUID——但它远远不适合您的用例

    虚拟机中可用的SMBIOS UUID也被VMware虚拟机监控程序和管理工具用作VirtualMachine.config.UUID(请参阅:)。这意味着它保证在特定主机或特定vCenter上是唯一的。但是,它可以在单独的主机或单独的vCenter安装上复制

    此外,虚拟机上的BIOS UUID是可变的。它可以通过API进行更改(尽管不容易通过客户端进行更改)

    这可能接近您的95%,因为需要一些特殊的努力和设置来精确复制VM

    但是,从支持虚拟化的角度来看(包括VM灾难恢复和虚拟化软件的未来升级):使用UUID或MAC地址等硬件ID会导致各种问题。当他们想要在您的软件下升级操作系统版本时,通常是通过创建新的虚拟机,他们需要手动编辑两台服务器的VM配置,以更改UUID以匹配。使用MAC,如果他们改变了网络架构,您的软件要求VM是一个特例。这些事情只会让虚拟管理员头疼(但它们可能正是你想引起的头疼——只有你自己能确定)


    我建议使用您提到的基于权限的方法,如果需要,甚至可以使用并发授权服务器。但我来自一个高度虚拟化的背景,硬件绑定的许可证已经令人头痛。

    即使在虚拟机中,MAC地址也应该是唯一的如何每个人都有如此精确的数据,可以欺骗MAC地址的人数?显然是5%。。。我不知道。我不想做一个MAC地址,任何能用谷歌搜索的超级用户都可以欺骗它。我很有信心,只有不到1%的人能做到这一点。没有人能在Windows中做到这一点,这似乎就是问题的含义我指的是
    ifconfig
    的使用,您现在已将其从答案中删除。我知道MAC电脑在任何操作环境下都可能被欺骗。@Cody我最初假设是Linux(是的,我没有读标签,淘气的我!:P),但改变了它。这个问题并没有暗示任何关于mac地址的问题,甚至没有提到它。注意,我认为我链接到的StackOverflow帖子中的答案值得一些投票。公认的答案是非常好的,特别是关于这是一项持续的琐事的警告。我认为这很容易。
    System.Net.NetworkInformation.NetworkInterface.GetPhysicalAddress();