如何在 VS.NET 创建的 MSI 安装程序中验证序列号或 PID






2.81/5 (12投票s)
2005 年 6 月 8 日
5分钟阅读

165149

3367
介绍如何创建自定义操作 DLL,并在使用 VS.NET 创建的基于对话框的安装程序中实现序列号或 PID 验证。
引言
MSDN 文章 Q253683 描述了如何使用 VSI 1.1 创建 MSI 安装程序时验证序列号。然而,VS.NET 中的 MSI 架构已有所改变,为非 C++ 经验丰富的开发者而言,其中创建自定义操作 DLL 的说明可能难以理解。
本文概述了如何将此过程应用于使用 VS.NET 创建的 MSI,并提供了编译自定义操作 DLL 的详细说明。
背景
产品注册策略多种多样。
在光谱的一端是典型的使用相对较小的互联网下载应用程序的“试用后购买”技术。最简单的技术是创建两个下载文件,一个用于试用,一个用于购买的产品。更复杂的方法通常涉及将注册代码嵌入应用程序本身,并依赖注册表条目来确定试用期何时结束或是否已获得许可证。
在光谱的另一端是像微软为其产品使用那样需要产品密钥 (PID) 的零售包装大众化媒体。
这两种情况都不需要典型开发者进行特殊的打包技能。第一种情况,注册是通过熟悉的技术实现的——只需将试用和注册代码编程到应用程序本身。后一种情况通常由一个专门负责部署管理的部门处理,代码开发者不参与此过程。
有时,开发者自己需要创建 CD 等媒体进行分发,而没有专门团队的支持。这给通常缺乏打包经验的应用程序开发者带来了问题。本文面向需要创建少量媒体并希望用户在安装过程中输入产品密钥的开发者。
一种对于少量部署媒体而言易于管理的简单技术是创建一个使用某种加密的产品密钥文件,并将其包含在分发媒体中。然后可以修改安装程序,使其包含一个自定义操作,该操作读取产品密钥文件并验证用户输入的产品密钥。
此技术在此处进行了概述。
许可理念
这不是关于许可策略的讨论,但有一个概念值得讨论。一些开发者花费了过多的时间和精力来确保他们的产品不会在没有有效许可证的情况下被使用。这是徒劳的。
简单的试用后购买策略用于鼓励大多数人直接购买相对便宜的产品,而不是非法使用。但是,任何熟悉注册表和编程技术的人都可以找出如何绕过试用期限制。这里的理念是,大多数人都不具备这种专业知识,而且,为了避免支付 39.95 美元购买间谍软件而付出多少努力呢?
另一方面,保护高价值产品(如微软营销的产品)确实有实际意义。但这是不可行的!显然,如果需要产品密钥,就必须将密钥随媒体一起提供,并且无法阻止人们简单地复制产品。那么为什么像微软这样的公司要投入大量资源来创建带有许可证密钥的大众化媒体呢?有几个原因。投资回报并非来自许可证密钥,而是来自序列号!可以合理地假设,虽然许多获得合法软件的人实际上从未注册过,但也有许多人会注册。这为微软提供了宝贵的市场营销信息,关于他们如何获取产品,因为每次产品注册时,微软都可以查看序列号,判断产品是作为 OEM 捆绑在新电脑中获得的,还是像 Microsoft Word 那样从供应商处购买的独立零售应用程序,或是像 Office 那样从供应商处购买的零售产品套件。所有这些信息都有助于他们定价、打包和分发产品!
此外,拥有标准化的许可证密钥和媒体生成流程,可以大大简化对盗版非法产品的起诉,但实际上,这远不如获取市场人口统计数据重要。
现实地说,要求用户使用本文所述技术拥有有效许可证密钥,对于防止盗版副本的制作作用很小。那么为什么还要这样做呢?在我看来,主要原因是,如果你为产品分发创建媒体,用户倾向于期望一个许可证密钥。包含这一点主要是为了为你的产品部署创建一个专业、高质量的演示。但你应该明白,在防止产品被未授权使用方面,大公司从未做到过,你也不会!抱歉,事实就是如此!
关于代码
下载内容包含一个 HTML 页面,其中介绍了如何在 VS.NET 创建的 MSI 部署中使用自定义操作 DLL 来实现产品密钥验证。示例 DLL 代码仅使用硬编码的 PID 密钥值,但概述了从设置中包含的文件中读取此密钥所需的基本步骤。
项目中还包含了使用 VS.NET C++ 创建自定义 DLL 的源代码,以及比原始 MSDN 文章更详细的说明,以防你不是经验丰富的 C++ 开发者。
还包括了一个已修改为执行 PID 验证的示例 MSI,以便你可以使用 Orca examination 典型修改包的 MSI。
要进行修改,你需要一个 C++ 编译器来创建 DLL。本文介绍了使用 VS.NET C++ 的具体细节。虽然创建项目和设置编译器选项略有不同,但源代码也可在 VC++ 6 中使用。
你还需要安装 Windows Installer SDK,它是免费下载的。
最后,VS.NET IDE 创建的对话框中,PID 被标记为“序列号”。你可能希望将其更改为“产品注册密钥”或“产品许可证密钥”等。我将留给读者作为练习。如果你按照所示的实现说明进行操作,应该很容易弄清楚如何修改对话框标签文本。