none
アプリケーションをインストールした日からの経過時間を調べたい RRS feed

  • 質問

  • こんばんは。

    アプリケーションをインストールした日からの経過時間を調べたいのですが、

    ユーザーに時刻の設定を変更されても正確にインストールした日からの経過時間を計るにはどうすればよいでしょうか?

    以上よろしくお願いします。

    2011年6月22日 12:09

回答

  • Windows側にインストールした日が記録されていたとして、それもtanmoさんが危惧しているのと同じように改変されていたら、やはり同じことになります。

    PCの時刻が信用できないのであれば、

    • 外部にサーバーを用意し、
    • アプリケーションはインストール時に用意したサーバーにインストールされたことを通知
    • 用意したサーバーはアプリケーションのインストールされた日を記録

    これ以外に手段はありません。(要はアクティベーションシステム)

    サーバーの維持コストとアプリケーションの価格と比較・検討するといいでしょう。

    • 回答としてマーク tanmo 2011年6月22日 14:22
    2011年6月22日 13:24
  • 要は改ざんされていない日時が欲しいということであれば、アプリケーション開始時に別スレッドでタイムサーバーに問い合わせて、Windowsの日時と大きく異なっていないかチェックする方式でも良いかもしれませんね。インストールされた時の日時は暗号化してレジストリなどに保持しておけば良いと思います。

    もしくは、インストール日時およびアプリケーション起動時の日時を暗号化してレジストリなどに記録しておき、次回起動時にシステム時刻と前回起動した日時を比較し、システム時刻が前回起動時刻より過去であればPCの時計を巻き戻したと考えられ、使用を中止するということも考えられます。この方法だと使用開始から何年過ぎてもシステム時刻の巻き戻しを前回起動時より少し進めれば起動できてしまいますが・・・
    さらに、起動中にも別スレッドでシステム時刻を定期的に保存するようにすれば、アプリケーション起動後にシステム時刻を元に戻すことも防げます。Windowsではいろいろなソフトやサービスが動いていますので、定期的にシステム時刻を戻すのは他のアプリケーションに問題が発生する可能性があり、普通は行わないでしょう。
    また、アプリケーション稼働時間を別スレッドで定期的に取得し、その累積でも期限の判断をするようにすればより正確でしょう。

    いずれにしても不正使用を100%防ぐ方法は難しいと思われますので、100%防ぐのではなく、どれぐらい防げるかとのバランスを考えながら、検討されると良いと思います。
    期限が切れた後の再使用があり得るのであれば、それも忘れずに考えておく必要があるでしょう。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク tanmo 2011年6月23日 12:36
    2011年6月23日 2:21
    モデレータ

すべての返信

  • 「インストールした日」とはいつのことを指すのでしょうか? バージョンアップの際にその日は更新されるべきかどうかなど、tanmoさんの思惑次第でなんとでも変化してしまう値だと思います。

    ですので、tanmoさんの意図する「インストールした日」にその日付を記録しておくことをお勧めします。

    2011年6月22日 12:36
  • 返信ありがとうございます。

    >バージョンアップの際にその日は更新されるべきかどうかなど

    バージョンアップは関係なく純粋に導入した日から1年間だけ起動する、または2年間起動するなど、

    導入ユーザー毎に期間を設けることを考えてます。

    >ですので、tanmoさんの意図する「インストールした日」にその日付を記録しておくことをお勧めします。

    単純にファイル、レジストリにインストール日付を記録してユーザーが変更したり、

    PCの時刻を巻き戻されることを避けたいのですが、

    何か良いアイデアはありませんか?

    2011年6月22日 13:03
  •  「正確」というところを、もっと詳細に定義してください。
     たとえば、6月10日17時30分にインストールしました。ところが、コンピュータの日付の設定が間違っていることがわかりました。正確には、6月11日1時30分でした。さて、「正確なインストール日時」とは、どっちですか?

     たとえば、インストールしたときに日時を記録します。そして、最近に日時をチェックした日時も記録します。この、「最近にチェックした日時」が、「現在の日時」よりも後であれば、時間が戻されたと判断できますよね。

     あるいは、「アプリケーションが起動している時間」でチェックすることも出来るかもしれません。


    Jitta@わんくま同盟
    2011年6月22日 13:14
  • Windows側にインストールした日が記録されていたとして、それもtanmoさんが危惧しているのと同じように改変されていたら、やはり同じことになります。

    PCの時刻が信用できないのであれば、

    • 外部にサーバーを用意し、
    • アプリケーションはインストール時に用意したサーバーにインストールされたことを通知
    • 用意したサーバーはアプリケーションのインストールされた日を記録

    これ以外に手段はありません。(要はアクティベーションシステム)

    サーバーの維持コストとアプリケーションの価格と比較・検討するといいでしょう。

    • 回答としてマーク tanmo 2011年6月22日 14:22
    2011年6月22日 13:24
  • ありがとうございます。

    >これ以外に手段はありません。(要はアクティベーションシステム)

    >サーバーの維持コストとアプリケーションの価格と比較・検討するといいでしょう。

    ここまで力強く言われたので、別の方法を検討してみます。

    ありがとうございました。

    • 回答としてマーク tanmo 2011年6月22日 14:22
    • 回答としてマークされていない tanmo 2011年6月22日 14:22
    2011年6月22日 14:20
  • 要は改ざんされていない日時が欲しいということであれば、アプリケーション開始時に別スレッドでタイムサーバーに問い合わせて、Windowsの日時と大きく異なっていないかチェックする方式でも良いかもしれませんね。インストールされた時の日時は暗号化してレジストリなどに保持しておけば良いと思います。

    もしくは、インストール日時およびアプリケーション起動時の日時を暗号化してレジストリなどに記録しておき、次回起動時にシステム時刻と前回起動した日時を比較し、システム時刻が前回起動時刻より過去であればPCの時計を巻き戻したと考えられ、使用を中止するということも考えられます。この方法だと使用開始から何年過ぎてもシステム時刻の巻き戻しを前回起動時より少し進めれば起動できてしまいますが・・・
    さらに、起動中にも別スレッドでシステム時刻を定期的に保存するようにすれば、アプリケーション起動後にシステム時刻を元に戻すことも防げます。Windowsではいろいろなソフトやサービスが動いていますので、定期的にシステム時刻を戻すのは他のアプリケーションに問題が発生する可能性があり、普通は行わないでしょう。
    また、アプリケーション稼働時間を別スレッドで定期的に取得し、その累積でも期限の判断をするようにすればより正確でしょう。

    いずれにしても不正使用を100%防ぐ方法は難しいと思われますので、100%防ぐのではなく、どれぐらい防げるかとのバランスを考えながら、検討されると良いと思います。
    期限が切れた後の再使用があり得るのであれば、それも忘れずに考えておく必要があるでしょう。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク tanmo 2011年6月23日 12:36
    2011年6月23日 2:21
    モデレータ
  • >アプリケーション開始時に別スレッドでタイムサーバーに問い合わせて

    hosts 書き換えたりとかで簡単に偽装できてしまうので、あまり強力ではないような。

     

    2011年6月23日 12:10
  • >hosts 書き換えたりとかで簡単に偽装できてしまうので、あまり強力ではないような。

    あっ、そうですね。全く気付いていませんでした。ご指摘ありがとうございます。m(_ _)m
    グローバルIPで直接タイムサーバーを見に行くようにしたとしても、ゲートウエイを設定してあらぬ方向にパケットを向けさせれば、そこでグローバルIPでも騙せてしまうような気がします・・・。(ただ、ちょっと大がかりになりそうですが・・・。ところでグローバルID同士を変換する変装的なNATみたいなことができるルーターってあるのかな?あったらあったで怖い気がしますが・・・)

    さて、タイムサーバーとは標準のプロトコルで通信している以上、偽タイムサーバーを設けることができれば、簡単に偽りの日時を返せてしまいますね。つまり、偽タイムサーバーを設けさせることを防げなければチェックが崩壊してしまうことになります。ところが偽タイムサーバーを防ぐことは難しい・・・。であれば、タイムサーバーのプロトコルを独自なものに替えるしかないということになります。
    これであれば例え偽タイムサーバーを用意されたとしても、プロトコルや通信手順を知られなければ機能しないはずです。
    そうなるとこのタイムサーバーは必ず生きていなければいけないことになりますし、こういう独自のタイムサーバーを作る工数もそこそこかかりますので、ご指摘通り、お手軽というわけにはいかなそうですね・・・

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2011年6月23日 15:53
    モデレータ
  • どこまで頑張るつもりなんでしょうね。SSLを使って証明書を検証するとか。

    というか、作る側のスキル次第なところはありますし。

    どんなに複雑なライセンスチェックをしていても、そのチェックの if 文をバイナリ書き換えされたら終わりだったりしますし。

    2011年6月23日 17:24
  • こんばんは。

    どこまで頑張るかは予算次第で、

    本音を言うとドングルにしたいのですが、

    色々と事情があります。

     

    2011年6月24日 13:42