如何使用NSIS和NSSM配置程序开机以管理员身份自动运行
解决方案
通过NSIS自定义交互页收集管理员凭据,再调用NSSM命令行参数直接配置服务登录身份即可实现全自动化,无需用户手动操作服务面板。
1. NSIS脚本新增凭据收集页面
使用NSIS自带的nsDialogs插件自定义安装页面,接收用户输入的管理员账号和密码,密码输入框默认隐藏明文:
!include nsDialogs.nsh !include LogicLib.nsh ; 定义存储凭据的变量 Var AdminUsername Var AdminPassword ; 插入自定义页面到安装流程中,可放在安装步骤之前或服务注册步骤之前 Page custom nsDialogs_CreateCredPage nsDialogs_LeaveCredPage Function nsDialogs_CreateCredPage nsDialogs::Create 1018 Pop $0 ${If} $0 == error Abort ${EndIf} ; 用户名输入项 ${NSD_CreateLabel} 0 0 100% 12u "请输入具有管理员权限的账号(本地账号格式为.\用户名,域账号为域名\用户名):" Pop $0 ${NSD_CreateText} 0 13u 100% 12u "$UserName" ; 默认填入当前用户,可修改 Pop $AdminUsername ; 密码输入项 ${NSD_CreateLabel} 0 30u 100% 12u "请输入对应账号的密码:" Pop $0 ${NSD_CreatePassword} 0 43u 100% 12u "" Pop $AdminPassword nsDialogs::Show FunctionEnd Function nsDialogs_LeaveCredPage ; 读取用户输入的内容 ${NSD_GetText} $AdminUsername $AdminUsername ${NSD_GetText} $AdminPassword $AdminPassword ; 非空校验,可根据需求添加账号格式校验 ${If} $AdminUsername == "" MessageBox MB_OK "管理员账号不能为空" Abort ${EndIf} ${If} $AdminPassword == "" MessageBox MB_OK "账号密码不能为空" Abort ${EndIf} FunctionEnd
记得在NSIS脚本头部添加RequestExecutionLevel admin,确保安装包本身有足够权限修改服务配置。
2. 调用NSSM配置服务登录身份
在你原有调用NSSM注册服务的逻辑后,追加以下命令配置服务的登录身份,将<你的服务名>替换为实际的服务名称:
; 配置服务以用户输入的管理员身份运行 ExecWait '"$INSTDIR\nssm.exe" set <你的服务名> ObjectName "$AdminUsername" "$AdminPassword"' $0 ; 可选:校验配置是否成功,返回值为0代表配置成功 ${If} $0 <> 0 MessageBox MB_OK "管理员凭据配置失败,请检查账号密码是否正确" Abort ${EndIf} ; 后续可以正常启动服务 ExecWait '"$INSTDIR\nssm.exe" start <你的服务名>'
注意事项
- 若使用本地内置管理员账号,用户名为
.\Administrator的情况下,需确保该账号已启用且未被禁用 - 域环境下账号格式需填写完整的
域名\用户名,否则会识别为本地账号导致配置失败
内容的提问来源于stack exchange,提问作者castro
相关产品推荐
相关产品推荐

