You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 06:02:12