如何为VB.NET开发的软件制作含注册功能的setup.exe安装程序?
在VB.NET软件安装过程中让用户设置专属登录账号的实现方案
一、通过Visual Studio安装项目创建自定义注册界面
- 先给Visual Studio安装「Microsoft Visual Studio Installer Projects」扩展(VS2019及以后版本需要手动安装),然后创建一个安装项目。
- 右键安装项目 → 添加 → 对话框,选择「用户注册」对话框(或自定义对话框),添加用户名输入框、密码输入框和确认密码输入框,确保输入框的属性名(如
USERNAME、PASSWORD)可识别。 - 在对话框的属性中,设置
CustomActionData参数,把用户输入的账号密码传递给后续动作,格式为:/Username="[USERNAME]" /Password="[PASSWORD]"(方括号里的是输入框的属性名)。
二、编写自定义安装动作(VB.NET类库)
- 创建一个VB.NET类库项目,添加
System.Configuration.Install引用。 - 编写继承自
Installer的类,重写Install方法,获取安装参数中的账号密码,加密后保存到安全位置(推荐注册表,也可选择加密的配置文件)。示例代码:
Imports System.Configuration.Install Imports System.ComponentModel Imports System.Security.Cryptography Imports System.Text Imports Microsoft.Win32 <RunInstaller(True)> Public Class CustomInstaller Inherits Installer Public Overrides Sub Install(savedState As System.Collections.IDictionary) MyBase.Install(savedState) ' 读取安装时用户输入的账号密码 Dim inputUsername = Me.Context.Parameters("Username") Dim inputPassword = Me.Context.Parameters("Password") ' 加密密码(示例用AES,实际可根据需求换更安全的加密方式) Dim encryptedPwd = EncryptPassword(inputPassword, "YourUniqueKey") ' 保存到注册表(HKCU对当前用户有效,HKLM需要管理员权限) Using regKey = Registry.CurrentUser.CreateSubKey("Software\YourAppID\AuthInfo") regKey.SetValue("Username", inputUsername) regKey.SetValue("EncryptedPwd", encryptedPwd) End Using End Sub ' AES加密方法示例 Private Function EncryptPassword(rawPwd As String, key As String) As String Using aes = Aes.Create() aes.Key = Encoding.UTF8.GetBytes(key.PadRight(32).Substring(0, 32)) aes.IV = Encoding.UTF8.GetBytes(key.PadRight(16).Substring(0, 16)) Dim encryptor = aes.CreateEncryptor(aes.Key, aes.IV) Using ms = New System.IO.MemoryStream() Using cs = New CryptoStream(ms, encryptor, CryptoStreamMode.Write) Using sw = New System.IO.StreamWriter(cs) sw.Write(rawPwd) End Using Return Convert.ToBase64String(ms.ToArray()) End Using End Using End Using End Function End Class
- 编译类库后,回到安装项目,右键 → 视图 → 自定义动作,在「安装」节点右键添加自定义动作,选择类库的输出文件。
三、登录页面的验证逻辑
在软件的登录页面,读取注册表中保存的账号和加密密码,对用户输入的密码做相同加密后比对验证。示例代码:
Imports System.Security.Cryptography Imports System.Text Imports Microsoft.Win32 Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click Dim inputUser = txtUsername.Text.Trim() Dim inputPwd = txtPassword.Text.Trim() ' 从注册表读取保存的认证信息 Using regKey = Registry.CurrentUser.OpenSubKey("Software\YourAppID\AuthInfo") If regKey Is Nothing Then MessageBox.Show("未检测到注册信息,请重新安装软件") Return End If Dim savedUser = regKey.GetValue("Username").ToString() Dim savedEncryptedPwd = regKey.GetValue("EncryptedPwd").ToString() Dim inputEncryptedPwd = EncryptPassword(inputPwd, "YourUniqueKey") ' 验证账号密码 If inputUser = savedUser AndAlso inputEncryptedPwd = savedEncryptedPwd Then MainForm.Show() Me.Hide() Else MessageBox.Show("用户名或密码错误") End If End Using End Sub ' 和安装时一致的加密方法 Private Function EncryptPassword(rawPwd As String, key As String) As String Using aes = Aes.Create() aes.Key = Encoding.UTF8.GetBytes(key.PadRight(32).Substring(0, 32)) aes.IV = Encoding.UTF8.GetBytes(key.PadRight(16).Substring(0, 16)) Dim encryptor = aes.CreateEncryptor(aes.Key, aes.IV) Using ms = New System.IO.MemoryStream() Using cs = New CryptoStream(ms, encryptor, CryptoStreamMode.Write) Using sw = New System.IO.StreamWriter(cs) sw.Write(rawPwd) End Using Return Convert.ToBase64String(ms.ToArray()) End Using End Using End Using End Function
四、关键注意事项
- 加密密钥不要硬编码,可结合机器硬件特征(如CPU ID、硬盘序列号)生成,避免密钥泄露后密码被破解。
- 若选择HKLM注册表路径,安装程序需要管理员权限运行;HKCU路径则仅对当前用户生效,无需管理员权限。
- 安装对话框要添加输入校验:比如用户名不能为空、两次密码输入一致等,提升用户体验。
- 如果用ClickOnce部署,无法使用自定义安装动作,可改为软件首次启动时引导用户设置账号密码。
内容的提问来源于stack exchange,提问作者seenchan
相关产品推荐
相关产品推荐

