C# 如何在系统时间变化的情况下逃避试用?
您好,我们有一个30天试用期的申请。安装后,我将添加一个具有当前DateTime.Now值的注册表项 无论何时启动应用程序,我都会从注册表加载该值,并将其与当前日期时间进行比较。现在,请再次输入该值,显然,根据比较结果,我会显示相应的消息C# 如何在系统时间变化的情况下逃避试用?,c#,.net,datetime,registry,C#,.net,Datetime,Registry,您好,我们有一个30天试用期的申请。安装后,我将添加一个具有当前DateTime.Now值的注册表项 无论何时启动应用程序,我都会从注册表加载该值,并将其与当前日期时间进行比较。现在,请再次输入该值,显然,根据比较结果,我会显示相应的消息 RegistryKey regKeyAppRoot = Registry.CurrentUser.CreateSubKey(registryKeyPath); installDate = (DateTime)regKeyAppRoot.GetValue("I
RegistryKey regKeyAppRoot = Registry.CurrentUser.CreateSubKey(registryKeyPath);
installDate = (DateTime)regKeyAppRoot.GetValue("InstallDate");
if (installDate.AddDays(30) > DateTime.Now)
; //MessageBox.Show(...)
我的问题是,简单地将系统时间更改为过去,只会允许再次使用应用程序,因为不再满足条件。这是可以解释的,因为获取一个DateTime对象,该对象被设置为此计算机上的当前日期和时间,表示为本地时间
我如何才能避免这种情况,并获得安装应用程序后的确切天数?一种简单的方法是在每次启动和退出程序时保存日期和时间。下一个开始将当前日期和时间与保存的日期和时间进行比较。如果小于保存的值,则应用程序拒绝启动。
这当然不会完全消除这个问题,但会让用户更加困难,因为他需要知道需要将计算机设置为什么日期和时间。您可以保存上次检查的日期并比较当前日期。如果它们在不同的日期,则增加一个计数器。这样,用户最多可以使用30天 所以 我要补充的是,通常使用UtcNow会更好一些,而不是现在,这样你就不会受到白天变化的影响
另一种选择是使用Internet时钟:-有许多网站提供确切的时间。只有当您的程序正常连接到Internet时,此选项才有效。如果您节省时间,当您的应用程序结束时,您可以检查当前时间是否大于结束时间,知道如何编辑注册表的用户如何?@HenkHolterman:这将是注册表项的位置和名称。我在这里使用了干净的名称来显示示例,但请看一下Microsoft使用的密钥类型
RegistryKey regKeyAppRoot = Registry.CurrentUser.CreateSubKey(registryKeyPath);
installDate = (DateTime)regKeyAppRoot.GetValue("InstallDate");
if (installDate.AddDays(30) > DateTime.Now)
; //MessageBox.Show(...)
DateTime lastCheck = ... // Recover it from the registry
DateTime now = DateTime.Now.Date;
if (now != lastCheck.Date)
{
UsesCounter++;
}
lastCheck = now;