如何给Winform应用添加唯一标识,使每份安装副本均可单独识别?
WinForm 唯一实例ID绑定最简实现方案
这个需求完全基于C#/.NET 内置API实现,无需引入第三方依赖,新手也能快速落地,不需要每次分发改源码,编译一次就可以给所有设备安装使用:
实现步骤
第一步:配置内置存储项
用.NET 自带的 Settings 配置体系做持久化存储,不需要自己写文件读写逻辑,不会出现权限、路径兼容问题:
- 右键你的项目 → 选择「属性」 → 切换到「设置」标签页
- 新建2个用户级配置项:
- 名称:
UniqueInstanceId,类型:string,范围:用户,默认值留空 - 名称:
IdCheckHash,类型:string,范围:用户,默认值留空
- 名称:
第二步:新增ID输入窗口
新建一个最简WinForm作为输入弹窗,只需要放3个控件:
- 提示文字Label:显示「请输入分配的唯一编号」
- 输入文本框:用于填写编号
- 确认按钮:点击时将窗体的
DialogResult属性设置为DialogResult.OK即可,可选加二次输入校验避免填错
第三步:主窗体加载逻辑
在主窗体的Form_Load事件中加入如下逻辑,直接复制即可用:
private void MainForm_Load(object sender, EventArgs e) { // 自定义固定盐值,不要对外泄露 const string CHECK_SALT = "custom_salt_20240601"; // 判断是否已经存储过有效ID if (!string.IsNullOrEmpty(Properties.Settings.Default.UniqueInstanceId)) { // 校验哈希,防止用户私自修改配置 var computeHash = BitConverter.ToString( System.Security.Cryptography.MD5.Create().ComputeHash( System.Text.Encoding.UTF8.GetBytes(Properties.Settings.Default.UniqueInstanceId + CHECK_SALT) ) ).Replace("-", ""); if (computeHash == Properties.Settings.Default.IdCheckHash) { // 校验通过,直接显示ID到图片上方的Label idDisplayLabel.Text = Properties.Settings.Default.UniqueInstanceId; return; } // 校验失败说明配置被篡改,直接退出 MessageBox.Show("配置异常,程序退出"); Application.Exit(); } // 首次启动弹出输入窗口 using (var inputForm = new IdInputForm()) { if (inputForm.ShowDialog() == DialogResult.OK) { var inputId = inputForm.txtInputId.Text.Trim(); if (string.IsNullOrEmpty(inputId)) { MessageBox.Show("编号不能为空"); Application.Exit(); return; } // 存储ID和校验哈希 Properties.Settings.Default.UniqueInstanceId = inputId; Properties.Settings.Default.IdCheckHash = BitConverter.ToString( System.Security.Cryptography.MD5.Create().ComputeHash( System.Text.Encoding.UTF8.GetBytes(inputId + CHECK_SALT) ) ).Replace("-", ""); Properties.Settings.Default.Save(); // 显示ID idDisplayLabel.Text = inputId; } else { // 未输入ID不允许启动 Application.Exit(); } } }
效果说明
完全符合你的全部需求:
- 首次运行自动弹出输入窗口,填入提前准备好的编号即可
- 编号存储在系统用户目录的隐藏配置文件夹中,重启系统、重装应用都不会丢失
- 普通用户找不到配置文件路径,就算找到修改后哈希校验不通过也无法启动程序,无法私自修改编号
- 整套逻辑只需要写一次源码,编译后的安装包可以分发给所有设备使用,不需要为每个设备单独改代码编译
内容的提问来源于stack exchange,提问作者CrankHybrid
相关产品推荐
相关产品推荐

