ライセンスの制限
Babel Licensing のテンプレートの「制限」セクションでは、ライセンスの使用方法に対する具体的な制約を定義できます。制限を使うとライセンスの動作をきめ細かく制御でき、さまざまなライセンスモデルを実装して、使用条件を適用できます。Babel Licensing には組み込みの制限の種類がいくつかあり、カスタム制限を作成することもできます。
ライセンスの制限の概要
ライセンスの制限は、特定のライセンスの下でソフトウェアをいつ、どこで、どのように使用できるかを決める、強制力のある条件です。制限の種類はそれぞれ、期間限定の使用からハードウェアへの紐付けまで、ライセンス制御の特定の側面を扱います。1 つのライセンステンプレートに複数の制限を組み合わせて、要件に合わせた高度なライセンスモデルを作成できます。
ライセンスに複数の制限がある場合、ライセンスが有効と見なされるには、すべての制限が個別に検証に合格する必要があります。1 つでも制限の検証に失敗すると、ライセンスの検証全体が失敗します。これにより、定義したすべての制約を同時に満たす必要がある、非常に限定的なライセンス条件を作成できます。
ベータ制限
ベータ制限はプレリリース版のソフトウェア向けで、ソフトウェアがベータ段階にあることを示す情報をライセンスに付けます。
主なプロパティ:
- ビルドの種類:ソフトウェアの開発段階を示すビルドの種類(「Alpha」、「Beta」、「RC」など)を指定します。
- 最近の変更:このベータリリースに固有の変更や機能を記録できるテキストフィールド。
ユースケース:
- テスターや一部の顧客への早期アクセス版の配布
- 製品の正式リリース前の、期間限定のベータプログラム
- ソフトウェアがプレリリース版であることを明示することによる責任の限定
実装例:
if (license.Restrictions.OfType<BetaRestriction>().Any())
{
// Show beta warning dialog
// Enable telemetry and crash reporting
}ハードウェア制限
ハードウェア制限は、ライセンスを特定のハードウェアに紐付けて、別のコンピューターでの不正な使用を防ぎます。これは、対象のコンピューターに固有の特性から生成されるハードウェアキーによって実現されます。
主なプロパティ
- ハードウェアキー:コンピューターのハードウェアコンポーネントから生成される一意の識別子(テンプレートでは空にしておき、ライセンスアクティベーションの際に設定できます)。
- データ:ハードウェア固有の情報を格納するために使用できる追加データ。
ユースケース:
- 1 台のコンピューター用の永久ライセンス
- 複数のデバイスでのライセンス共有の防止
- ソフトウェアを許可されたハードウェアに紐付ける必要がある、高いセキュリティが求められる環境
注:アクティベーションライセンスを使用する場合、ハードウェア制限はアクティベーションの過程で自動的に適用されます。ライセンスが、ハードウェア ID を通じて特定のコンピューターに紐付けられるためです。そのため、アクティベーションのライセンスモードを使用するライセンステンプレートに、ハードウェア制限を明示的に追加する必要はありません。ハードウェアへの紐付けは、アクティベーションの処理そのものが行います。
トライアル制限
トライアル制限は、期間または実行に関するパラメーターによってソフトウェアの使用を制限します。ソフトウェアの無料トライアル版の実装に適しています。
主なプロパティ:
- 有効日数:最初の使用からトライアルが有効な日数。
- 実行インスタンス数:同時に実行できるインスタンスの最大数。
- 実行回数:アプリケーションを実行できる回数の上限。
- 実行時間:1 回のセッションでアプリケーションを実行できる最大時間。
- 条件:トライアルライセンスに適用される特別な利用条件。
ユースケース:
- 期間限定の評価版
- 機能限定のトライアル版
- 使用回数限定のデモ版
- フリーミアムモデルの実装
実装例:
var trial = license.Restrictions.OfType<TrialRestriction>().FirstOrDefault();
if (trial != null)
{
if (trial.IsExpired())
{
// Show trial expiration message
// Prompt for license purchase
}
else
{
// Show remaining trial period
// Log trial usage
}
}ドメイン制限
ドメイン制限は、ライセンスの使用を特定のネットワークドメインに限定し、ソフトウェアが許可された組織の範囲内でのみ使用されるようにします。
主なプロパティ:
- ドメイン:ライセンスが有効なネットワークドメイン名(「example.com」など)。
- ロール:ドメイン内のロールの識別子(「developer」、「admin」など)。任意です。
ユースケース:
- 特定の組織向けのエンタープライズライセンス
- 許可された社内ネットワークへのソフトウェア使用の限定
- 組織の部門ごとに異なるライセンス条件
使用状況制限
使用状況制限は、アプリケーションの実行が許可される環境を定義し、デプロイのシナリオと実行コンテキストを制御できるようにします。
主なプロパティ:
- 使用状況:許可される使用環境またはコンテキストを示します。
- 仮想環境での実行を許可する:true の場合、仮想化された環境でソフトウェアを実行できます。
- プロセス一覧:ライセンスが有効であるために、実行されている必要がある、または実行されていてはならないプロセスの一覧。
ユースケース:
- セキュリティが重視されるアプリケーションでの、仮想マシン上での実行の防止
- 特定の環境(開発、ステージング、本番)へのソフトウェアの限定
- 特定の関連プロセスの存在を必須にする、または禁止する
カスタム制限
Babel Licensing では、組み込みの制限に加えてカスタム制限を作成し、アプリケーション固有のライセンス要件に対応できます。カスタム制限は強力な拡張の仕組みで、ビジネス上および技術上のニーズに合わせた専用の検証ロジックを実装できます。
カスタム制限の実装
カスタム制限を作成するには、Restriction を継承し、ILicenseSerializable インターフェイスを実装するクラスを作成する必要があります。これにより、検証ロジックと、ライセンスファイルで制限をシリアル化する方法の両方を完全に制御できます。
カスタム制限の主な構成要素:
- Name プロパティ:制限の種類を表す一意の識別子。
- カスタムプロパティ:制限の機能に固有のプロパティ。
- 検証ロジック:独自の基準に基づいてライセンスが有効かどうかを判断するカスタムコード。
- シリアル化メソッド:制限のデータを XML などの形式で読み書きするメソッド。
例:メモリ要件の制限
次は、コンピューターが最小メモリ要件を満たしているかどうかを検証するカスタム制限の例です。
/// <summary>
/// A license restriction that limits usage based on the physical memory (RAM)
/// of the system.
/// </summary>
class MemoryRestriction : Restriction, ILicenseSerializable
{
/// <summary>
/// Gets the name of the restriction.
/// </summary>
public override string Name => "Memory";
/// <summary>
/// Gets or sets the minimum total memory required in megabytes.
/// </summary>
public long TotalMemory { get; set; }
/// <summary>
/// Initializes a new instance of the <see cref="MemoryRestriction"/> class.
/// </summary>
public MemoryRestriction()
{
}
/// <summary>
/// Validates that the system has at least the required amount of physical memory.
/// </summary>
/// <param name="context">The license context.</param>
/// <param name="type">The type being validated.</param>
/// <param name="instance">The instance being validated.</param>
/// <returns>A <see cref="ValidationResult"/> indicating whether validation was successful.</returns>
public override ValidationResult Validate(ILicenseContext context, Type type, object instance)
{
ISystemInformation sys = (ISystemInformation)context.GetService(typeof(ISystemInformation));
// Cannot run on this machine
long totalMem = ToMegabytes(sys.TotalPhysicalMemory);
if (totalMem < TotalMemory)
return ValidationResult.Invalid;
return base.Validate(context, type, instance);
}
/// <summary>
/// Converts bytes to megabytes.
/// </summary>
/// <param name="bytes">The number of bytes to convert.</param>
/// <returns>The equivalent value in megabytes.</returns>
private static long ToMegabytes(long bytes)
{
return bytes / 1024 / 1024;
}
/// <summary>
/// Reads the memory restriction data from the specified state.
/// </summary>
/// <param name="state">The state object, which can be either an <see cref="XmlReader"/> or a <see cref="BinaryReader"/>.</param>
public void Read(object state)
{
if (state is XmlReader xmlReader)
{
xmlReader.MoveToContent();
string? totalMemory = xmlReader.GetAttribute("totalMemory");
if (totalMemory != null)
TotalMemory = XmlConvert.ToInt64(totalMemory);
bool isEmptyElement = xmlReader.IsEmptyElement;
xmlReader.ReadStartElement();
if (!isEmptyElement)
xmlReader.ReadEndElement();
}
else if (state is BinaryReader binaryReader)
{
TotalMemory = binaryReader.ReadInt32();
}
}
/// <summary>
/// Writes the memory restriction data to the specified state.
/// </summary>
/// <param name="state">The state object, which can be either an <see cref="XmlWriter"/> or a <see cref="BinaryWriter"/>.</param>
public void Write(object state)
{
if (state is XmlWriter)
{
XmlWriter writer = (XmlWriter)state;
if (TotalMemory != 0)
writer.WriteAttributeString("totalMemory", XmlConvert.ToString(TotalMemory));
}
else if (state is BinaryWriter)
{
BinaryWriter writer = (BinaryWriter)state;
writer.Write(TotalMemory);
}
}
}完全なサンプルプロジェクトは GitHub で入手できます。
git clone https://github.com/babelfornet/custom_license_restrictions.gitライセンス作成でのカスタム制限の使用
カスタム制限のクラスを定義したら、ライセンスを生成するときに使用できます。
// Create a digital signer
RSASignature signer = RSASignature.CreateFromKeyFile("Keys.snk");
// Requires a minimum of 4GB RAM to validate
int totalMemory = 4096;
var license = new XmlLicense()
.WithUniqueId()
.ForProduct("Product", "1.0.0.0")
.LicensedTo("ACME", "devs@acme.com")
.WithRestrictions(new MemoryRestriction(totalMemory))
.SignWith(signer);
license.Save("Product.licenses");カスタム制限のユースケース
カスタム制限は、特殊なライセンス要件に幅広く対応できます。
- ハードウェア要件:最小仕様を満たすコンピューターでのみソフトウェアが実行されるようにします。
- ネットワーク構成:特定のネットワーク構成や接続要件を検証します。
- タイムゾーンによる制限:タイムゾーンに基づいて、ソフトウェアの使用を特定の地域に限定します。
- アプリケーションの共存:必要な関連アプリケーションがインストールされていることを検証します。
- データベースエンジンの検証:互換性のあるデータベースシステムが存在することを確認します。
- クラウド環境の検出:クラウドでホストされるデプロイに特別なルールを適用します。
- 独自のビジネスルール:業界固有または組織固有のライセンスルールを実装します。
カスタム制限とライセンステンプレート
カスタム制限は Babel Licensing のテンプレートシステムにそのまま組み込めるため、カスタムの検証ロジックを含むライセンス構成を保存して再利用できます。Babel Licensing Service でライセンステンプレートの一部として保存すると、カスタム制限は再利用できるコンポーネントになり、複数のライセンスに一貫して適用できます。
ライセンステンプレートへのカスタム制限の保存
カスタム制限を実装したら、Babel Licensing Service を通じてライセンステンプレートに組み込めます。
- 前の例のとおり、カスタム制限を含むライセンスを作成します。
- このライセンスを、Babel Licensing のデータベースにテンプレートとして保存します。
- カスタム制限を含むテンプレートが、新しいライセンスの生成に使用できるようになります。
テンプレートベースのカスタム制限の利点
カスタム制限をライセンステンプレートに保存すると、次の利点があります。
- 一貫性:テンプレートから生成されるすべてのライセンスに同じカスタム検証ルールが適用され、ライセンス戦略全体で一貫性が保たれます。
- 一元管理:カスタム制限を Babel Licensing Service 内の 1 か所で管理でき、ライセンスルールの更新や変更が容易になります。
- ライセンス生成の簡素化:複雑なカスタム制限を含む新しいライセンスを、検証ロジックを毎回実装し直すことなく生成できます。
- バージョン管理と追跡:ライセンス要件の変化に合わせて、カスタム制限のさまざまなバージョンを追跡できます。
- ライセンスのワークフローとの統合:ライセンスアクティベーション、フローティングライセンス、ファイルベースのライセンスなど、既存のライセンスのプロセスにカスタム制限を組み込めます。
ワークフローの例
次は、Babel Licensing Service のテンプレートシステムでカスタム制限を利用する一般的なワークフローです。
-
開発:開発環境でカスタム制限のクラスを作成し、テストします。
-
テンプレートの作成:カスタム制限を含むライセンスを作成し、テンプレートとして保存します。
var licenseKey = new XmlLicense() .WithUniqueId() .ForProduct("Product", "1.0.0.0") .WithRestrictions(new MemoryRestriction(4096)) .SignWith(signer) .ToReadableString(); // Store licenseKey in Babel Licensing Service -
ライセンスの生成:テンプレートを使って、顧客ごとのライセンスを生成します。
-
配布:生成したライセンスを、任意の方法(直接ダウンロード、メール、アクティベーションコードなど)で顧客に配布します。
-
検証:顧客がアプリケーションを使用すると、ライセンス検証の一部として、カスタム制限の検証ロジックが実行されます。
テンプレートに対応したカスタム制限の実装
カスタム制限がテンプレートシステムで正しく機能するように、次の実装ガイドラインを考慮してください。
- パラメーターの柔軟性:カスタム制限のクラスは、パラメーター付きの初期化(プログラムによる作成用)とパラメーターなしの初期化(テンプレートベースの作成用)の両方をサポートするように設計します。
- XML シリアル化:カスタム制限の構成をライセンステンプレートに保存し、テンプレートから読み込めるように、
IXmlSerializableインターフェイスを正しく実装します。 - 後方互換性:カスタム制限を更新するときは後方互換性を維持し、既存のテンプレートとライセンスが引き続き機能するようにします。
- エラー処理:カスタム制限がテンプレートで使用されたときに問題が起きないように、シリアル化と検証ロジックの両方に堅牢なエラー処理を実装します。
Babel Licensing Service の機能との統合
テンプレートに保存したカスタム制限では、Babel Licensing Service のすべての機能を利用できます。
- アクティベーションライセンス:アクティベーションが必要なライセンスにカスタム制限を適用し、アクティベーションの過程に独自の検証を追加します。
- フローティングライセンス:フローティングライセンスでカスタム制限を使用し、ライセンスの同時使用に独自の検証条件を追加します。
- ファイルライセンス:オフラインで検証するシナリオ向けに、ファイルベースのライセンスにカスタム制限を含めます。
Babel Licensing Service のライセンステンプレートにカスタム制限を組み込むことで、ライセンスの一元管理の利点を保ちながら、きわめて特殊な固有のライセンス要件にも対応できる、強力で柔軟な、保守しやすいライセンス管理システムを構築できます。
カスタム制限のベストプラクティス
- 検証を高速に保つ:カスタム制限の検証コードはライセンスの確認時に実行されるため、効率的なコードにします。
- 例外を処理する:アプリケーションのクラッシュを防ぐため、検証コードで例外を適切に処理します。
- 明確なフィードバックを返す:検証に失敗した場合は、失敗した理由がわかる情報を返します。
- 機密性の高いロジックを保護する:カスタム制限に含まれる機密性の高い検証ロジックは、リバースエンジニアリングの対象になる可能性があります。重要なコードには難読化を検討してください。
- 網羅的にテストする:さまざまな環境でカスタム制限をテストし、動作が一貫していることを確認します。
- 十分に文書化する:社内の開発用と顧客向けの資料の両方のために、カスタム制限を文書化します。
カスタム制限は Babel Licensing の機能を拡張して固有のライセンス要件に対応し、ニーズに合わせた柔軟で強力なライセンスソリューションを実現します。こうした専用の検証ルールにより、アプリケーションに必要なライセンスモデルを正確に実装でき、ソフトウェアのライセンスと使用の方法を完全に制御できます。
制限の組み合わせ
Babel Licensing の強力な機能の 1 つは、複数の制限を組み合わせて高度なライセンスモデルを作成できることです。たとえば、次のように組み合わせることができます。
- トライアル + ハードウェア:特定のコンピューターに紐付けた期間限定のトライアル
- ドメイン + 使用状況:企業のドメイン内かつ仮想環境以外でのみ有効なライセンス
- ベータ + カスタム:特定のテストシナリオ向けのカスタム制限を加えたベータライセンス
複数の制限を適用した場合、ライセンスが有効と見なされるには、すべての制限を満たす必要があります。これにより、ソフトウェアのライセンスと使用の方法を正確に制御できます。
制限の使用に関するベストプラクティス
- シンプルに始める:必要最小限の制限から始め、ライセンスのニーズの変化に合わせて追加します。
- ユーザー体験を考慮する:セキュリティと使いやすさのバランスを取ります。制限が厳しすぎるライセンスは、正規のユーザーの不満を招くことがあります。
- 明確なフィードバックを返す:制限が原因でライセンスの検証に失敗した場合は、ライセンスが無効な理由をアプリケーションが明確に示すようにします。
- 十分にテストする:制限のすべての組み合わせをテストし、さまざまなシナリオで期待どおりに動作することを確認します。
- エンドユーザー向けに文書化する:顧客が制限事項を理解できるように、ライセンスの種類ごとに適用される制限を明確に文書化します。
- 機能を段階的に縮退させる:一部の制限が満たされない場合でも、可能であれば、アプリケーション全体を停止するのではなく、限定された機能を使用できるようにすることを検討します。
テンプレートでライセンスの制限を効果的に活用すると、知的財産を保護しながら、顧客のライセンスレベルに応じた適切なアクセスを提供する、柔軟なライセンス管理システムを構築できます。これらの制限は、セキュリティと使いやすさのバランスを取った高度なライセンスモデルを実装するための基盤であり、正規のユーザーにはスムーズな体験を提供しながら、ソフトウェアがライセンス条件に従って使用されるようにします。