Sql server 通过T-SQL唯一标识SQL Server计算机

Sql server 通过T-SQL唯一标识SQL Server计算机,sql-server,tsql,uniqueidentifier,Sql Server,Tsql,Uniqueidentifier,我们正在为客户机-服务器应用程序开发许可证系统,其中唯一的服务器组件是数据库(没有应用程序服务器)。我们希望向无法安装在任何其他服务器上或通过备份/恢复传输的特定服务器颁发许可证。其思想是通过T-SQL查询生成一个unqiue标识符,然后使用公共/私有签名返回一个仅对该标识符有效的激活令牌 是否有一种方法可以仅使用T-SQL(不使用CLR存储的过程或函数)以可重复的方式唯一标识SQL Server?例如,安装实例时是否会创建一些可检索的唯一值 Edit:也许NEWSEQUENTIALID()的M

我们正在为客户机-服务器应用程序开发许可证系统,其中唯一的服务器组件是数据库(没有应用程序服务器)。我们希望向无法安装在任何其他服务器上或通过备份/恢复传输的特定服务器颁发许可证。其思想是通过T-SQL查询生成一个unqiue标识符,然后使用公共/私有签名返回一个仅对该标识符有效的激活令牌

是否有一种方法可以仅使用T-SQL(不使用CLR存储的过程或函数)以可重复的方式唯一标识SQL Server?例如,安装实例时是否会创建一些可检索的唯一值


Edit:也许
NEWSEQUENTIALID()
的MAC部分可以工作(请参阅)。如果系统在群集/故障切换设置中发生故障切换,或者主LAN适配器发生更改,则可能会进入“宽限期”,在此期间,系统将继续运行,直到在新硬件上重新激活。问题是这是否“足够独特。”

即使您获得了唯一的ID,潜在的问题是T-SQL的验证。数据库未经验证。如果他们破解T-SQL并删除激活部分呢。客户是直接使用T-SQL还是您有客户端应用程序。如果您有一个客户端应用程序,那么为什么CLR不是一个选项。它是可破解的,但我使用的应用程序在安装时生成了服务器名称的散列,并将其存储在数据库中。然后,客户端会将存储的哈希与动态哈希进行比较,以确定它是否位于另一台服务器上。问题是,如果服务器名称相同,那么它可能会被击败,而散列算法位于客户端应用程序上,因此需要付出努力才能将其公开

我希望我能感谢你回答我的问题


如果您查看sysObjects和其他系统表/视图,我认为您可以找到唯一标识服务器和数据库的内容。与恢复到另一台服务器一样,您必须删除该用户并重新创建该用户,即使名称相同,但内部id不同。如果他们恢复了主数据库和应用程序数据库,他们可能会使所有内容都相同,但他们必须知道如何做到这一点。基本上,安装SQL可能会在某个地方生成一个唯一的id,因为Microsoft需要一个唯一的id用于复制、其他功能和许可

不要忘记集群/故障切换;机器和数据库之间不一定有1:1的比例——事实上,这是一个很好的观点。最好在群集或故障转移设置的所有实例上返回相同的ID。我认为任何答案都需要
xp\u cmdshell
,因为唯一的硬件信息不会直接暴露给SQL Server。我不确定这是不是答案?@JNK Yes这是答案。一个选项是在安装时将服务器名称连同服务器名称的哈希一起写入数据库的表中。然后,客户端可以独立创建散列并将其与数据库上的散列进行比较。我指出这个解决方案有缺陷,但它仍然是一个答案。否决票的标准是“每当你遇到一篇极其草率、毫不费劲的帖子,或者一个答案显然是错误的,甚至可能是危险的,那么就否决吧!”我的答案如何证明否决票的合理性?这怎么会是“危险的错误”?有几件事。1-反对票是指“没有用”的答案。我认为这是符合条件的。更改服务器名称以匹配原始安装并绕过哈希非常容易。2-我以前没有投反对票,但现在我投了。干杯@JNK其中的标准定义为“无用”。贴出的标准是“我什么时候应该投反对票?无论什么时候,如果一个答案显然是错误的,可能是危险的,请投反对票!”这是一个答案,我指出了它的局限性。但关键是在安装时,可以使用公共/私有签名使用更复杂的哈希。TSQL可能没有关于机器的直接信息,但安装程序有-如果安装是通过程序进行的。也许他们可以为此使用安装程序。