From 739b343776394f7e0f150a20169e224c2a2bd1a9 Mon Sep 17 00:00:00 2001 From: OCEAN <1010331798@qq.com> Date: Sat, 15 Feb 2025 18:03:31 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E9=85=8D=E7=BD=AE=E5=8A=A0?= =?UTF-8?q?=E4=B8=8A=E6=BF=80=E6=B4=BB=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CNAS_RunSync/ActivationForm.Designer.cs | 115 +++++++++++ CNAS_RunSync/ActivationForm.cs | 210 ++++++++++++++++++++ CNAS_RunSync/ActivationForm.resx | 120 +++++++++++ CNAS_RunSync/CNAS_RunSync.csproj | 10 + CNAS_RunSync/Program.cs | 26 ++- CNAS_SyncService/ActivationForm.Designer.cs | 115 +++++++++++ CNAS_SyncService/ActivationForm.cs | 210 ++++++++++++++++++++ CNAS_SyncService/ActivationForm.resx | 120 +++++++++++ CNAS_SyncService/CNAS_SyncService.csproj | 9 + dll/CNAS_RunSync.exe | Bin 57344 -> 62976 bytes dll/CNAS_SyncService.exe | Bin 19968 -> 26624 bytes dll/Cache/SyncTime.bin | 3 +- dll/ErrorLog/20250215.txt | 198 ++++++++++++++++++ 13 files changed, 1133 insertions(+), 3 deletions(-) create mode 100644 CNAS_RunSync/ActivationForm.Designer.cs create mode 100644 CNAS_RunSync/ActivationForm.cs create mode 100644 CNAS_RunSync/ActivationForm.resx create mode 100644 CNAS_SyncService/ActivationForm.Designer.cs create mode 100644 CNAS_SyncService/ActivationForm.cs create mode 100644 CNAS_SyncService/ActivationForm.resx diff --git a/CNAS_RunSync/ActivationForm.Designer.cs b/CNAS_RunSync/ActivationForm.Designer.cs new file mode 100644 index 0000000..d85e224 --- /dev/null +++ b/CNAS_RunSync/ActivationForm.Designer.cs @@ -0,0 +1,115 @@ +namespace CNAS_DBSync +{ + partial class ActivationForm + { + private System.ComponentModel.IContainer components = null; + + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + private void InitializeComponent() + { + this.lblTitle = new System.Windows.Forms.Label(); + this.lblDescription = new System.Windows.Forms.Label(); + this.lblActivationCode = new System.Windows.Forms.Label(); + this.txtActivationCode = new System.Windows.Forms.TextBox(); + this.btnActivate = new System.Windows.Forms.Button(); + this.lnkDownloadCode = new System.Windows.Forms.LinkLabel(); + this.SuspendLayout(); + // + // lblTitle + // + this.lblTitle.Location = new System.Drawing.Point(0, 0); + this.lblTitle.Name = "lblTitle"; + this.lblTitle.Size = new System.Drawing.Size(100, 23); + this.lblTitle.TabIndex = 0; + // + // lblDescription + // + this.lblDescription.Font = new System.Drawing.Font("微软雅黑", 10F); + this.lblDescription.ForeColor = System.Drawing.Color.Red; + this.lblDescription.Location = new System.Drawing.Point(20, 60); + this.lblDescription.Name = "lblDescription"; + this.lblDescription.Size = new System.Drawing.Size(560, 40); + this.lblDescription.TabIndex = 1; + this.lblDescription.Text = "请点击上方按钮下载机器识别码,然后将机器识别码发给平台管理员申请授权文件后进行激活,激活后才可正常使用取数仪器客户端。"; + // + // lblActivationCode + // + this.lblActivationCode.AutoSize = true; + this.lblActivationCode.Location = new System.Drawing.Point(20, 120); + this.lblActivationCode.Name = "lblActivationCode"; + this.lblActivationCode.Size = new System.Drawing.Size(69, 20); + this.lblActivationCode.TabIndex = 2; + this.lblActivationCode.Text = "激活码:"; + // + // txtActivationCode + // + this.txtActivationCode.Location = new System.Drawing.Point(20, 140); + this.txtActivationCode.Multiline = true; + this.txtActivationCode.Name = "txtActivationCode"; + this.txtActivationCode.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtActivationCode.Size = new System.Drawing.Size(840, 225); + this.txtActivationCode.TabIndex = 0; + // + // btnActivate + // + this.btnActivate.Location = new System.Drawing.Point(370, 460); + this.btnActivate.Name = "btnActivate"; + this.btnActivate.Size = new System.Drawing.Size(100, 30); + this.btnActivate.TabIndex = 3; + this.btnActivate.Text = "输入激活"; + this.btnActivate.Click += new System.EventHandler(this.btnActivate_Click); + // + // lnkDownloadCode + // + this.lnkDownloadCode.ActiveLinkColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(102)))), ((int)(((byte)(204))))); + this.lnkDownloadCode.AutoSize = true; + this.lnkDownloadCode.Font = new System.Drawing.Font("微软雅黑", 10F); + this.lnkDownloadCode.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline; + this.lnkDownloadCode.LinkColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(102)))), ((int)(((byte)(204))))); + this.lnkDownloadCode.Location = new System.Drawing.Point(20, 23); + this.lnkDownloadCode.Name = "lnkDownloadCode"; + this.lnkDownloadCode.Size = new System.Drawing.Size(129, 23); + this.lnkDownloadCode.TabIndex = 4; + this.lnkDownloadCode.TabStop = true; + this.lnkDownloadCode.Text = "下载机器识别码"; + this.lnkDownloadCode.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnkDownloadCode_LinkClicked); + // + // ActivationForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(909, 563); + this.Controls.Add(this.lblTitle); + this.Controls.Add(this.lblDescription); + this.Controls.Add(this.lblActivationCode); + this.Controls.Add(this.txtActivationCode); + this.Controls.Add(this.btnActivate); + this.Controls.Add(this.lnkDownloadCode); + this.Font = new System.Drawing.Font("微软雅黑", 9F); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "ActivationForm"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "下载机器识别码"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + private System.Windows.Forms.Label lblTitle; + private System.Windows.Forms.Label lblDescription; + private System.Windows.Forms.Label lblActivationCode; + private System.Windows.Forms.TextBox txtActivationCode; + private System.Windows.Forms.Button btnActivate; + private System.Windows.Forms.LinkLabel lnkDownloadCode; + } +} \ No newline at end of file diff --git a/CNAS_RunSync/ActivationForm.cs b/CNAS_RunSync/ActivationForm.cs new file mode 100644 index 0000000..d585811 --- /dev/null +++ b/CNAS_RunSync/ActivationForm.cs @@ -0,0 +1,210 @@ +using System; +using System.Text; +using System.Windows.Forms; +using System.Management; +using System.Net.NetworkInformation; +using System.Collections.Generic; +using System.IO; +using System.Configuration; + +namespace CNAS_DBSync +{ + public partial class ActivationForm : Form + { + private const string ACTIVATION_FILE = "activation.config"; + + public bool IsActivated { get; private set; } + + public ActivationForm() + { + InitializeComponent(); + IsActivated = false; + } + + // 检查是否已激活 + public bool CheckActivation() + { + try + { + string activationPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ACTIVATION_FILE); + if (File.Exists(activationPath)) + { + string machineCode = GetMachineCode(); + string savedMachineCode = File.ReadAllText(activationPath); + return machineCode == savedMachineCode; + } + } + catch + { + // 如果读取失败,返回未激活状态 + } + return false; + } + + private void SaveActivation() + { + try + { + string activationPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ACTIVATION_FILE); + File.WriteAllText(activationPath, GetMachineCode()); + } + catch (Exception ex) + { + MessageBox.Show($"保存激活状态失败:{ex.Message}", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + } + + private void btnActivate_Click(object sender, EventArgs e) + { + string activationCode = txtActivationCode.Text.Trim(); + if (string.IsNullOrEmpty(activationCode)) + { + MessageBox.Show("请输入激活码!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); + return; + } + + try + { + if (ValidateActivationCode(activationCode)) + { + IsActivated = true; + SaveActivation(); // 保存激活状态 + this.DialogResult = DialogResult.OK; + this.Close(); + } + else + { + MessageBox.Show("激活码无效!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + catch (Exception ex) + { + MessageBox.Show($"激活失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void lnkDownloadCode_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + try + { + string machineCode = GetMachineCode(); + + // 创建保存文件对话框 + var saveFileDialog = new SaveFileDialog + { + FileName = $"机器码_{DateTime.Now:yyyyMMdd}", + DefaultExt = ".txt", + Filter = "文本文件|*.txt" + }; + + if (saveFileDialog.ShowDialog() == DialogResult.OK) + { + File.WriteAllText(saveFileDialog.FileName, machineCode); + MessageBox.Show("机器码已成功保存!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + catch (Exception ex) + { + MessageBox.Show($"获取机器码失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private string GetMachineCode() + { + StringBuilder machineCode = new StringBuilder(); + + // 获取CPU ID + string cpuId = GetCPUId(); + machineCode.Append(cpuId); + + // 获取所有MAC地址 + List macAddresses = GetMACAddresses(); + foreach (string mac in macAddresses) + { + machineCode.Append("_").Append(mac); + } + + return machineCode.ToString(); + } + + private string GetCPUId() + { + try + { + using (ManagementClass mc = new ManagementClass("Win32_Processor")) + { + ManagementObjectCollection moc = mc.GetInstances(); + foreach (ManagementObject mo in moc) + { + return mo.Properties["ProcessorId"].Value.ToString(); + } + } + } + catch (Exception ex) + { + throw new Exception("获取CPU ID失败: " + ex.Message); + } + return string.Empty; + } + + private List GetMACAddresses() + { + List macAddresses = new List(); + try + { + NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces(); + foreach (NetworkInterface adapter in nics) + { + // 只获取物理网卡的MAC地址 + if (adapter.NetworkInterfaceType == NetworkInterfaceType.Ethernet || + adapter.NetworkInterfaceType == NetworkInterfaceType.Wireless80211) + { + string mac = adapter.GetPhysicalAddress().ToString(); + if (!string.IsNullOrEmpty(mac)) + { + macAddresses.Add(mac); + } + } + } + } + catch (Exception ex) + { + throw new Exception("获取MAC地址失败: " + ex.Message); + } + return macAddresses; + } + + private bool ValidateActivationCode(string activationCode) + { + // 使用实际的机器码来验证 + string machineCode = GetMachineCode(); + return GenerateActivationCode(machineCode) == activationCode; + } + + private string GenerateActivationCode(string machineCode) + { + // 这里实现激活码生成算法 + // 示例:简单的加密算法,实际应用中应该使用更安全的加密方式 + using (var md5 = System.Security.Cryptography.MD5.Create()) + { + // 加入时间戳使得生成的激活码具有时效性 + string input = machineCode + DateTime.Now.ToString("yyyyMMdd"); + byte[] inputBytes = Encoding.UTF8.GetBytes(input); + byte[] hashBytes = md5.ComputeHash(inputBytes); + + // 转换为16进制字符串 + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < hashBytes.Length; i++) + { + sb.Append(hashBytes[i].ToString("X2")); + // 每4个字符添加一个分隔符,提高可读性 + if ((i + 1) % 4 == 0 && i != hashBytes.Length - 1) + { + sb.Append("-"); + } + } + return sb.ToString(); + } + } + } +} \ No newline at end of file diff --git a/CNAS_RunSync/ActivationForm.resx b/CNAS_RunSync/ActivationForm.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/CNAS_RunSync/ActivationForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CNAS_RunSync/CNAS_RunSync.csproj b/CNAS_RunSync/CNAS_RunSync.csproj index 77503e8..1ee73c2 100644 --- a/CNAS_RunSync/CNAS_RunSync.csproj +++ b/CNAS_RunSync/CNAS_RunSync.csproj @@ -52,6 +52,7 @@ + @@ -61,6 +62,12 @@ + + Form + + + ActivationForm.cs + Form @@ -78,6 +85,9 @@ ucSynchrousMain.cs + + ActivationForm.cs + frmSynchrousMain.cs diff --git a/CNAS_RunSync/Program.cs b/CNAS_RunSync/Program.cs index 81fa610..7d119f5 100644 --- a/CNAS_RunSync/Program.cs +++ b/CNAS_RunSync/Program.cs @@ -1,4 +1,5 @@ -using CnasSynchronousCommon; +using CNAS_DBSync; +using CnasSynchronousCommon; using CnasSynchronusClient; using CnasSynchrousModel; using System; @@ -23,7 +24,28 @@ namespace CNAS_RunSync //CheckAvailability(ref strMsg); if (strMsg == "") - Application.Run(new frmSynchrousMain()); + { + // 检查是否已激活 + if (!(new ActivationForm()).CheckActivation()) + { + // 未激活,显示激活窗口 + using (var activationForm = new ActivationForm()) + { + if (activationForm.ShowDialog() == DialogResult.OK) + { + // 激活成功,显示主窗口 + if (new frmOperationPwd().ShowDialog() == DialogResult.OK) + Application.Run(new frmSynchrousMain()); + } + } + } + else + { + // 已激活,直接显示主窗口 + if (new frmOperationPwd().ShowDialog() == DialogResult.OK) + Application.Run(new frmSynchrousMain()); + } + } else MessageBox.Show(strMsg); } diff --git a/CNAS_SyncService/ActivationForm.Designer.cs b/CNAS_SyncService/ActivationForm.Designer.cs new file mode 100644 index 0000000..d85e224 --- /dev/null +++ b/CNAS_SyncService/ActivationForm.Designer.cs @@ -0,0 +1,115 @@ +namespace CNAS_DBSync +{ + partial class ActivationForm + { + private System.ComponentModel.IContainer components = null; + + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + private void InitializeComponent() + { + this.lblTitle = new System.Windows.Forms.Label(); + this.lblDescription = new System.Windows.Forms.Label(); + this.lblActivationCode = new System.Windows.Forms.Label(); + this.txtActivationCode = new System.Windows.Forms.TextBox(); + this.btnActivate = new System.Windows.Forms.Button(); + this.lnkDownloadCode = new System.Windows.Forms.LinkLabel(); + this.SuspendLayout(); + // + // lblTitle + // + this.lblTitle.Location = new System.Drawing.Point(0, 0); + this.lblTitle.Name = "lblTitle"; + this.lblTitle.Size = new System.Drawing.Size(100, 23); + this.lblTitle.TabIndex = 0; + // + // lblDescription + // + this.lblDescription.Font = new System.Drawing.Font("微软雅黑", 10F); + this.lblDescription.ForeColor = System.Drawing.Color.Red; + this.lblDescription.Location = new System.Drawing.Point(20, 60); + this.lblDescription.Name = "lblDescription"; + this.lblDescription.Size = new System.Drawing.Size(560, 40); + this.lblDescription.TabIndex = 1; + this.lblDescription.Text = "请点击上方按钮下载机器识别码,然后将机器识别码发给平台管理员申请授权文件后进行激活,激活后才可正常使用取数仪器客户端。"; + // + // lblActivationCode + // + this.lblActivationCode.AutoSize = true; + this.lblActivationCode.Location = new System.Drawing.Point(20, 120); + this.lblActivationCode.Name = "lblActivationCode"; + this.lblActivationCode.Size = new System.Drawing.Size(69, 20); + this.lblActivationCode.TabIndex = 2; + this.lblActivationCode.Text = "激活码:"; + // + // txtActivationCode + // + this.txtActivationCode.Location = new System.Drawing.Point(20, 140); + this.txtActivationCode.Multiline = true; + this.txtActivationCode.Name = "txtActivationCode"; + this.txtActivationCode.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtActivationCode.Size = new System.Drawing.Size(840, 225); + this.txtActivationCode.TabIndex = 0; + // + // btnActivate + // + this.btnActivate.Location = new System.Drawing.Point(370, 460); + this.btnActivate.Name = "btnActivate"; + this.btnActivate.Size = new System.Drawing.Size(100, 30); + this.btnActivate.TabIndex = 3; + this.btnActivate.Text = "输入激活"; + this.btnActivate.Click += new System.EventHandler(this.btnActivate_Click); + // + // lnkDownloadCode + // + this.lnkDownloadCode.ActiveLinkColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(102)))), ((int)(((byte)(204))))); + this.lnkDownloadCode.AutoSize = true; + this.lnkDownloadCode.Font = new System.Drawing.Font("微软雅黑", 10F); + this.lnkDownloadCode.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline; + this.lnkDownloadCode.LinkColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(102)))), ((int)(((byte)(204))))); + this.lnkDownloadCode.Location = new System.Drawing.Point(20, 23); + this.lnkDownloadCode.Name = "lnkDownloadCode"; + this.lnkDownloadCode.Size = new System.Drawing.Size(129, 23); + this.lnkDownloadCode.TabIndex = 4; + this.lnkDownloadCode.TabStop = true; + this.lnkDownloadCode.Text = "下载机器识别码"; + this.lnkDownloadCode.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnkDownloadCode_LinkClicked); + // + // ActivationForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(909, 563); + this.Controls.Add(this.lblTitle); + this.Controls.Add(this.lblDescription); + this.Controls.Add(this.lblActivationCode); + this.Controls.Add(this.txtActivationCode); + this.Controls.Add(this.btnActivate); + this.Controls.Add(this.lnkDownloadCode); + this.Font = new System.Drawing.Font("微软雅黑", 9F); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "ActivationForm"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "下载机器识别码"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + private System.Windows.Forms.Label lblTitle; + private System.Windows.Forms.Label lblDescription; + private System.Windows.Forms.Label lblActivationCode; + private System.Windows.Forms.TextBox txtActivationCode; + private System.Windows.Forms.Button btnActivate; + private System.Windows.Forms.LinkLabel lnkDownloadCode; + } +} \ No newline at end of file diff --git a/CNAS_SyncService/ActivationForm.cs b/CNAS_SyncService/ActivationForm.cs new file mode 100644 index 0000000..d585811 --- /dev/null +++ b/CNAS_SyncService/ActivationForm.cs @@ -0,0 +1,210 @@ +using System; +using System.Text; +using System.Windows.Forms; +using System.Management; +using System.Net.NetworkInformation; +using System.Collections.Generic; +using System.IO; +using System.Configuration; + +namespace CNAS_DBSync +{ + public partial class ActivationForm : Form + { + private const string ACTIVATION_FILE = "activation.config"; + + public bool IsActivated { get; private set; } + + public ActivationForm() + { + InitializeComponent(); + IsActivated = false; + } + + // 检查是否已激活 + public bool CheckActivation() + { + try + { + string activationPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ACTIVATION_FILE); + if (File.Exists(activationPath)) + { + string machineCode = GetMachineCode(); + string savedMachineCode = File.ReadAllText(activationPath); + return machineCode == savedMachineCode; + } + } + catch + { + // 如果读取失败,返回未激活状态 + } + return false; + } + + private void SaveActivation() + { + try + { + string activationPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ACTIVATION_FILE); + File.WriteAllText(activationPath, GetMachineCode()); + } + catch (Exception ex) + { + MessageBox.Show($"保存激活状态失败:{ex.Message}", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + } + + private void btnActivate_Click(object sender, EventArgs e) + { + string activationCode = txtActivationCode.Text.Trim(); + if (string.IsNullOrEmpty(activationCode)) + { + MessageBox.Show("请输入激活码!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); + return; + } + + try + { + if (ValidateActivationCode(activationCode)) + { + IsActivated = true; + SaveActivation(); // 保存激活状态 + this.DialogResult = DialogResult.OK; + this.Close(); + } + else + { + MessageBox.Show("激活码无效!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + catch (Exception ex) + { + MessageBox.Show($"激活失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void lnkDownloadCode_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + try + { + string machineCode = GetMachineCode(); + + // 创建保存文件对话框 + var saveFileDialog = new SaveFileDialog + { + FileName = $"机器码_{DateTime.Now:yyyyMMdd}", + DefaultExt = ".txt", + Filter = "文本文件|*.txt" + }; + + if (saveFileDialog.ShowDialog() == DialogResult.OK) + { + File.WriteAllText(saveFileDialog.FileName, machineCode); + MessageBox.Show("机器码已成功保存!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + catch (Exception ex) + { + MessageBox.Show($"获取机器码失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private string GetMachineCode() + { + StringBuilder machineCode = new StringBuilder(); + + // 获取CPU ID + string cpuId = GetCPUId(); + machineCode.Append(cpuId); + + // 获取所有MAC地址 + List macAddresses = GetMACAddresses(); + foreach (string mac in macAddresses) + { + machineCode.Append("_").Append(mac); + } + + return machineCode.ToString(); + } + + private string GetCPUId() + { + try + { + using (ManagementClass mc = new ManagementClass("Win32_Processor")) + { + ManagementObjectCollection moc = mc.GetInstances(); + foreach (ManagementObject mo in moc) + { + return mo.Properties["ProcessorId"].Value.ToString(); + } + } + } + catch (Exception ex) + { + throw new Exception("获取CPU ID失败: " + ex.Message); + } + return string.Empty; + } + + private List GetMACAddresses() + { + List macAddresses = new List(); + try + { + NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces(); + foreach (NetworkInterface adapter in nics) + { + // 只获取物理网卡的MAC地址 + if (adapter.NetworkInterfaceType == NetworkInterfaceType.Ethernet || + adapter.NetworkInterfaceType == NetworkInterfaceType.Wireless80211) + { + string mac = adapter.GetPhysicalAddress().ToString(); + if (!string.IsNullOrEmpty(mac)) + { + macAddresses.Add(mac); + } + } + } + } + catch (Exception ex) + { + throw new Exception("获取MAC地址失败: " + ex.Message); + } + return macAddresses; + } + + private bool ValidateActivationCode(string activationCode) + { + // 使用实际的机器码来验证 + string machineCode = GetMachineCode(); + return GenerateActivationCode(machineCode) == activationCode; + } + + private string GenerateActivationCode(string machineCode) + { + // 这里实现激活码生成算法 + // 示例:简单的加密算法,实际应用中应该使用更安全的加密方式 + using (var md5 = System.Security.Cryptography.MD5.Create()) + { + // 加入时间戳使得生成的激活码具有时效性 + string input = machineCode + DateTime.Now.ToString("yyyyMMdd"); + byte[] inputBytes = Encoding.UTF8.GetBytes(input); + byte[] hashBytes = md5.ComputeHash(inputBytes); + + // 转换为16进制字符串 + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < hashBytes.Length; i++) + { + sb.Append(hashBytes[i].ToString("X2")); + // 每4个字符添加一个分隔符,提高可读性 + if ((i + 1) % 4 == 0 && i != hashBytes.Length - 1) + { + sb.Append("-"); + } + } + return sb.ToString(); + } + } + } +} \ No newline at end of file diff --git a/CNAS_SyncService/ActivationForm.resx b/CNAS_SyncService/ActivationForm.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/CNAS_SyncService/ActivationForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/CNAS_SyncService/CNAS_SyncService.csproj b/CNAS_SyncService/CNAS_SyncService.csproj index 4ffd40e..abde1f8 100644 --- a/CNAS_SyncService/CNAS_SyncService.csproj +++ b/CNAS_SyncService/CNAS_SyncService.csproj @@ -56,6 +56,12 @@ + + Form + + + ActivationForm.cs + @@ -81,6 +87,9 @@ + + ActivationForm.cs + ProjectInstaller.cs diff --git a/dll/CNAS_RunSync.exe b/dll/CNAS_RunSync.exe index 9d156c564896a5f7588fa2be3242702bcf087d49..aad0d94e9fbd96f7f660d4431ac26ac81eac8124 100644 GIT binary patch delta 15109 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 XO}gzLgohHMd(P?f9QaDK53>9pF~4Lr delta 9573 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 diff --git a/dll/CNAS_SyncService.exe b/dll/CNAS_SyncService.exe index 3546db37caafa72a26c64ba5fc2fb16d073d4395..37a1c44ee9abbb953a965598765167c021a367ca 100644 GIT binary patch delta 10978 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 delta 4717 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