コンピュータの時刻が変更された事を検出するには

解決


221  2010-04-08 22:45:53  No: 38241  IP: 192.*.*.*

Windows XP + ターボデルファイ
指定された期日までにクリックしないと実行されないファイルを作ろうとしています。
この時、ユーザがコンピュータの時計を細工したことを検出する方法を考えているのですが、いい考えが思いつきません。
ユーザプロファイルのファイルデートと比較する方法などを考えましたが、再起動されたらダメだな、ということで、何かいい方法はないでしょうか。
ちなみに、スタンドアロンマシンです。

編集 削除
・・・・・  2010-04-08 23:20:54  No: 38242  IP: 192.*.*.*

>ユーザがコンピュータの時計を細工したことを検出する方法を考えているのですが

システム時刻が変更された時は WM_TIMECHANGEメッセージが BROADCASTされるので、それをひろえばOK。
procedure TForm1.WndProc(var Msg: TMessage);
begin
  inherited;
  case Msg.Msg of
    WM_TIMECHANGE: ShowMessage('システム時刻が変更されたよ');
  end;
end;

でも、このプログラムが動いてなければ検知出来ないし、そもそもシステム時刻が狂ってたらなんにもならない。
なので、正確な時刻をネットから取得した方がいいと思う。

編集 削除
にゃん  2010-04-09 10:47:32  No: 38243  IP: 192.*.*.*

まずスタンドアロンで正しい時刻を知る術がないでしょうが

編集 削除
221  2010-04-10 00:30:40  No: 38244  IP: 192.*.*.*

皆さん、ありがとうございます。

>>にゃん  さん
正しい時刻じゃなくてもいいんです。
例示したように、ntuser.datの更新日よりもパソコンの日付の方が新しい、つまり不自然なので、時計を細工した可能性がある、みたいな理屈で、時間の変更を検出できればいいのです。

と色々考えましたが、どうやらスタンドアロンマシンでは不可能なようですね。

編集 削除
にゃん  2010-04-10 08:58:04  No: 38245  IP: 192.*.*.*

>時間の変更を検出できればいいのです。
手段と目的が入れ違ってるよ
やりたいことは「時間が変更されたことを知ること」じゃなくて、
「実行された時間が指定時刻より前かどうかを知ること」でしょ?

編集 削除
221  2010-04-10 19:09:03  No: 38246  IP: 192.*.*.*

>>やりたいことは「時間が変更されたことを知ること」じゃなくて
>>「実行された時間が指定時刻より前かどうかを知ること」でしょ?

そうなんですが、ユーザが不正に時計を細工する場合、1分とか10分とかの単位では細工しないだろうと。
通常は1日とか1年とかで細工をするだろうと。
対象は職場で日常的に使われているパソコンの利用者なので、大まかに正確な時刻に保たれているはず、という前提で、明らかに不自然な時刻であることを検出できればいいのです。

編集 削除
TS  2010-04-10 21:17:36  No: 38247  IP: 192.*.*.*

使用目的が理解できてないかもしれませんが、
レポートの提出が指定期日を遅れるとボタンが押せなくなる
という場合だと、C:\Windowsの全ファイルの中で一番新しい日時
より現在のパソコンの日時が古ければ時間が変更されていると
判断すると言う事ではどうでしょうか。

編集 削除
221  2010-04-15 22:38:19  No: 38248  IP: 192.*.*.*

みなさんありがとうございます。TSさんの方法で何とかなりそうです。
助かりました。

編集 削除