Inno Setup安装程序为何无法正确处理Windows10中的网络驱动器?
解决Inno Setup无法访问网络驱动器的问题
方案1:避免UAC权限提升(适用于无需管理员权限的安装)
在Inno Setup脚本的[Setup]段添加配置:
PrivilegesRequired=none
安装程序将以普通用户权限运行,可正常访问已映射的网络驱动器(如S:)。
方案2:保留管理员权限同时显示网络驱动器
若安装必须使用管理员权限,可通过以下两种方式处理:
- 方式A:加载用户网络驱动器映射
在脚本的[Code]段添加代码,让特权会话加载当前用户的网络驱动器映射:function InitializeSetup(): Boolean; var Token: THandle; Elevated: Boolean; ResultStr: array[0..255] of Char; begin Result := True; if OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, Token) then begin GetTokenInformation(Token, TokenElevation, @Elevated, SizeOf(Elevated), nil); CloseHandle(Token); if Elevated then begin ExpandEnvironmentStrings('%USERPROFILE%', ResultStr, 255); if LoadUserProfileFromPath(ResultStr) then begin SHChangeNotify(SHCNE_DRIVEADD, SHCNF_IDLIST, nil, nil); end; end; end; end; - 方式B:调用系统Shell文件对话框
在[Code]段自定义文件选择逻辑,使用系统原生对话框替代Inno自带控件,原生对话框可正常识别网络驱动器:
在需要文件选择的交互环节,调用此函数替代默认的文件选择控件即可。function BrowseForNetworkFile(): String; var OpenDialog: TFileOpenDialog; FileName: PWideChar; begin Result := ''; OpenDialog := TFileOpenDialog.Create(nil); try OpenDialog.Options := OpenDialog.Options + [fdoPickFiles]; if OpenDialog.Execute then begin OpenDialog.GetResult(FileName); Result := WideCharToString(FileName); CoTaskMemFree(FileName); end; finally OpenDialog.Free; end; end;
方案3:使用UNC路径直接访问
若上述方案无效,可引导用户直接输入网络共享的UNC路径(如\\server\shared_folder),Inno Setup的文件对话框支持直接识别并访问这类路径。
内容的提问来源于stack exchange,提问作者user8105480
相关产品推荐
相关产品推荐

