Coding4ever’s Blog

Just coding… coding… and coding… because coding should be fun :)

Menambahkan Serial Number Pada Paket Instalasi (Inno Setup)

| Comments

Melengkapi koleksi artikel saya tentang pembuatan paket instalasi, kali ini kita akan menambahkan serial number pada paket instalasi yang kita buat menggunakan Inno Setup.

IKG (Inno Key Generator) adalah Third-Party files yang akan kita gunakan pada artikel ini dan Inno Setup yang saya gunakan adalah versi 5.0.8.

Silahkan Anda download IKG dari situs resminya atau bisa juga download disini tetapi saya lebih menyarankan Anda untukĀ  mendownload dari link ke dua saja :D karena sudah saya seleksi file-file apa saja yang dibutuhkan.

Jika sudah selesai downloadnya silahkan Anda ekstrak file IKG.rarnya, berikut adalah penjelasan singkat tentang file-file yang ada di dalam file IKG.rar

  1. ISID.dll, file ini dibutuhkan untuk melakukan validasi serial number/unlock code yang diinputkan pada saat proses instalasi, otomatis harus kita sertakan pada saat pembuatan paket instalasi.

  2. IKG.exe adalah tool untuk mengenerate file Inno Key yang berisi informasi user + serial number valid yang sudah terenkripsi, jadi setiap paket instalasi yang kita buat membutuhkan file inno key yang unik (huhhhh report juga ya) namanya juga mau aman (walaupun tidak 100%) report sedikitkan engga pa2 kan (ralat 1 public key inno bisa untuk beberapa user name yg berbeda).

  3. IKGHelp.pdf, klo yang ini kayaxnya enggak perlu saya jelasin.

Oke langsung saja Anda jalankan file IKG.exe, setelah itu akan tampil form berikut :

Langkah pertama yang harus kita lakukan adalah mengeset password IKG, agar tidak semua orang bisa menggunakan tool ini.

Klik menu File -> Change Bank Password

Selanjutnya kita tinggal masukkan passwordnya

Untuk menyederhanakan pembahasan, informasi yang akan kita tambahkan pada saat instalasi kita batasi sebagai berikut :

  1. Registered Name

  2. Registered Company

  3. Registration Code

  4. Private Key

Maka konfigurasi yang harus kita set pada tool IKG adalah sebagai berikut :

Kita tinggal menginputkan informasi Registered Name dan Organisation, untuk informasi Registration Code dan Private Key sudah otomatis terisi.

Jika sudah kita langsung saja simpan file Inno Keynya, file ini berisi informasi Registered Name, Registered Company, Registration Code dan Private Key (sesuai setting diatas) yang sudah dienkripsi.

Jadi jika kita akan membuat file setup berikutnya, kita harus mengetik ulang informasi Registered Name dan Registered Company yang lain (unik) dan menyimpan ulang file Inno Key (sebaiknya dengan nama yang berbeda).

Sampai disini kita akan memasuki bagian yang paling menyenangkan yaitu coding :D. Kita akan menambahkan beberapa baris kode pada bagian [Files] dan [Code].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
[Files]
;file klien-1.iky dihasilkan oleh tool IKG
Source: klien-1.iky; DestDir: {tmp}; Flags: ignoreversion
Source: ISID.dll; DestDir: {sys}; Flags: ignoreversion

[Code]
function ValidateSerialNumber(InnoKeyFile, User, Orgn, ProdCode, HDD, MAC, PrivateKey, Serial: String): Boolean;
external ‘ValidateSerialNumber@files:ISID.dll stdcall’;

const
    INNO_KEY = ‘klien-1.iky’;

var
  UserPage   : TInputQueryWizardPage;
  UserValues : TArrayOfString;

procedure InitializeWizard();
begin
  { create the custom page }
    UserPage := CreateInputQueryPage(wpInfoBefore, ‘Informasi Registrasi’, ‘Anda memerlukan user yang valid agar bisa melanjutkan proses instalasi’,
      ‘Masukkan informasi registrasi (case sensitive), kemudian klik tombol Lanjut >.’);

  UserPage.Add(‘Registered Name:’, False);
  UserPage.Add(‘Registered Company:’, False);
  UserPage.Add(‘Registration Code:’, False);
  UserPage.Add(‘Private Key:’, False);

  { Set default values }
      SetArrayLength(UserValues, 4);
      RegQueryStringValue(HKLM, ‘Software\Microsoft\Windows\CurrentVersion’, ‘RegisteredOwner’, UserValues[0]);
      RegQueryStringValue(HKLM, ‘Software\Microsoft\Windows\CurrentVersion’, ‘RegisteredOrganization’, UserValues[1]);
      if (UserValues[0] = ‘’) and (UserValues[1] = ‘’) then begin
      RegQueryStringValue(HKCU, ‘Software\Microsoft\MS Setup (ACME)\User Info’, ‘DefName’, UserValues[0]);
      RegQueryStringValue(HKCU, ‘Software\Microsoft\MS Setup (ACME)\User Info’, ‘DefCompany’, UserValues[1]);
      end;

      { Try to find the settings that were stored last time (also see below). }
      UserPage.Values[0] := GetPreviousData(‘Name’, UserValues[0]);
      UserPage.Values[1] := GetPreviousData(‘Company’, UserValues[1]);
      UserPage.Values[2] := GetPreviousData(‘Unlock’, UserValues[2]);
      UserPage.Values[3] := GetPreviousData(‘Private’, UserValues[3]);

end;

procedure RegisterPreviousData(PreviousDataKey: Integer);
begin
  { Store the settings so we can restore them next time }
  SetPreviousData(PreviousDataKey, ‘Name’, UserPage.Values[0]);
  SetPreviousData(PreviousDataKey, ‘Company’, UserPage.Values[1]);
  SetPreviousData(PreviousDataKey, ‘Unlock’, UserPage.Values[2]);
  SetPreviousData(PreviousDataKey, ‘Private’, UserPage.Values[3]);
end;

function ScriptDlgPages(CurPage: Integer; BackClicked: Boolean): Boolean;
var
      ExpPath: String;

begin
  Result := True;

  if (CurPage = UserPage.ID) then
  begin
        ExtractTemporaryFile(INNO_KEY);       { the public key file }

      ExpPath := ExpandConstant(‘{tmp}\’ + INNO_KEY);

      Result := False;

      UserValues[0] := UserPage.Values[0];
      UserValues[1] := UserPage.Values[1];
      UserValues[2] := UserPage.Values[2];
      UserValues[3] := UserPage.Values[3];

      if (UserValues[0] = ‘’) or (UserValues[1] = ‘’) or (UserValues[2] = ‘’) or (UserValues[3] = ‘’) then
          MsgBox(‘No fields can be blank !’, mbError, MB_OK)
      else
      begin
          Result := ValidateSerialNumber(ExpPath, UserValues[0], UserValues[1], ‘’, ‘’, ‘’, UserValues[3], UserValues[2]);

          if (not Result) then
              MsgBox(‘Invalid Entry !’, mbError, MB_OK);

      end
  end
end;

function NextButtonClick(CurPage: Integer): Boolean;
begin
  Result := ScriptDlgPages(CurPage, False);
end;

function BackButtonClick(CurPage: Integer): Boolean;
begin
  Result := True;//ScriptDlgPages(CurPage, True);
end;

function HasHtmlHelp(): Boolean;
begin
  { HHCTRL.OCX GUID }
  Result := RegValueExists(HKCR, ‘CLSID{4662DAB0-D393-11D0-9A56-00C04FB68B66}\InprocServer32’, ‘’);
end;

function HasNoHtmlHelp(): Boolean;
begin
  Result := not HasHtmlHelp;
end;

Jika sudah selesai silahkan compile (CTRL+F9) skrip inno setup Anda, dan ingat skrip diatas hanya potongan skrip inno setup. Contoh skrip yang lengkap bisa Anda lihat disini dan sini.

Jika kita mencoba memasukkan informasi registrasi yang salah, maka akan tampil pesan berikut :

Selamat mencoba :)

inno setup, tools installer

Tentang Penulis

Software developer yang fokus mengembangkan aplikasi di atas platform .NET (Desktop, ASP.NET MVC, Web Service, Microservice) dan Android. Senang mempelajari teknologi baru terutama di bidang OOP, Design Pattern, ORM, Database, Continuous Integration & Deployment dan arsitektur Microservice.
Selain mengajar, saat ini penulis juga bekerja sebagai staf IT di salah satu PTS di Yogyakarta sebagai senior software developer. Di waktu luang insya Alloh akan terus berbagi pengalaman di blog ini :)

« Menambahkan skin pada paket instalasi (Inno Setup) Tips mengatur posisi caption objek CommandButton »

Comments