質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

4回答

5930閲覧

C#条件付きで現在時刻を取得したい

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2019/07/30 19:26

編集2019/07/30 19:28

C#で現在時刻を取得する方法のひとつとして、

C#

1DateTime dateTime = DateTime.Now;

という方法が挙げられますが、
これだとPCの日付は変更できますので、正確な時刻とは言えません。

そこで、同様にして、正確な時刻を取得する方法を知りたいです。
※要するに、時刻を偽装されたくない。

宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Q71

2019/07/30 23:28

本当の目的は何ですか。10数年前によくあったのは「お試し版の期間をきっているが、コンピュータの日付を戻されたくない」でした。NTPという回答もありますが、最近のPCはNTPで時刻調整するようになっているし、そもそも時刻の変更には管理者権限が必要です。NTPも、自前で立てていたり、Windowsならhostsファイルを汚されると役に立ちません。
Zuishin

2019/07/31 00:17

今の時刻を知りたいだけなら管理者権限も必要ないし、IP アドレスで指定すれば hosts も無関係になります。
Q71

2019/07/31 01:10

単に今の時刻を知りたい、ではなく、<b>コンピュータが持っている時刻を変えられていても</b>、正しい今の時刻が知りたい、という質問だと認識しています。 時刻を知るのに管理者権限いるとは言っていません。時刻を変えるのには管理者権限がいる。だからそうそう変える物ではないのでは?と言っています。 「IPアドレスで指定すれば」は、確かにその通りです。
退会済みユーザー

退会済みユーザー

2019/07/31 02:03

「お試し版の期間をきっているが、コンピュータの日付を戻されたくない」です。
Zuishin

2019/07/31 04:01 編集

戻されないようにするのは不可能ですね。<b>コンピューターの時刻に関係なく、また管理者権限も必要なく、正しい時刻を知る方法がある</b>ので、それで判断したらという話です。
guest

回答4

0

インターネットにアクセスできるなら、公開されているNTPサービスに時刻を問い合わせるのが一番簡単かと思います。
インターネットにアクセスできないまたは遅延を許容できない場合は、イントラネット内にタイムサーバーを導入するか。

クラサバ構成でRMSDBがあるなら、SQL等で現在時刻を取得するのもよくやりますね。

NTPサービスへ現在時刻を問い合わせるには以下のようにすればいいです。
※ソースはこちらから必要な部分のみ抜き出して改変しました。
NTPサービスは他に変更した方がいいかもしれません。

C#

1// NTPサーバへの接続用UDP生成 2var ip = new System.Net.IPEndPoint(System.Net.IPAddress.Any, 0); 3var udp = new System.Net.Sockets.UdpClient(ip); 4 5// NTPサーバへのリクエスト送信 6var sendData = new Byte[48]; 7sendData[0] = 0xB; 8udp.Send(sendData, 48, "time.windows.com", 123); 9 10// NTPサーバから日時データ受信 11var receiveData = udp.Receive(ref ip); 12 13// 1900年1月1日からの経過秒数計算 14var totalSeconds = (long)( 15 receiveData[40] * Math.Pow(2, (8 * 3)) + 16 receiveData[41] * Math.Pow(2, (8 * 2)) + 17 receiveData[42] * Math.Pow(2, (8 * 1)) + 18 receiveData[43]); 19 20var utcTime = new DateTime(1900, 1, 1).AddSeconds(totalSeconds); 21 22// 協定世界時 (UTC) からローカルタイムゾーンへの変更 23var localTime = TimeZoneInfo.ConvertTimeFromUtc(utcTime, TimeZoneInfo.Local);

投稿2019/07/30 22:08

編集2019/07/30 23:32
draq

総合スコア2577

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

通信先は偽装が容易ですしNTPサーバーの応答も偽装が容易です。
自分が管理するサーバーから暗号化なり署名なりされた時刻情報を送るくらいしか思いつきませんね。

投稿2019/07/31 00:17

ikadzuchi

総合スコア3047

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

「お試し版の期間をきっているが、コンピュータの日付を戻されたくない」です。

1つは、ウェブサーバーを立て、ウェブサーバーで管理する方法。ユーザーがアクセスしようのない場所で管理すれば、全く問題ありません。

2つめは、アプリの終了時刻を記録し、その時刻より戻っているかどうかで確認する方法。

3つめは、アプリの起動時間を積算したり、起動回数を積算していく方法。

4つめ。アプリケーションの他にサービスも作る。このサービスで、著しく異なる時刻に変更されたことを検出する。

未確認事項:イベントログに時刻変更のイベントが記録されるのでは?それを調べて時刻が変更されたかどうかを調べることも可能かも。

もちろん、1についてはサーバーやプロトコルのクラッキング対策が必要ですし、2~3については、保存するデータを読み取られないようにする対策が必要です。
読み解こうとする者にどれだけのコストをかけさせるか、ということです。
IP アドレスを指定して NTP サーバーに接続するにしても、ローカルなネットワークを組まれれば防げないのですから。
相手にもコストがかかりますが、こちらもコストがかかります。そのコストに見合うサービスなのか、という問いかけも重要かと思います。

投稿2019/07/31 02:54

Q71

総合スコア995

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

投稿2019/07/30 22:05

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問