また、アプリが実行されていないかどうかを確認したいのですが、これをチェックするデーモン プロセスを作成できますか (このプロセスが常に実行されていると仮定します)。
状況は次のようなものです。ユーザーは sys 日付を 2012 年 1 月 1 日から 2013 年 1 月 1 日に変更しますが、アプリケーションは引き続き 2012 年 1 月 1 日を使用する必要があります。
Windows オペレーティング システムを使用しています。
また、アプリが実行されていないかどうかを確認したいのですが、これをチェックするデーモン プロセスを作成できますか (このプロセスが常に実行されていると仮定します)。
状況は次のようなものです。ユーザーは sys 日付を 2012 年 1 月 1 日から 2013 年 1 月 1 日に変更しますが、アプリケーションは引き続き 2012 年 1 月 1 日を使用する必要があります。
Windows オペレーティング システムを使用しています。
ユーザーがさまざまな方法で日付を改ざんする可能性があるため、システム時間や外部ソース (Web サービスまたは NTP) に依存せずに時間を追跡する信頼できる方法はありません。
バックグラウンド サービスで時刻を追跡するオプションを想定しても、再起動中 (BIOS などから) の時刻の変更を防ぐことはできません。したがって、内部時刻を保持する目的は何ですか? コピープロテクション(試用期限など)の関係でしょうか?
もしそうなら、CryptoLicensingのような、日付の改ざんを検出するアルゴリズムを持っていると主張し、役に立つライブラリを調べることができます。
ただし、自分で時間を追跡しようとするのではなく、日付/時刻のテンパリングを検出しようとする方法が必要だと思います...
あなたが求めていることを達成する方法はありませんし、少なくとも私が知っていることもありません。
これはソフトウェアの試用ライセンスの問題だと思います。そうであれば、次のようないくつかの回避策があります。
リモートソースからの実際の日時を確認することが提案されたため、安全なWebサービスです。
試用版を時間ではなく、実行回数または保存回数で制限します。その値を、暗号化されたファイル内のレジストリまたはユーザー一時フォルダーのどこかに保存します。
お役に立てれば。
以下の内部日時クラスのように、静的クラスを使用して内部的に時間を追跡できます。プログラムの開始時に、次のように初期化します。
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);
}
}
}