首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 實作光碟序號綁定授權機制 (WMI + 登錄表)

     編輯:關於C語言

授權邏輯

  1. 註冊階段:使用者插入授權光碟 → 程式讀取光碟 Volume Serial Number (唯一) → 寫入登錄表。
  2. 驗證階段:程式啟動 → 讀取當前光碟序號 → 比對登錄表 → 相符才允許執行。

關鍵技術:WMI 查詢光碟資訊

using System.Management;

ManagementClass driveClass = new ManagementClass("Win32_CDROMDrive");
ManagementObjectCollection drives = driveClass.GetInstances();

foreach (ManagementObject drv in drives)
{
    string serial = drv["VolumeSerialNumber"]?.ToString();
    if (!string.IsNullOrEmpty(serial))
    {
        // 取得第一張有序號的光碟
        return serial;
    }
}

需參考 System.Management.dll。

登錄表操作

using Microsoft.Win32;

const string RegPath = @"Software\MyApp\License";

public bool SaveSerial(string serial)
{
    try
    {
        using (RegistryKey key = Registry.LocalMachine.CreateSubKey(RegPath))
        {
            key.SetValue("CDSerial", serial);
        }
        return true;
    }
    catch { return false; }
}

public string LoadSerial()
{
    try
    {
        using (RegistryKey key = Registry.LocalMachine.OpenSubKey(RegPath))
        {
            return key?.GetValue("CDSerial")?.ToString();
        }
    }
    catch { return null; }
}

完整表單程式碼 (註冊工具)

public partial class LicenseForm : Form
{
    public LicenseForm() { InitializeComponent(); }

    private void btnRegister_Click(object sender, EventArgs e)
    {
        string serial = ReadCdSerial();
        if (serial == null)
        {
            MessageBox.Show("偵測不到光碟或光碟無序號,請插入授權光碟。");
            return;
        }

        if (SaveSerial(serial))
            MessageBox.Show("授權註冊成功!序號:" + serial);
        else
            MessageBox.Show("寫入登錄表失敗,請以系統管理員身分執行。");
    }

    private string ReadCdSerial()
    {
        try
        {
            using (ManagementClass mc = new ManagementClass("Win32_CDROMDrive"))
            using (ManagementObjectCollection moc = mc.GetInstances())
            {
                foreach (ManagementObject mo in moc)
                {
                    string sn = mo["VolumeSerialNumber"]?.ToString();
                    if (!string.IsNullOrEmpty(sn)) return sn;
                }
            }
        }
        catch { }
        return null;
    }
}

主程式啟動時驗證

static class Program
{
    [STAThread]
    static void Main()
    {
        string saved = LoadSerial();
        string current = ReadCdSerial(); // 同樣的 WMI 讀取邏輯

        if (string.IsNullOrEmpty(saved) || string.IsNullOrEmpty(current) || saved != current)
        {
            MessageBox.Show("授權驗證失敗,請插入正確的授權光碟。");
            return;
        }

        Application.EnableVisualStyles();
        Application.Run(new MainForm());
    }
}

安全性考量與改進方向

  • 登錄表權限:HKLM 需管理員權限寫入;部署時可改用 HKCU 或安裝程式預寫。
  • 序號偽造:Volume Serial 可被工具修改;建議結合光碟實體特徵 (ATIP、壞軌特徵碼) 或使用加密狗 (HASP/KeyLock)。
  • 多光碟機:邏輯應遍歷所有光碟機,任一符合即通過。
  • 虛擬光碟:Daemon Tools 等虛擬光碟可掛載 ISO 繞過;可檢查驅動程式特徵或要求原廠壓製光碟。
  • 網路授權:企業級建議改為線上授權伺服器 (心跳檢查、離線授權檔)。

結語

本機制適合小型獨立軟體的簡易授權,核心在於 System.Management 存取硬體資訊與 Microsoft.Win32.Registry 持久化。實務上應依威脅模型評估是否足夠。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved