如何追踪WPF应用的卸载操作及卸载发起用户?
实现NSIS卸载WPF应用的追踪及用户身份识别
核心思路
利用NSIS的卸载脚本扩展能力,在卸载流程最前端插入自定义追踪逻辑,同时获取当前执行卸载操作的用户信息,再调用你的API上报数据。
具体实现步骤
1. 修改NSIS卸载脚本,添加追踪逻辑
无论你用NSIS快速生成器还是手动编写脚本,都可以在卸载初始化阶段加入以下代码,先获取关键信息再调用追踪API:
示例NSIS代码:
; 卸载初始化函数,卸载启动时自动执行 Function un.onInit ; 获取当前登录用户名 StrCpy $User "" GetUserName $User ; 获取设备名称 StrCpy $Machine "" GetComputerName $Machine ; 获取卸载时间(格式:YYYY-MM-DD HH:MM:SS) StrCpy $UninstallTime "" GetDateTime $UninstallTime "%Y-%m-%d %H:%M:%S" ; 调用追踪逻辑:两种可选方式 ; 方式1:用curl直接调用API(需提前把curl打包到安装目录) nsExec::Exec '"$INSTDIR\curl.exe" -X POST "https://your-tracking-api.com/report" -d "action=uninstall&user=$User&machine=$Machine&time=$UninstallTime"' ; 方式2:调用WPF应用的命令行模式(需在应用中添加参数处理逻辑,快速执行后退出) ; nsExec::Exec '"$INSTDIR\YourWpfApp.exe" --track-uninstall --user="$User" --machine="$Machine" --time="$UninstallTime"' FunctionEnd
2. 适配WPF单文件应用的特殊情况
由于你的WPF应用是单文件自解压发布,卸载时安装目录文件会被逐步删除,需注意:
- 把追踪依赖工具(如curl、迷你追踪程序)单独放在安装目录,且在卸载脚本中先执行追踪逻辑,再启动文件删除流程
- 如果让WPF应用处理追踪命令,要确保应用能快速启动、处理参数后立即退出,不要加载完整WPF界面,避免拖慢卸载速度
3. 获取更精准的用户身份信息
如果需要域用户或完整用户标识,可使用NSIS的UserInfo插件扩展:
; 加载UserInfo插件 !include "UserInfo.nsh" Function un.onInit ; 获取完整用户标识(域\用户名) UserInfo::GetName $FullUser Pop $FullUser ; 上报时使用$FullUser作为用户标识 nsExec::Exec '"$INSTDIR\curl.exe" -X POST "https://your-tracking-api.com/report" -d "action=uninstall&fulluser=$FullUser&machine=$Machine&time=$UninstallTime"' FunctionEnd
4. 避免阻塞卸载流程
如果API调用可能耗时,建议用异步方式执行,让追踪逻辑在后台运行,不影响卸载:
ExecShell "" '"$INSTDIR\curl.exe" -X POST "https://your-tracking-api.com/report" -d "..."'
注意事项
- 确保追踪工具和NSIS脚本的权限匹配:若应用以管理员权限安装,卸载时也会以管理员权限运行,API调用需处理好权限问题
- 追踪逻辑中不要弹出任何UI窗口,避免干扰用户卸载操作
- 测试覆盖所有场景:普通用户卸载、管理员卸载、控制面板卸载、桌面图标卸载,确保所有场景下追踪逻辑都能触发
内容的提问来源于stack exchange,提问作者May Nguyen
相关产品推荐
相关产品推荐

