C#/.NET导入Az.Compute PowerShell模块调用cmdlet加载失败
问题场景
在C#项目中集成PowerShell运行时,需要导入Az.Compute模块调用其提供的Azure虚拟机管理cmdlet,功能始终无法正常运行。
初始实现代码如下:
InitialSessionState iss = InitialSessionState.CreateDefault(); iss.ExecutionPolicy = Microsoft.PowerShell.ExecutionPolicy.Bypass; Console.WriteLine(iss.ExecutionPolicy); //iss.ImportPSModule(new string[] { "Az.Compute" }); iss.ImportPSModulesFromPath(@"C:\Program Files\WindowsPowerShell\Modules\Az.Compute"); Runspace runspace = RunspaceFactory.CreateRunspace(iss); runspace.Open(); PowerShell ps = PowerShell.Create(); ps.Runspace = runspace; Collection<PSObject> servers = ps .AddCommand("Get-AzVM") .Invoke();
运行上述代码执行Get-AzVM时触发如下异常:
System.Management.Automation.CommandNotFoundException: 'The 'Get-AzVM' command was found in the module 'Az.Compute', but the module could not be loaded. For more information, run 'Import-Module Az.Compute'.'
已完成的排查操作:
- 在开发者PowerShell中执行
Get-InstalledModule命令,确认Az.Compute模块已正常安装 - 尝试过指定模块全路径的方式导入,调用模块内cmdlet时仍然抛出上述异常
解决方案
按照以下优先级逐一排查修复:
- 修复运行时与模块版本不匹配问题
代码中指定的模块路径是Windows PowerShell 5.1(基于.NET Framework)的系统模块路径,如果C#项目目标框架为.NET Core/.NET 5+,项目默认依赖的是PowerShell 7+(基于.NET Core)的SDK,两个版本的PowerShell运行时、模块生态不兼容,会出现模块被识别但无法加载的问题。- 修复方式:如果要复用Windows PowerShell下已安装的Az模块,将C#项目目标框架修改为
.NET Framework 4.6.2+,并引用Microsoft.PowerShell.5.1.ReferenceAssembliesNuGet包;如果要保持.NET Core/.NET 5+框架,则在PowerShell 7环境下重新安装Az整套模块,将模块导入路径修改为PowerShell 7的默认模块路径C:\Program Files\PowerShell\7\Modules\。
- 修复方式:如果要复用Windows PowerShell下已安装的Az模块,将C#项目目标框架修改为
- 修复依赖模块未自动加载问题
Az.Compute属于Az模块组的子模块,运行时依赖Az.Accounts等基础模块,直接通过ImportPSModulesFromPath指定Az.Compute单模块文件夹路径时,PowerShell不会自动加载其依赖项,会导致模块加载失败。- 修复方式:注释掉
ImportPSModulesFromPath的调用,改用iss.ImportPSModule(new string[] { "Az.Compute" })方法,让PowerShell自动解析模块位置、加载所有关联依赖;也可以在Runspace打开后先显式执行导入命令,捕获更具体的加载错误:
如果执行上述代码抛出依赖缺失的明确错误,对应安装缺失的Az子模块即可。ps.AddCommand("Import-Module") .AddParameter("Name", "Az.Compute") .AddParameter("Force") .AddParameter("ErrorAction", "Stop") .Invoke();
- 修复方式:注释掉
- 修复模块目录权限问题
Az模块存放在Program Files系统目录下时,如果C#程序的运行身份没有该目录的读取、执行权限,也会出现模块可发现但无法加载的问题。- 修复方式:确认程序运行身份对Az模块所在的整个目录树拥有读取、执行权限;也可以将Az模块安装到当前用户的模块目录
C:\Users\<当前用户名>\Documents\WindowsPowerShell\Modules下,规避系统目录权限限制。
- 修复方式:确认程序运行身份对Az模块所在的整个目录树拥有读取、执行权限;也可以将Az模块安装到当前用户的模块目录
- 修复多版本模块冲突问题
如果系统中安装了多个版本的Az.Compute,PowerShell自动加载时可能选中损坏、或与当前运行时版本不兼容的版本,导致加载失败。- 修复方式:在对应版本的PowerShell中执行
Get-Module -ListAvailable Az.Compute查看所有已安装的版本,卸载多余版本,仅保留兼容的稳定版本,清理完成后重启开发环境重新测试。
- 修复方式:在对应版本的PowerShell中执行
内容的提问来源于stack exchange,提问作者KurtosKalacs
相关产品推荐
相关产品推荐

