.NET 3.1 WPF应用发布后无法通过System.IO启动ERP快捷方式
背景
基于.NET 3.1开发的WPF应用,部署在公司自助终端电脑上,用于启动通过Microsoft Remote Desktop Client(MSRDC)运行的ERP系统及其他工具。此前通过System.IO.Directory查找MSRDC创建的ERP快捷方式,设置Process.StartInfo.UseShellExecute = true来支持.lnk文件启动,该方案稳定运行6个月。
现象
仅修改应用背景图片并发布后,启动ERP的逻辑进入catch分支:MSRDCW客户端弹出,但用户需额外点击按钮才能登录ERP。调试时功能完全正常,仅发布部署后出现该问题。
代码实现
try { string upath = @"C:\Users\"; string[] dirs = Directory.GetDirectories(upath, "kiosk*", SearchOption.TopDirectoryOnly); string[] timsdirs = Directory.GetDirectories($@"{dirs[0]}\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\", "*timsv8*", SearchOption.TopDirectoryOnly); string[] timsfiles = Directory.GetFiles($@"{timsdirs[0]}", "*timsv8*", SearchOption.TopDirectoryOnly); Console.WriteLine("The number of directories within Users is {0}.", dirs.Length); Console.WriteLine(timsfiles[0]); Process process = new Process(); process.StartInfo.UseShellExecute = true; process.StartInfo.FileName = timsfiles[0]; process.Start(); } //Launches MSRDCW in the event that TIMS .lnk file cannot launch catch (Exception) { Process.Start(@"C:\Program Files\Remote Desktop\msrdcw.exe"); }
排查与解决思路
权限差异问题
调试时使用的开发账户权限较高,发布后应用可能以终端的kiosk账户运行,该账户对C:\Users\kiosk*\AppData\Roaming路径的读取权限可能被变更。检查kiosk账户的路径读取权限,或在代码中添加权限检查日志,确认是否因权限导致目录/文件查找失败。路径查找的不确定性
代码直接取数组第一个匹配项,若发布环境存在多个kiosk*或*timsv8*匹配项,会取到错误的快捷方式触发异常。优化筛选条件(比如指定快捷方式的完整名称),或添加日志记录所有匹配的目录/文件内容,确认是否存在多匹配项。ShellExecute环境差异
调试时ShellExecute的上下文是开发环境的桌面,发布后应用可能以非交互式桌面运行,导致.lnk文件无法正常解析。尝试将UseShellExecute设为false,用cmd.exe /c 快捷方式路径启动;或用Shell32等方法解析.lnk的目标路径,直接启动目标程序而非快捷方式。发布包意外变更
虽仅修改背景图,但发布过程中可能误操作导致应用的配置文件、依赖项或运行身份设置变更。对比发布前后的应用包内容,确认除背景图外无其他变更;检查发布配置(如ClickOnce、部署脚本),确保运行身份、权限配置与之前一致。
内容的提问来源于stack exchange,提问作者Chad Thweatt

