1

また、アプリが実行されていないかどうかを確認したいのですが、これをチェックするデーモン プロセスを作成できますか (このプロセスが常に実行されていると仮定します)。

状況は次のようなものです。ユーザーは sys 日付を 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

あなたが求めていることを達成する方法はありませんし、少なくとも私が知っていることもありません。

これはソフトウェアの試用ライセンスの問題だと思います。そうであれば、次のようないくつかの回避策があります。

  • リモートソースからの実際の日時を確認することが提案されたため、安全なWebサービスです。

  • 試用版を時間ではなく、実行回数または保存回数で制限します。その値を、暗号化されたファイル内のレジストリまたはユーザー一時フォルダーのどこかに保存します。

お役に立てれば。

于 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 に答える