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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 14:34:58