シェアウェアを製作中ですが、ライセンス処理の実装について悩んでいます。

具体的には、以下のような(一般的な?)内容です。

トライアル版を使用する場合、最初の起動から有効期限(30日等)を設定したい。
有効期限を越えた場合は、利用できなくしたい。
その後ライセンスを購入した場合のみ継続利用は可能。
有効期限切れの場合、アプリの再インストールやシステムクロックを変更した場合は利用不可。

Windowsならばレジストリになんらかの情報を書き込むのは理解できるのですが、
アプリの再インストールやシステムクロックの変更をどのように対応すればいいのか。
どなたか、アドバイスお願いします。

また、有効期限等の情報を格納するのに、レジストリ以外のよい方法はあるか?
MacやLinuxの場合は、どのような方法があるか?
もアドバイス頂けるとうれしいです。

答えの内容によっては、十分なポイントを提供いたします。

回答の条件
  • 1人3回まで
  • 登録:2010/01/23 21:10:50
  • 終了:2010/01/27 16:29:23

回答(6件)

id:ayakasi08 No.1

ayakasi08回答回数172ベストアンサー獲得回数62010/01/23 21:13:32

ポイント10pt

システム領域に管理用ファイルを作成します。

WINDOWSなら

C:\Windows\system32

あたり

id:higuhigu

早速の回答ありがとうございます。もう少し具体的だとうれしいです。

それにその管理用ファイルを削除すると、有効期限後に利用可能になりますよね。

2010/01/23 21:42:09
id:km1967 No.2

km1967回答回数541ベストアンサー獲得回数402010/01/23 22:52:50

ポイント30pt

>アプリの再インストールやシステムクロックの変更をどのように対応すればいいのか

ご想像の通り、ハッシュキーを用意してレジストリに書き込めばOKです。

システムクロックの変更に対しては、NTPサーバの値を書き込むことです。ただし、ネットに繋がっていることが前提になりますが。


>MacやLinuxの場合は、どのような方法があるか?

実行ファイル自身やライブラリにバイナリで書き込むということをします。

id:higuhigu

ご回答ありがとうございます。

>実行ファイル自身やライブラリにバイナリで書き込むということをします。

なるほど・・・といってもイメージがわかないですが、ちょっと調べてみます。

2010/01/23 23:49:33
id:gogg45 No.3

gogg45回答回数117ベストアンサー獲得回数182010/01/23 23:30:53

ポイント30pt

> MacやLinuxの場合は、どのような方法があるか?

インストール時にどこかのフォルダにファイルを作成しインストール日を記録する方法があると思います。

> また、有効期限等の情報を格納するのに、レジストリ以外のよい方法はあるか?

結局はいたちごっこだと思います。レジストリでも削除されたら終わりですよね?

もし自分がやるなら、支払いが完了していない場合は試用期間のスプラッシュウィンドウを出して、必ず何らかの操作をさせてからしかアプリケーションが使えないようにし、支払いが完了したらなその制限を取り除くような実装にすると思います。(秀丸エディタなど他のシェアウェアを参考にされるとよいと思います。)

あと、注意したほうがいいのは、なぜ?というところのレジストリを書き換えたり、ファイルを置いたり書き換えたり、不正利用のチェックに引っかかった場合にシステムを不安定にさせるような細工をすると、評判を落とすことになると思います。

id:higuhigu

ご回答ありがとうございます。

>結局はいたちごっこだと思います。

同感です。ただ容易にハックされては困るし、あまり複雑にしても問題なのは、ご指摘の通りです。

>秀丸エディタなど他のシェアウェアを参考にされるとよいと思います。

本音をいえば、ソースコードを参考にしたいです。

2010/01/24 00:09:38
id:hironeko222 No.4

hironeko222回答回数7ベストアンサー獲得回数22010/01/24 00:09:32

ポイント30pt

インターネット環境下であることが条件ですが、、

WEBサイトを1つ立ち上げておき、ログイン認証で特定ページにアクセスできるようにしておきます。

そのページ自体はユーザーに知らせる必要はなく、そこの認証が成功したか失敗したかでソフトの使用可否を決めます。

トライアル申込があったら、WEBサイトにユーザー登録して利用可能状態にします。

トライアル期間が終わったらユーザー削除すれば利用できなくなり、購入されたらそのまま登録しておけば使用可能。

サイト側をうまく作ればトライアル用ユーザーは自動で30日後に削除なんてことも可能ですかね。

サーバーメンテ、ダウンに備えて、1回認証成功していればそこから7日程度は利用可能にしておくのがクレーム回避に有効かも。。

その1回認証できたというのをレジストリなりに書いてしまうと、そこがハックされるとNGですね。暗号化してチェックコードを含めるか。

ターゲットのユーザー層によりでしょうか。。 一般的なユーザー相手ならそれほど凝らなくても大丈夫かも知れないですね。

id:higuhigu

ご回答ありがとうございます。

ライセンス情報をネットワーク上におく考え方ですね。

ネットワーク利用を前提した場合ならばご指摘の通りでいいですね。

#ただ今回のアプリケーションはおもいっきり、スタンドアローンなんですよね

2010/01/24 00:25:36
id:heke2mee No.5

heke2mee回答回数162ベストアンサー獲得回数432010/01/24 05:21:19

ポイント30pt

私もあるソフトを開発中で、フリーにするかシェアウェアにするか

悩んでいるので参考になれば幸いです。


質問主さんのコメントにある「管理用ファイルを削除すると・・・」と言う条件を付けてしまうと、

ローカルでライセンス管理をすることは出来ません。


有効期限を設けるということは、初回に基準となる日付をレジストリやファイルなどに

書き込む必要があります。

保存場所を見つけにくくすることは出来ますが、見つかってしまえば消せます。

またワザワザ探さなくても仮想マシンなどを使っている場合は

「仮想マシン自体のスナップショット」を保存していれば、すぐにロールバック出来きます。


それとアプリケーションのアンインストール時に設定を残す必要があるので、ユーザによっては

「ゴミを残したままだ」と言って嫌悪感を感じ、避けられる可能性があります。


オンラインでユーザー管理をやるにしても、アカウントの共有をされてしまうと

無理です。これを防ぐには個人をある程度特定できる情報が必要になります。

例えば、携帯のメールアドレスやマシン固有情報(MACアドレスなど)です。

ただ、これを行うと機種を変更した場合の対応なども必要となりコストが掛かります。



本来の目的は、ユーザにとって必要なソフトかどうかを判断してもらうことです。

動作の機能制限付きや、起動時にメッセージが出るだけにして

ライセンス登録を行った場合に、制限を外すほうが簡単です。

また、機能制限もやりすぎると使ってもらえません。


ライセンス番号の配布はVectorみたいな所でやってもらうのが

簡単たど思います。ただ、この方法もライセンス番号を共有されたら

意味がありません。


最後は、どこまで妥協するかだと思います。

id:higuhigu

ご回答ありがとうございます。

おっしゃる通り、ライセンスの適用にあたって限界があるのは理解しています。

やはりこういのって、みな独自で実装しているのがほとんどなんでしょうね。

何か、いい落としどころはないのでしょうか・・・。

2010/01/24 17:21:37
id:sasaki30234 No.6

sasaki30234回答回数18ベストアンサー獲得回数02010/01/24 15:12:33

ポイント30pt

インターネットで試用キーを発行する仕組みにすればよいと思われます。

そのキーには、内部的に有効期限の情報を埋め込んでおき、利用者が分からない状態で使われるようにします。試用キーが trial_until_2010_09_08 だとわかりやすすぎるのであなただけのロジックを組み込んでおきます。

その試用キーは、利用者が申請した電子メールアドレスに送付するようにしておき、電子メールアドスが重複した場合には発行しないなどの措置をとります。(アドレスを無限に作成する人には牽制になりませんが、そういう人はどんな対策をしても使う手を考えます)

id:higuhigu

ご回答ありがとうございます。

なるほど、参考になります。ちょっと複雑になりますが、有効な方法だと思います。

後はシステムクロックが変更された場合ですね。#こっちはなんとかなるかな?

2010/01/24 17:51:26

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません