1

另外我想问一下我的应用程序是否没有运行,那么我可以创建一个守护进程来检查这个(假设这个进程一直在运行)。

情况是这样的:用户将系统日期从 2012 年 1 月 1 日更改为 2013 年 1 月 1 日,但应用程序仍应使用 2012 年 1 月 1 日。

我使用的是 Windows 操作系统。

4

3 回答 3

2

没有可靠的方法来跟踪时间而不依赖于系统时间或外部源(Web 服务或 NTP),因为用户可能以几种不同的方式篡改日期。

您假设使用后台服务跟踪时间的选项无法阻止重新启动期间的时间更改(例如从 BIOS),那么保持内部时间的目的是什么?它与复制保护系统有关(如试用时间限制)?

如果是这样,您可以查看CryptoLicensing 之类的库,该库声称具有检测日期篡改算法,并且可能对您有用。

但是我认为应该尝试检测日期/时间回火而不是尝试自己跟踪时间...

于 2012-04-06T19:06:30.280 回答
1

没有办法实现你的要求,至少我知道。

我只是假设这是一个软件试用许可问题,如果是这样,有几个解决方法,比如

  • 正如建议的那样,从远程源检查实时日期时间,一些安全的网络服务。

  • 不是按时间限制试用版,而是按执行次数或保存次数限制。将该值存储在加密文件中的注册表或用户临时文件夹中的某个位置。

希望这可以帮助。

于 2012-04-06T19:06:10.017 回答
0

您可以使用静态类在内部跟踪时间,例如下面的内部日期时间类。在程序开始时,使用以下命令对其进行初始化:

DateTime now = InternalDateTime.Now;

您现在可以更改系统时间并拥有两个时间,也可以用于测量本地时钟漂移,如果您与时间服务器同步,那是您的事。

MessageBox.Show(
    DateTime.Now.ToString()+Environment.NewLine+
    InternalDateTime.Now.ToString());

并以相同的方式访问它,而不是使用 DateTime.Now,使用 InternalDateTime.Now 即使发生系统时间更改,它也会保留时间。

public class InternalDateTime
{
    private static volatile InternalDateTime _instance;
    private static object syncRoot = new Object();
    //threadsafe singleton
    public static InternalDateTime Instance
    {
        get
        {
            if (_instance == null)
            {
                lock (syncRoot)
                {
                    if (_instance == null)
                        _instance = new InternalDateTime();
                }
            }

            return _instance;
        }
    }

    private Stopwatch sw;
    private DateTime dtAppStart;

    private InternalDateTime()
    {
        dtAppStart = DateTime.Now;
        sw = new Stopwatch();
        sw.Start();
    }
    public static DateTime Now { get { return InternalDateTime.Instance.DateTimeNow; } }

    public DateTime DateTimeNow
    {
        get
        {
             return new DateTime(dtAppStart.Ticks).AddMilliseconds(sw.ElapsedMilliseconds);

        }
    }
}
于 2013-11-28T02:22:43.250 回答