Inno Setup实现安装目录自动添加Windows Defender白名单方案咨询
解决方案
一、PowerShell白名单添加脚本
要将指定目录加入Windows Defender排除列表,可使用以下PowerShell命令(已处理重复添加场景,避免报错):
$targetPath = "{0}" $existingExclusions = Get-MpPreference | Select-Object -ExpandProperty ExclusionPath -ErrorAction SilentlyContinue if ($existingExclusions -notcontains $targetPath) { Add-MpPreference -ExclusionPath $targetPath }
后续Inno Setup会自动将{0}替换为用户选定的安装目录。
二、Inno Setup集成与执行时机控制
1. 配置管理员权限
修改[Setup]段,确保安装程序以管理员身份运行(修改Defender排除列表需要该权限):
[Setup] PrivilegesRequired=admin
2. 在代码段实现流程控制
在[Code]段中,通过NextButtonClick事件拦截用户选择安装目录后的下一步操作,先创建目标目录,再执行PowerShell脚本添加白名单:
[Code] function NextButtonClick(CurPageID: Integer): Boolean; var InstallPath: String; PowerShellCmd: String; ExitCode: Integer; begin Result := True; // 拦截选择目录页的下一步操作 if CurPageID = wpSelectDir then begin // 获取用户选定的安装目录 InstallPath := WizardDirValue; // 提前创建目标目录(若不存在) if not DirExists(InstallPath) then CreateDir(InstallPath); // 构造PowerShell执行命令,隐藏窗口并绕过执行策略 PowerShellCmd := Format( '-ExecutionPolicy Bypass -WindowStyle Hidden -Command "$targetPath = ''%s''; $existingExclusions = Get-MpPreference | Select-Object -ExpandProperty ExclusionPath -ErrorAction SilentlyContinue; if ($existingExclusions -notcontains $targetPath) { Add-MpPreference -ExclusionPath $targetPath }"', [InstallPath] ); // 执行PowerShell命令并处理结果 if not Exec('powershell.exe', PowerShellCmd, '', SW_HIDE, ewWaitUntilTerminated, ExitCode) then begin MsgBox('添加Defender白名单失败:无法启动PowerShell。', mbError, MB_OK); Result := False; end else if ExitCode <> 0 then begin MsgBox(Format('添加Defender白名单失败,错误代码:%d。', [ExitCode]), mbError, MB_OK); Result := False; end; end; end;
3. 关键说明
- 执行时机:用户在「选择安装目录」页点击下一步后,会优先完成目录创建和白名单添加,再进入后续文件复制环节。
- 权限要求:必须以管理员身份运行安装程序,否则
Add-MpPreference命令会因权限不足执行失败。 - 兼容性:此逻辑仅适用于Windows 10及以上版本的Windows Defender,若用户使用第三方杀毒软件,该白名单设置无效。
内容的提问来源于stack exchange,提问作者John Titor
相关产品推荐
相关产品推荐

