C#调用PowerShell加载System.Drawing时出现Amsi.dll入口点异常
问题与解决思路
问题背景
原本可正常执行PowerShell脚本的C#应用,代码如下:
using (PowerShell powerShell = PowerShell.Create()) { powerShell.AddScript(@"D:\C.ps1"); Collection<PSObject> output = powerShell.Invoke(); }
仅在脚本顶部添加一行加载System.Drawing程序集的代码后:
[void][System.Reflection.Assembly]::Load('System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a')
运行C#应用立即抛出异常:
System.Exception {System.EntryPointNotFoundException} Unable to find an entry point named 'AmsiNotifyOperation' in DLL 'amsi.dll'
该脚本在PowerShell ISE、命令行中运行无异常,使用的NuGet包为System.Management.Automation和Microsoft.PowerShell.SDK,堆栈信息:
Source "System.Management.Automation" at System.Management.Automation.AmsiUtils.AmsiNativeMethods.AmsiNotifyOperation(IntPtr amsiContext, IntPtr buffer, UInt32 length, String contentName, AMSI_RESULT& result) at System.Management.Automation.AmsiUtils.WinReportContent(String name, String content) TargetSite {Int32 AmsiNotifyOperation(IntPtr, IntPtr, UInt32, System.String, AMSI_RESULT ByRef)}
解决思路
- 检查AMSI版本兼容性:
AmsiNotifyOperation是较新版本AMSI(Antimalware Scan Interface)的API,若C#应用运行环境中的amsi.dll版本过低,会不支持该接口。而PowerShell ISE/命令行使用系统自带PowerShell环境对应的amsi.dll版本通常更高。可尝试将应用部署到Windows 10 1709及以上版本系统测试,或更新系统的AMSI组件。 - 替换System.Drawing加载方式:避免直接调用
[System.Reflection.Assembly]::Load,改用PowerShell内置的Add-Type命令加载,可能绕过AMSI触发的异常。修改脚本顶部代码为:Add-Type -AssemblyName System.Drawing - 检查NuGet包版本匹配性:确认
System.Management.Automation和Microsoft.PowerShell.SDK的版本是否与目标系统的PowerShell版本兼容。比如系统是PowerShell 5.1,但NuGet包用了PowerShell 7.x版本,可能引发兼容性问题,尝试降级或升级NuGet包到匹配版本。 - 测试环境下临时禁用AMSI扫描:仅限测试场景使用,生产环境禁用AMSI会带来安全风险。可在C#代码中添加脚本禁用AMSI会话:
using (PowerShell powerShell = PowerShell.Create()) { // 测试用:禁用AMSI扫描 powerShell.AddScript(@" $type = [System.Management.Automation.AmsiUtils] $field = $type.GetField('amsiSession', [Reflection.BindingFlags]::Static -bor [Reflection.BindingFlags]::NonPublic) $field.SetValue($null, [IntPtr]::Zero) "); powerShell.AddScript(@"D:\C.ps1"); Collection<PSObject> output = powerShell.Invoke(); } - 验证应用运行权限:尝试以管理员身份运行C#应用,排查是否因权限不足导致AMSI组件调用异常。
内容的提问来源于stack exchange,提问作者K. Carter Sr.
相关产品推荐
相关产品推荐

