Azure自动化账户Az与AzureRM模块冲突及默认模块卸载求助
我们正尝试将Azure自动化账户从服务主体切换为系统托管标识。修改PowerShell脚本使用系统托管标识后,系统要求升级Az模块,升级完成后出现模块冲突错误。现需解决该冲突,同时彻底卸载自动化账户中默认无法删除的AzureRM模块(已不再使用)。
服务主体代码
try { $servicePrincipalConnection = Get-AutomationConnection -Name $connectionName $null = Connect-AzAccount -ServicePrincipal ` -TenantId $servicePrincipalConnection.TenantId ` -ApplicationId $servicePrincipalConnection.ApplicationId ` -CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint Write-Output "Authenticated with Service principal." } catch { Write-Error -Message $_.Exception throw $_.Exception } try { $smtpPasswordString = Get-AzKeyVaultSecret -VaultName $keyVaultName -Name $smtpPasswordSecretName -AsPlainText -ErrorAction Stop Write-Output "Success retrieving source KeyVault Secrets" } catch { Write-Error -Message $_.Exception Write-Output "Error retrieving source KeyVault Secrets" }
系统托管标识代码
注:已成功完成身份验证,但检索密钥机密时出现模块冲突错误,已将所有Az和AzureRM模块升级至最新版本。
try { $null = Connect-AzAccount -Identity Write-Output "Authenticated with System Identity." } catch { Write-Error -Message $_.Exception throw $_.Exception } try { $smtpPasswordString = Get-AzKeyVaultSecret -VaultName $keyVaultName -Name $smtpPasswordSecretName -AsPlainText -ErrorAction Stop Write-Output "Success retrieving source KeyVault Secrets" } catch { Write-Error -Message $_.Exception Write-Output "Error retrieving source KeyVault Secrets" }
错误信息
错误原因:同一PowerShell会话中同时加载了旧版AzureRM和新版Az模块,二者互不兼容。
具体内部错误:System.TypeLoadException: 程序集'Microsoft.Azure.PowerShell.Clients.ResourceManager, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'中的类型'Microsoft.Azure.Management.Internal.Resources.ResourceManagementClient'的方法'get_SerializationSettings'未实现。
错误堆栈:
在Microsoft.Azure.Commands.ResourceManager.Common.AzureRMCmdlet.BeginProcessing()
在System.Management.Automation.Cmdlet.DoBeginProcessing()
在System.Management.Automation.CommandProcessorBase.DoBegin()
- CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorException
- FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException
解决方案
1. 彻底卸载AzureRM模块(针对自动化账户默认无法删除的情况)
创建并运行专用PowerShell Runbook执行卸载:
# 获取所有已安装的AzureRM模块 $azureRmModules = Get-Module -ListAvailable | Where-Object { $_.Name -match '^AzureRM' } # 逐个卸载模块,强制覆盖冲突 foreach ($module in $azureRmModules) { Uninstall-Module -Name $module.Name -RequiredVersion $module.Version -Force -AllowClobber -ErrorAction SilentlyContinue } # 验证卸载结果 Get-Module -ListAvailable | Where-Object { $_.Name -match '^AzureRM' }
发布该Runbook后,确保在仅加载Az模块的会话中运行(可先暂停所有AzureRM相关Runbook)。
2. 通过Azure CLI强制清理残留模块
若门户手动删除失败,使用Azure CLI命令移除指定AzureRM模块:
az automation module delete --resource-group <你的资源组名称> --automation-account-name <你的自动化账户名称> --name <目标AzureRM模块名>
批量删除可结合循环脚本实现。
3. 避免会话冲突的临时方案
- 拆分Runbook运行时间:将使用Az模块和AzureRM模块的Runbook安排在不同时段执行,避免同一PowerShell会话加载两类模块。
- 隔离自动化账户:创建单独的自动化账户专门运行Az模块的Runbook,彻底分离环境。
4. 验证脚本与模块兼容性
- 确认所有Runbook已完全替换AzureRM命令为Az命令(例如
Get-AzureRM*替换为Get-Az*)。 - 运行Runbook前,在脚本开头添加模块加载验证:
# 检查是否加载了AzureRM模块,若有则抛出错误 if (Get-Module -Name AzureRM -ErrorAction SilentlyContinue) { throw "AzureRM模块已加载,请清理环境后重试" } # 显式加载指定版本的Az模块 Import-Module Az.Accounts -RequiredVersion <你的Az版本号>
内容的提问来源于stack exchange,提问作者NP007

