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 或安裝程式預寫。本機制適合小型獨立軟體的簡易授權,核心在於 System.Management 存取硬體資訊與 Microsoft.Win32.Registry 持久化。實務上應依威脅模型評估是否足夠。