调用PowerShell操作AD时System.Management.Automation.dll加载异常求助
问题:.NET调用PowerShell添加AD用户时触发System.TypeInitializationException,提示找不到已存在的System.Management.Automation.dll
问题详情
内网新用户注册后台通过PowerShell脚本将用户添加至Active Directory,该功能此前长期正常运行,7月5日至21日期间突然失效。调试时触发System.TypeInitializationException异常,内部异常提示找不到路径C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Management.Automation\v4.0_3.0.0.0__31bf3856ad364e35\System.Management.Automation.dll,但该文件实际存在,报错发生在ps.Invoke()执行阶段。
运行环境
- 操作系统:Windows 11
- 项目目标框架:.NET 4.8
- PowerShell版本:5.1.22621.1778
已尝试操作
重装PowerShell、Visual Studio,替换上述路径下的DLL文件,问题仍未解决。
相关代码片段
PowerShell ps; ps = PowerShell.Create(); ps.AddScript(script: @"import-module ActiveDirectory"); try { ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; ps.Invoke(); } catch (Exception er) { lblStatusMsg5.Visible = true; lblStatusMsg5.Text = "Something went wrong!"; return er.Message.ToString(); ; }
解决方案
1. 检查进程权限
- 确认运行程序的进程(如IIS应用池账户、桌面程序运行账户)拥有读取GAC目标路径的权限,可临时以管理员身份运行程序测试是否为权限问题。
2. 修复GAC程序集缓存
以管理员身份打开命令提示符,执行以下命令:
# 重新注册目标DLL到GAC gacutil /i "C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Management.Automation\v4.0_3.0.0.0__31bf3856ad364e35\System.Management.Automation.dll" # 更新本机映像缓存 ngen.exe update
3. 调整PowerShell初始化逻辑
尝试显式创建运行空间,避免加载上下文冲突:
var runspace = RunspaceFactory.CreateRunspace(); runspace.Open(); PowerShell ps = PowerShell.Create(); ps.Runspace = runspace; ps.AddScript(@"import-module ActiveDirectory"); try { ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; ps.Invoke(); } catch (Exception er) { lblStatusMsg5.Visible = true; lblStatusMsg5.Text = "Something went wrong!"; return er.Message.ToString(); } finally { runspace.Close(); }
4. 排查系统更新影响
- 查看Windows 11在7月5日至21日期间安装的更新,卸载可疑的.NET Framework或PowerShell相关更新,测试功能是否恢复。
- 安装最新的.NET Framework 4.8累积更新,修复组件完整性问题。
5. 启用程序集绑定日志定位根因
- 以管理员身份运行
FUSLOGVW.exe(程序集绑定日志查看器) - 点击「设置」,选择「记录所有绑定失败到磁盘」
- 运行报错程序,查看生成的日志,明确程序集加载失败的具体原因(如版本冲突、依赖缺失)
内容的提问来源于stack exchange,提问作者MadBer85
相关产品推荐
相关产品推荐

