WiX Toolset – CustomAction

インストールの途中でプロダクトキーの入力を求め、正当なインストールかどうか調べるプログラムを作成します。

ソフトメーカーがどのようなプロダクトキー作成アルゴリズムを使っているのか、日本語の情報を見つけることができませんでしたが、Code Projectのサイトにそれらしいものがあります(私自身内容を確認していません)。

今はプロダクトキーの作成方法が論点ではないので、こちらは簡単にして、WiXでCustomActionをどのように作成して、どのように組み込むかをご説明します。

CustomActionは様々な方法で作成できます。PACKT本に詳しく書かれていますが、今回はVBでDllを作成します。

アプリケーションの注文が来たら、ユーザ名を使ったプロダクトキーを作成・返送し、ユーザがソフトをインストールするときに、名前とキーを使ってインストールが正規かどうかチェックします。

入力用のダイアログ画面ではユーザ名、会社名、プロダクトキーの入力用TextBoxがあって、ユーザが入力した値が、USERNAME、COMPANYNAME、PIDKEYグローバル・プロパティにセットされます。

これをチェックする簡単なアクションプログラムを下に示します。セットアップ本体とCustomActionとは、sessionを使って簡単にデータの授受ができます。

プロダクトキーはにユーザ名を16桁のHexで表示したものです。Hexアレイの順番を入れ替えるとか、ダミーの文字を入れるとかするともう少しもっともらしくなります。

VBのプロジェクトを以下のように作成します。Visual Studio 2013で「新しいプロジェクト」をクリック、Windows Installer XMLタブから、VB Custom Action Projectをクリックします。

自動生成されたメインのファイル(CustomAction.vb)を以下のように変更し、ビルドするとCheckPID.CA.dllファイルが作成されます

Imports System.IO
Imports System.Text
Imports Microsoft.Deployment.WindowsInstaller
Public Class CustomActions2
    <CustomAction()> _
    Public Shared Function CheckPID(ByVal session As Session) As ActionResult
        Dim strName As String = session("USERNAME")
        Dim strPid As String = session("PIDKEY")
        Dim O_CheckID = New clsProductKey2("Shift_JIS")
        session("PIDACCEPTED") = O_CheckID.CheckKey(strName, strPid)
        Return ActionResult.Success
    End Function
End Class
Public Class clsProductKey2
    Private enc As Encoding
    Private Const strPpack As String = "m6bk9UoUXzgTvmwv"
    Public Sub New(ByVal encStr As String)
        enc = Encoding.GetEncoding(encStr)
    End Sub
    Public Function CheckKey(P_Name As String, P_ProductKey As String) As String
        Dim strFromName As String = MakeKey(P_Name)
        If strFromName.Equals(DelDelimiter(P_ProductKey, " ")) _
            Or strFromName.Equals(DelDelimiter(P_ProductKey, "-")) Then
            Return "1"
        Else
            Return "0"
        End If
    End Function
    Public Function DelDelimiter(p_strHyphen As String, p_strDelimiter As String) As String
        Dim strArray() As String = p_strHyphen.Split(p_strDelimiter)
        Dim strHex As String = ""
        For Each strOneChar As String In strArray
            strHex &= strOneChar
        Next
        Return strHex
    End Function
    Public Function MakeKey(p_Name As String) As String
        Dim strPackedName As String = p_Name & strPpack
        Dim nameBytes() As Byte = enc.GetBytes(strPackedName)
        Dim str As String = ""
        Dim i As Integer
        For i = 0 To nameBytes.Length - 1
            If i < 8 Then
                str &= String.Format("{0:X2}", nameBytes(i))
            Else
                Exit For
            End If
        Next
        Return str
    End Function
End Class

次回は、プロダクトキー入力ダイアログと、これらをどのようにセットアッププログラムに組み込むか、ご説明いたします。

error: コピーできません !!