我将如何获得 WPF Windows 应用程序的许可[关闭]

2024-04-11

我开发了一个小型应用程序,我想尝试并销售它,但我不熟悉如何最好地做到这一点。

  1. 我将如何锁定该程序以供试用1。

  2. 我将如何处理接受付款?

考虑到我是一个没有很多钱的单人乐队,我希望有一种免费或低成本、有效、安全且易于实施和维护的解决方案。我在这方面没有太多经验,因为我通常是为公共部门开发的,他们购买整个解决方案,而我们从未获得过许可。

任何帮助将不胜感激。 谢谢,

B


我可以告诉你我是怎么做的。免责声明:您的里程可能会有所不同。这是为了防止简单的 WinForms 或 WPF 或其他桌面应用程序的随意盗版。它对于复杂的破解来说并不是特别强大或安全,但它在防止随意盗版方面做得很好。

  1. 对于许可,我尝试了几种第三方解决方案。对于名义情况,它们都相当容易使用防止随意盗版,这当然是您真正应该担心的唯一盗版问题。

  2. 我发现没有一个许可提供商与现有的支付处理器/网关真正兼容。有一些“一体化”解决方案,但技术债务水平对我(自由职业者和唯一开发人员)来说是不可接受的。我一直在寻找一种简单的方法,从网站上的“立即购买”链接到购买后解锁桌面软件。一些现有的“一体化”解决方案对于此目的来说有些过分,有些完全忽略了“购买”方面。

  3. 我最终使用了XML数字签名 http://msdn.microsoft.com/en-us/library/ms229745.aspx使用应用程序的私钥对许可证文件进行签名,该私钥永远不会分发给用户。结果:您在目标计算机上有一个 .LIC 或 .LICX 文件,用户可以读取该文件(它是纯文本,除了封装的签名)但不能修改。 (或者更确切地说,如果没有你,他们就无法修改它knowing他们已经修改了它。)这个小文件是整个系统的关键。

  4. 当应用程序加载时,它会验证 XML 签名是否有效(使用应用程序的公钥,该密钥is与应用程序一起分发),如果有效,它会从许可证文件中读取信息,并根据该信息启用/禁用某些功能。例如,您的许可证文件可能包含产品到期日期或一些独特的机器信息(始终小心,不要因此给您的合法用户带来不便......您不希望他们必须重新申请许可证每次更换硬盘时的密钥)。

  5. 作为一个额外的(稍微更具侵入性的)步骤,您可以让应用程序连接到您的服务器,尽管这会让您遇到服务器停机问题等等。一些开发人员愿意忍受这种情况,而另一些则不愿意。

  6. 现在对于购买部分来说,有很多很多的选择。 Paypal 无疑是​​最简单的。您可能喜欢也可能不喜欢他们的费率计划,但使用 Paypal 启动和运行绝对是轻而易举的事。

  7. 为此,您需要高级或商业帐户,而不是个人帐户。注意:在 Paypal 文档中,有时会说您需要一个 Paypal 企业帐户。每当他们这么说时,他们实际上的意思是“Paypal Business 或 Premier 帐户”。

  8. 现在为自己建立一个产品网站并自定义“立即购买”按钮等。当用户进行购买时,您的网站将收到来自贝宝IPN https://www.paypal.com/ipn,这是他们的通知服务。此 ping 只是对您网站上定义的 HTTP 端点的调用,它包含您需要的有关购买的所有信息。主要是用户的电子邮件...

  9. (好吧,我觉得我应该提一下:Paypal 以及大多数其他合法处理商都有一个“沙箱”,您可以在上线之前测试所有这些内容。这确实会给您带来关于实际上线的温暖模糊感,因为钱就在网上线。)

  10. 您将使用它在购买后自动向用户发送激活码,这样他们就不必等待 24 小时让您手动向他们发送激活码。将此激活代码(在这种情况下可以是任何唯一的、难以猜测的数字,例如 GUID,无论是否经过美化)存储在数据库中,并使用您将跟踪的使用计数来检测重复的代码。

  11. 用户通过您提供的屏幕将激活码输入软件。

  12. 该软件通过 https 与服务器联系(这是一次性的事情,仅在软件解锁时才会发生),并说:“嘿,用户刚刚给我的这个许可证代码有效吗?”

  13. 如果提供的激活码与销售时存储在数据库中的代码匹配,并且该激活码尚未得到确认,则成功!

  14. 然后,服务器需要构建许可证文件,这是一个极其简单的 XML 或文本文件,其中包含“允许该软件副本执行的操作”。对于它应该包含的内容没有标准,只有一些约定。

  15. 服务器使用应用程序的私钥签署许可证文件并将其作为数据流返回到您的应用程序......

  16. 它将其保存为 .LIC 或 .LICX(或您想要的任何扩展名)文件,然后按照步骤 3 检查加载时间。

这对我来说非常有效,而且实施起来很容易。整个事情的关键很简单:信任那些 XML DSig。当 LIC 文件丢失时,您默认为试用模式。修改签名后,您将切换到试用模式。只有当 LIC 文件存在、经过有效签名并包含正确信息时,您才能(在代码中)开放对“完整”功能的访问。

另外,在代码中插入多个许可证检查点。我在应用程序启动时执行一个操作,在空闲时执行另一个操作,在进入关键功能区域之前执行另一个操作。因此,如果有人确实逆转了代码(而且他们可以),那么他们至少需要进行一些搜索以清除所有许可证检查。当然,你无法阻止人们绕过这些检查。你只是想让事情变得更困难一点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我将如何获得 WPF Windows 应用程序的许可[关闭] 的相关文章

  • 没有端点在 net.pipe://localhost/ 上监听

    我有两个 WCF 服务托管在 Windows Server 2003 计算机上的单个 Windows 服务中 如果 Windows 服务需要访问任一 WCF 服务 例如发生定时事件时 它将使用公开的五个命名管道端点之一 不同的服务协定 该服
  • .NET 远程处理回调

    是否可以通过远程处理传输回调 我想做一些类似的事情myRemoteObject PerformStuff x gt Console WriteLine x 如果没有 我将如何实现等效的功能 Edit 我知道 Remoting 已被 WCF
  • 手动更新目标后,单向绑定停止工作

    我有这样的WPF绑定代码 TestModel source new TestModel TestModel target new TestModel Bind source target BindingMode OneWay source
  • 这个 SQL 查询有什么问题?

    在过去的一个小时里 我一直在尝试此查询的不同变体 但我在用户名处收到错误 并且用户名只是一个普通字符串 其中的用户名是我从不包含特殊字符或任何内容的 xml 文件中获取的 我正在使用 SLQ 紧凑型 3 5 P S 我尝试使用 而不是 us
  • Global.asax PostAuthenticateRequest 事件绑定是如何发生的?

    我怎样才能使用发布验证请求Global asax 事件 我正在跟进本教程 http www asp net security tutorials forms authentication configuration and advanced
  • 终结器线程的范围是什么 - 每个应用程序域或每个进程?

    根据我的所有阅读 应该有一个 GC 线程来调用所有终结器 现在的问题是这个 一个 线程的范围是什么 每个进程或每个应用程序域 因为域的整体目的是在一个进程空间中分离并创建 独立 的不同应用程序 I read here http dn cod
  • DateTime.Parse("2012-09-30T23:00:00.0000000Z") 始终转换为 DateTimeKind.Local

    我想解析一个表示 UTC 格式的日期时间的字符串 我的字符串表示形式包括 Zulu 时间规范 该规范应指示该字符串表示 UTC 时间 var myDate DateTime Parse 2012 09 30T23 00 00 0000000
  • LinqToSql 声明和实例化 DataContext 最佳实践?

    设置 DataContext 以便在扩展 LinqToSql 类中轻松访问方面的最佳实践是什么 例如 我的 dbml 中有一个 User 实体 我想向该类添加方法 如下所示 Partial Public Class User Public
  • 在 Azure 上运行 .NET 应用程序

    我拥有在 Amazon EC2 上运行应用程序的丰富经验 它需要一台低端服务器 我目前为该服务器支付大约 90 美元 月 是的 我知道我并不真正需要可扩展性 但我仍然使用 EC2 我想知道将这个纯粹的 NET 应用程序迁移到 Microso
  • 关闭主窗口时 WPF 应用程序不会关闭

    我习惯了在 Visual Studio 中进行 WinForms 编程 但我想尝试一下 WPF 我向我的项目添加了另一个窗口 名为 Window01 主窗口称为MainWindow 之前public MainWindow 构造函数我声明Wi
  • 策略模式还是命令模式?

    假设我有一个金融交易列表 我需要针对这些交易执行一系列验证规则 一个例子是我有一笔购买产品的交易 但是首先我需要验证交易中的帐户是否有足够的可用资金 产品没有售完等 由于这些规则 交易将是标记为拒绝 并应指定错误代码 当然 我正在考虑用一个
  • 在 Web 浏览器中禁用 F5 [重复]

    这个问题在这里已经有答案了 可能的重复 禁用浏览器的后退按钮 https stackoverflow com questions 961188 disable browsers back button 如何禁用浏览器上的 F5 刷新 htt
  • Nullable 是不可能的,为什么不呢? [复制]

    这个问题在这里已经有答案了 如果这是一个愚蠢的问题 请原谅 我正在尝试更好地理解 Net 中的 Nullable 类型 从我从 Microsoft 源代码 使用 ReSharper 中注意到的内容 我了解到 Nullable 是一个结构 而
  • 通过 SOAP 的 Gmt php 或 UTC C# 等效项

    is C DateTime UtcNow和 PHPdate c 是等价的 我怀疑 因为当我肥皂时 我得到了 C
  • 如何在 Windows CE 中使用 VB.Net 访问条码扫描仪

    最近我被要求开发一个应用程序摩托罗拉 MK4000 http www motorola com Business US EN Business Product and Services Micro Kiosks Micro Kiosks M
  • 从另一个 FORM 中取回隐藏的 FORM

    我有两种形式Form1 and Form2 我正在打开Form2 from Form1 on button Click Form2 obj2 new Form2 this Visible false obj2 Show 然后我想回来Form
  • PrivateObject 找不到属性

    我的结构基本上如下所示 abstract class A protected string Identificator get set private void DoSomething DoSomethingSpecific protect
  • 我需要安装什么才能获取 Microsoft.TeamFoundation.WorkItemTracking.Client.dll?

    我只需要安装VS2010 SDK http www microsoft com downloads en details aspx FamilyID 47305cf4 2bea 43c0 91cd 1b853602dcc5 是否有 TFS2
  • MSChart 控件中的自定义 X/Y 网格线

    我有一个带有简单 2D 折线图的 C Windows 窗体 我想向其中添加自定义 X 或 Y 轴标记 并绘制自定义网格线 例如 以突出显示的颜色 虚线 我查看了 customLabels 属性 但这似乎覆盖了我仍然想显示的默认网格 这是为了
  • WPF DataGrid - 在每行末尾添加按钮

    我想在数据网格的每一行的末尾添加一个按钮 我找到了以下 xaml 但它将按钮添加到开头 有人知道如何在所有数据绑定列之后添加它吗 这会将按钮添加到开头而不是末尾

随机推荐

  • Google App Engine 数据存储区索引上限

    有人可以用简单的英语解释一下数据存储中 5000 个索引的上限吗 这是否意味着存储对象的索引列表属性不能包含超过 5000 个元素 数据存储区限制单个实体可以拥有的索引条目数量 此限制设置为每个实体 5000 个元素 您可以使用以下命令轻松
  • Julia - 迭代字典中的键组合

    有没有一种巧妙的方法来迭代字典中的键组合 我的字典有这样的值 1 gt 1 2 2 3 gt 15 3 gt 6 7 8 4 9 11 gt 3 我需要做的是获取所有长度的键组合1 n where n可能是FX 3 就像上面的例子一样 我想
  • java.sql.SQLFeatureNotSupportedException:方法 org.postgresql.jdbc4.Jdbc4Connection.isValid(int) 尚未实现。在Spring引导中

    我正在开发Spring Boot Microservices例子 在这个例子中 我使用了config server and licensing service并成功部署于docker 当我调用 REST 端点时 http localhost
  • java.lang.RuntimeException:在 android.media.MediaRecorder.start(本机方法)处启动失败

    我正在处理电话录音 当我开始录制电话时 不幸的是它停止了 它给出错误 MediaRecorder 启动失败 2147483648 我请告诉我我的代码有什么问题 这是我的代码 public class incomingcall extends
  • 将 PDF 文档打印到 esc/pos 热敏打印机

    我们正在使用 xamarin forms 开发 POS APP 因为我们需要将收据打印到通过 LAN 连接的 esc pos 热敏打印机 我们的应用程序支持多语言 通过更改代码页使用 esc pos 命令打印多种语言效果非常好 但它仅适用于
  • 使用 JAX-RS 获取服务器的基本 url

    如何使用 JAX RS 获取服务器的基本 url 基本上 当程序位于本地主机上时 我想要 http localhost 8080 当程序位于实时服务器上时 我想要 http www theSite com 我正在使用泽西岛框架 是的 您可以
  • Firestore 每日配额

    我使用开发了一个示例应用程序Angular and 火库 我大约两个月前部署了我的应用程序 从那时起一直运行良好 然而 在上周 我注意到该应用程序在使用几个小时后因 客户端离线 错误而被阻止 我发现使用2个小时后我超出了每日的阅读操作限额
  • 在负载平衡的 Tornado 站点上使用 apache 基准测试获取失败的请求,但没有记录

    也许这是一个关于 ab 的问题 而不是关于 Tornado 的问题 但有些事情没有意义 我这样运行基准测试 ab n 100 http localdomainname 2 tornados being 1 nginx Concurrency
  • python 2 doctest 为何会失败,但失败消息中的值却没有差异?

    我在 Windows 中使用 Python 2 7 9 我有一个 UTF 8 编码的 python 脚本文件 其中包含以下内容 coding utf 8 def test func u gt gt gt test func u return
  • 以 RTL 格式格式化时 TextView 内的数字会反转

    里面的数字TextView以 RTL 格式格式化时会发生反转 当数字位于文本内的末尾时TextView他们逆转了 我怎样才能以编程方式解决这个问题 例如 下面的数字是相反的 它们应该显示为 误解 像 ARABIC 这样的 RTL 语言中的数
  • 如何解决对等依赖安装问题

    我正在尝试使用 npm 安装react contenteditable 但是 eslint 的对等依赖项不允许我安装以下错误的 risal 我正在使用 Ubuntu 18 04 LTS 操作系统 这是我用来安装react contented
  • 根据控制器指定不同的_Layout.cshtml

    我创建了一个 asp mvc3 项目 我想要根据选择的控制器有不同的 Layout cshtml 这是因为控制器 1 有 2 个按钮 控制器 2 有 3 个按钮 控制器 3 有 4 个按钮 每个控制器适用于特定类型的用户 因此取决于登录 我
  • Laravel 中的 Socket.io 轮询 404

    我正在尝试使用 Socket io 实现一个聊天应用程序 进入我的 Laravel 应用程序 聊天应用程序本身运行良好 但我在 Laravel 中遇到问题 我尝试在端口 8000 上提供 Laravel 服务 并在 8000 上提供聊天服务
  • 访问回调 user_is_anonymous 的反义词是什么?

    我知道在 drupal 模块中使用它来指定只有匿名用户才能看到该模块 仅指定登录用户的回调是什么 我有一个页面 我只想让登录用户访问 谢谢 它是用户 is logged in http api drupal org api function
  • 在 AVD 上运行自定义 ROM

    有谁知道是否可以在 AVD 上运行自定义 ROM 我该怎么做 谢谢 如果您自己构建自定义 rom 则在构建自定义 rom 后 您可以使用以下命令启动它emulator 但要做到这一点 你首先需要为模拟器构建 ROM 通常 full gene
  • 数据库结果的数组结构

    这可能是一个非常微不足道的问题 但是以下哪种方法是构造返回数据库结果的数组的最佳实践 比如说博客文章列表 对文章进行排序和分组 或者对元素进行排序和分组 Array title gt Array 0 gt Untitled 1 gt Unt
  • current_prolog_flag double_quotes DCG(代码或字符)?

    在使用 SWI Prolog DCG 时 我注意到有些人注意到 set prolog flag double quotes codes Jan http www swi prolog org pldoc man section string
  • 为什么正则表达式 ((x,y)|(x,z)) 是不确定的?

    为什么正则表达式 x y x z 像 Core Java 一书中所说的那样是不确定的 作者给出了他的观点 当解析器看到 x 时 它不知道采取两个替代方案中的哪一个 这个表达式可以以确定性形式重写为 x y z 谁能给我一个解释吗 为了具有确
  • Android 活动上下文为空

    所以我这里有这些代码 它运行时不会崩溃 但是 当我将 this 传递到网格适配器时 mContext 为空 我尝试传递 getApplicationContext 但仍然无法使 getImage 方法正常运行 因为 getResources
  • 我将如何获得 WPF Windows 应用程序的许可[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我开发了一个小型应用程序 我想尝试并销售它 但我不熟悉如何最好地做到这一点 我将如何锁定该程序以供试用1 我将如何处理接受付款 考虑到