PowerShell中无法加载WinSCP程序集:依赖项缺失问题求助
WinSCPnet.dll加载失败(HRESULT: 0x80131515)问题排查与解决
错误信息
Add-Type : Could not load file or assembly 'file://\\~removed~\dfs\Repo\Scripts\ScheduledTasks\~removed~\WinSCP-Automation\WinSCPnet.dll' or one of its dependencies. Operation is not supported. (Exception from HRESULT: 0x80131515) At \\~removed~\dfs\Repo\Scripts\ScheduledTasks\~removed~\Start-Upload.ps1:19 char:1 + Add-Type -Path (Join-Path $env:WINSCP_PATH "WinSCPnet.dll") + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [Add-Type], FileLoadException + FullyQualifiedErrorId : System.IO.FileLoadException,Microsoft.PowerShell.Commands.AddTypeCommand
问题代码片段
#Dependencies $Path = '\\redacted\dfs\Repo\Scripts\ScheduledTasks\redacted' Set-Location -Path $Path $env:WINSCP_PATH = '.\WinSCP-Automation' Add-Type -Path (Join-Path $env:WINSCP_PATH "WinSCPnet.dll")
问题背景
脚本用于通过任务计划程序执行WinSCP上传,在Windows Server 2012 R2运行正常,迁移到Windows Server 2019后出现上述错误。已尝试以下操作但未解决:
- 使用UNC路径下的最新WinSCP程序集
- 从本地目录加载DLL
- 安装Windows Server 2012 R2同款VS C++ Redistributable
- 确认.NET Framework版本匹配
- 解除所有DLL及WinSCP文件的阻止状态
- 使用现代依赖检测工具确认依赖齐全
- 尝试不同版本的WinSCPnet.dll及GC操作
- 两台服务器均使用PowerShell 5.1,且已安装WinSCP PowerShell模块
针对性解决方案
1. 替换Add-Type为UnsafeLoadFrom绕过CAS限制
Windows Server 2019默认禁用了.NET Framework的代码访问安全(CAS)策略,Add-Type对远程资源(UNC路径)的加载限制更严格。可改用UnsafeLoadFrom方法加载程序集:
$dllPath = Join-Path $env:WINSCP_PATH "WinSCPnet.dll" [System.Reflection.Assembly]::UnsafeLoadFrom($dllPath)
此方法跳过部分安全检查,仅适合信任的内部资源场景。
2. 检查任务计划程序的执行配置
- 确保任务计划的执行账户拥有对UNC路径的完全控制权限,且勾选「以最高权限运行」选项。
- 避免使用「不存储密码,用户必须登录才能运行」的配置,该模式下网络资源访问可能受限制。
3. 启用.NET Framework 3.5(若WinSCPnet.dll依赖)
部分旧版WinSCPnet.dll编译目标为.NET Framework 3.5,而Windows Server 2019默认未启用该组件:
- 打开服务器管理器 → 添加角色和功能
- 找到「.NET Framework 3.5 功能」,勾选包括「HTTP Activation」在内的子组件
- 完成安装后重启服务器测试
4. 禁用IE增强安全配置(IE ESC)
Windows Server 2019默认启用的IE ESC会影响系统对远程资源的信任度:
- 打开服务器管理器 → 本地服务器 → IE增强安全配置
- 管理员和用户均设置为「关闭」,测试是否解决加载问题
5. 复制WinSCP组件到本地系统目录
将WinSCPnet.dll、WinSCP.exe及相关依赖文件复制到本地目录(如C:\Program Files\WinSCP),修改脚本使用本地路径加载:
$env:WINSCP_PATH = "C:\Program Files\WinSCP" Add-Type -Path (Join-Path $env:WINSCP_PATH "WinSCPnet.dll")
此方法彻底规避UNC路径的安全限制问题。
内容的提问来源于stack exchange,提问作者Evan Thomas-Broughton
相关产品推荐
相关产品推荐

