Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.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_Datetime_Registry - Fatal编程技术网

C# 如何在系统时间变化的情况下逃避试用?

C# 如何在系统时间变化的情况下逃避试用?,c#,.net,datetime,registry,C#,.net,Datetime,Registry,您好,我们有一个30天试用期的申请。安装后,我将添加一个具有当前DateTime.Now值的注册表项 无论何时启动应用程序,我都会从注册表加载该值,并将其与当前日期时间进行比较。现在,请再次输入该值,显然,根据比较结果,我会显示相应的消息 RegistryKey regKeyAppRoot = Registry.CurrentUser.CreateSubKey(registryKeyPath); installDate = (DateTime)regKeyAppRoot.GetValue("I

您好,我们有一个30天试用期的申请。安装后,我将添加一个具有当前DateTime.Now值的注册表项

无论何时启动应用程序,我都会从注册表加载该值,并将其与当前日期时间进行比较。现在,请再次输入该值,显然,根据比较结果,我会显示相应的消息

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;