5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

C#.NETでライセンス認証機能を作る

Posted at

はじめに

こんにちは。開発部のMです。
今回はC#.NETでライセンス認証機能を作成する方法の一例を紹介したいと思います。

前提

  • オフラインにてユーザーからリクエストを受けライセンスを許可する。
  • 1度許可した端末では次回から認証を求めない。
  • Visual Studioの”Windows フォーム アプリケーション(.NET Framework)”での開発を想定。

仕様

  1. ユーザーがアプリケーションを使用したい端末でリクエストファイルを作成する。
  2. リクエストファイルを受け取り、その内容を元にライセンスファイルを作成する。
  3. ユーザーがライセンスファイルを受け取りリクエストファイルの内容と一致すれば認証成功。

リクエストファイルの作成

1)リクエストファイルを出力する画面を作成する。

画面内容

  • リクエストファイルの出力先、出力ファイル名を指定する項目(フォルダ選択ボタンやファイル名を入力するテキストボックスなど)
  • リクエストファイルを出力するトリガーとなるボタン(以下、「リクエストファイル出力」ボタン)

2)リクエストファイル出力処理

① 「リクエストファイル出力」ボタン押下時の処理を作成する

端末情報取得
string plainText = "";
ManagementClass mc = new ManagementClass("Win32_OperatingSystem");
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
    plainText = mo["SerialNumber"].ToString();
    mo.Dispose();
}
moc.Dispose();
mc.Dispose();

下記はWindowsオペレーティングシステムの情報にアクセスする処理です。

ManagementClass mc = new ManagementClass("Win32_OperatingSystem");

Win32_OperatingSystem クラスのインスタンスを取得した場合、以下のような情報にアクセスできます。

システム情報
  • Caption - OSの名前(例: "Microsoft Windows 11 Pro")
  • Version - OSのバージョン(例: "10.0.22000")
  • BuildNumber - ビルド番号
  • CSDVersion - サービスパックのバージョン
  • Manufacturer - 製造元("Microsoft Corporation")
  • OSArchitecture - アーキテクチャ("64-bit" や "32-bit")
インストール・ライセンス情報
  • InstallDate - OSのインストール日時
  • SerialNumber - ライセンスキー
  • RegisteredUser - 登録ユーザー名
システムパス
  • SystemDirectory - システムディレクトリのパス
  • WindowsDirectory - Windowsディレクトリのパス
  • BootDevice - 起動デバイス
メモリ情報
  • TotalVisibleMemorySize - 合計物理メモリ (KB)
  • FreePhysicalMemory - 利用可能な物理メモリ (KB)
  • TotalVirtualMemorySize - 合計仮想メモリ (KB)
  • FreeVirtualMemory - 利用可能な仮想メモリ (KB)
パフォーマンス・状態情報
  • LastBootUpTime - 最終起動時間
  • LocalDateTime - 現在のローカル時間
  • NumberOfProcesses - 実行中のプロセス数
  • NumberOfUsers - ログイン中のユーザー数
  • Status - 現在の状態
ページファイル情報
  • SizeStoredInPagingFiles - ページファイルのサイズ
  • FreeSpaceInPagingFiles - ページファイルの空き容量

今回は端末を特定したいので「SerialNumber」を使用しました。

② 共通鍵Aで「SerialNumber」を暗号化
③ ②の内容をレジストリに書き込み

レジストリ書込
try
{
    //キー(HKEY_CURRENT_USER\Software\xxx)を開く
    Microsoft.Win32.RegistryKey regkey =
        Microsoft.Win32.Registry.CurrentUser.CreateSubKey(@"Software\xxx");
    //バイト配列を書き込む(REG_BINARYで書き込まれる)
    byte[] arrBytes = Encoding.Unicode.GetBytes(cipher);
    regkey.SetValue("request", arrBytes);
    //閉じる
    regkey.Close();
} catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

④ ②の内容をリクエストファイルに出力

3)ライセンスファイルを出力する画面を作成する

画面内容

  • リクエストファイルを取り込む項目(ファイル選択ダイアログなど)
  • ライセンスファイルの出力先、出力ファイル名を指定する項目(フォルダ選択ボタンやファイル名を入力するテキストボックスなど)
  • ライセンスファイルを出力するトリガーとなるボタン(以下、「ライセンスファイル出力」ボタン)

4)ライセンスファイル出力処理

① リクエストファイルの内容を共通鍵Aで複合化
② 複合化した内容を共通鍵Bで暗号化
③ ②の内容をライセンスファイルに出力

5)ライセンス認証処理

① ライセンスファイルの内容を共通鍵Bで複合化
② 2)-③で書き込んだレジストリの内容と一致するか確認する。一致すれば認証成功!
③ ①の内容をレジストリに書き込み
1度許可した端末では次回から認証を求めないという仕様のため、リクエスト内容をレジストリに書き込みます。次回起動時にはレジストリにライセンス内容があるかどうかチェックし、あった場合ライセンス認証処理をスキップします。

さいごに

簡単ですがC#.NETでライセンス認証機能を作成する方法の一例をご紹介しました。

  • Windowsオペレーティングシステムの情報にアクセス
  • 暗号化、複合化
  • レジストリへの書き込み

と複雑な機能が複数あり、詳しく書ききれなかった部分もありますが認証機能を作成したいという方の参考になれば幸いです。

はつかぜ株式会社では、IT学習や業務に役立つ情報を定期的にお届けしていきたいと思っています。
システム開発のお問い合わせ・ご相談はこちら
https://www.hatsukaze.co.jp/inquire/

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?