V alentine
B ooks
ヴァレンタイン書店

●VisualStudioの紹介

●画面プログラムの作り方

●コンソールプログラムの作り方

●DBプログラムの作り方(SELECT)

●DBプログラムの作り方(INSERT)

●DBプログラムの作り方(UPDATE)

●DBプログラムの作り方(DELETE)

●DB最適化

●AmazonMWSの使用方法

●YahooAPIの使用方法

●楽天APIの使用方法

●Webからのデータ取得方法

●レジストリを利用した利用者認証機能

●プログラム間の値の引継ぎ方法

●プログラム実行パスの取得

●デバッグ方法

●ショートカットキー

●設定

●64ビットOS対応

●ヴァレンタイン書店Web支店

●店長ブログ

                                        

C#アプリを公開し、課金しようとした場合に、インストール後1ヶ月間は無料で全機能使わせたいが、
1ヶ月以降は利用料金を支払わないと使えなくする、といった様な認証機能が必要になります。
この認証機能の実現には色々悩みました。

レンタルサーバにユーザIDとパスワードを管理するDBを準備して、ユーザの端末からDBを参照させて
認証可否を判定するなんてアイデアもありましたが、私が使用しているロリポップでは、クライアントプログラムから
サーバへアクセスすることが禁止されていたため、実現できませんでした。

では、どうしようかと悩んだ挙句、レジストリを利用して認証を行う方式にたどり着きました。
レジストリにアプリの使用年月日と使用期限年月日の値を登録するようにしました。
使用年月日にはアプリを使用した年月日、使用期限年月日には初回使用年月日+30日の日付を登録します。
延長利用をしたいユーザの課金を確認したら使用期限年月日を延伸するプログラムを送付します。

7行〜8行 OpenSubKeyでサブキーを取得します。キーへの書き込みアクセスを行うため、trueを第二引数に設定します。

11行 Software\test\subU2が存在しない場合(初回の場合)、サブキー取得の処理でnullが返ってきます。

12行〜31行 初回処理。CreateSubKeyでSoftware\test\subU2を作成します。
SetValueメソッドで、レジストリに使用年月日と使用年月日の30日後の使用期限年月日を登録しています。

レジストリを用いた利用者認証機能 サンプル
1   private void Authentication(){
2   
3       string regKey = Properties.Settings.Default.ApplicationId;
4   
5       DateTime dt = DateTime.Now; //当日日付の取得
6   
7       Microsoft.Win32.RegistryKey regkey =
8           Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\test\subU2", true);
9   
10      //初回起動時の処理
11      if (regkey == null)
12      {
13          Microsoft.Win32.RegistryKey regkey2 =
14              Microsoft.Win32.Registry.CurrentUser.CreateSubKey(@"Software\test\subU2");
15  
16  
17          //レジストリへの書き込み
18          //使用年月日
19          regkey2.SetValue("siyoYear", dt.Year);
20          regkey2.SetValue("siyoMonth", dt.Month);
21          regkey2.SetValue("siyoDay", dt.Day);
22  
23          //30日使用可能
24          DateTime dt2 = dt.AddDays(30);
25  
26          //レジストリへの書き込み
27          regkey2.SetValue("siyoKigenYear", dt2.Year);
28          regkey2.SetValue("siyoKigenMonth", dt2.Month);
29          regkey2.SetValue("siyoKigenDay", dt2.Day);
30  
31          regkey2.Close();
32  
33      }
34      //二回目
35      else
36      {
37          //使用期限年月日をレジストリより取得
38          int wkSiyoKigenYear = (int)regkey.GetValue("siyoKigenYear");
39          int wkSiyoKigenMonth = (int)regkey.GetValue("siyoKigenMonth");
40          string wkStSiyoKigenMonth = "";
41  
42          if (wkSiyoKigenMonth < 10)
43          {
44              wkStSiyoKigenMonth = "0" + wkSiyoKigenMonth.ToString();
45          }
46          else
47          {
48              wkStSiyoKigenMonth = wkSiyoKigenMonth.ToString();
49          }
50          
51          int wkSiyoKigenDay = (int)regkey.GetValue("siyoKigenDay");
52          string wkStSiyoKigenDay = "";
53          if (wkSiyoKigenDay < 10)
54          {
55              wkStSiyoKigenDay = "0" + wkSiyoKigenDay.ToString();
56          }
57          else
58          {
59              wkStSiyoKigenDay = wkSiyoKigenDay.ToString();
60          }
61  
62          string strSiyoKigenYMD = wkSiyoKigenYear.ToString() + wkStSiyoKigenMonth + wkStSiyoKigenDay;
63  
64          //使用年月日をレジストリより取得
65          int wkSiyoYear = (int)regkey.GetValue("siyoYear");
66          int wkSiyoMonth = (int)regkey.GetValue("siyoMonth");
67          string wkStSiyoMonth = "";
68          if (wkSiyoMonth < 10)
69          {
70              wkStSiyoMonth = "0" + wkSiyoMonth.ToString();
71          }
72          else
73          {
74              wkStSiyoMonth = wkSiyoMonth.ToString();
75          }
76  
77          int wkSiyoDay = (int)regkey.GetValue("siyoDay");
78          string wkStSiyoDay = "";
79          if (wkSiyoDay < 10)
80          {
81              wkStSiyoDay = "0" + wkSiyoDay.ToString();
82          }
83          else
84          {
85              wkStSiyoDay = wkSiyoDay.ToString();
86          }
87  
88          int wkSystemMonth = dt.Month;
89          int wkSystemDay = dt.Day;
90  
91          string wkStSystemMonth = "";
92          string wkStSystemDay = "";
93  
94          if (wkSystemMonth < 10)
95          {
96              wkStSystemMonth = "0" + wkSystemMonth.ToString();
97          }
98          else
99          {
100             wkStSystemMonth = wkSystemMonth.ToString();
101         }
102 
103         if (wkSystemDay < 10)
104         {
105             wkStSystemDay = "0" + wkSystemDay.ToString();
106         }
107         else
108         {
109             wkStSystemDay = wkSystemDay.ToString();
110         }
111 
112         string strSiyoYMD = wkSiyoYear.ToString() + wkStSiyoMonth + wkStSiyoDay;
113 
114         string strSystemYMD = dt.Year.ToString() + wkStSystemMonth + wkStSystemDay;
115 
116         //システム日付と使用期限年月日の比較
117         //システム日付が使用期限年月日より大きい場合(期限超過)
118         if (int.Parse(strSiyoKigenYMD) < int.Parse(strSystemYMD))
119         {
120             MessageBox.Show("使用期限日を超過しております。延伸の手続きをお願いします。使用期限日:" + strSiyoKigenYMD);
121 
122             //価格チェックボタンを非活性化
123             goButton.Enabled = false;
124         }
125         //期限超過していない場合
126         else
127         {
128             MessageBox.Show("利用可能です。使用期限は" + wkSiyoKigenYear.ToString() + "/" + wkSiyoKigenMonth.ToString() + "/" + wkSiyoKigenDay.ToString() + "です。");
129 
130             //レジストリへの書き込み
131             //使用年月日にシステム日付をセットする
132             regkey.SetValue("siyoYear", dt.Year);
133             regkey.SetValue("siyoMonth", dt.Month);
134             regkey.SetValue("siyoDay", dt.Day);
135         }
136 
137         //閉じる
138         regkey.Close();
139     }
140 }